@sqrzro/auth 4.0.0-alpha.6 → 4.0.0-alpha.7
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/components/Auth/index.d.ts +5 -1
- package/dist/components/Auth/index.js +5 -5
- package/dist/components/Password/index.d.ts +3 -2
- package/dist/components/Password/index.js +3 -3
- package/dist/forms/LoginForm/index.d.ts +2 -1
- package/dist/forms/LoginForm/index.js +2 -2
- package/dist/forms/PasswordForm/index.d.ts +2 -1
- package/dist/forms/PasswordForm/index.js +1 -1
- package/dist/forms/PasswordResetForm/index.d.ts +3 -2
- package/dist/forms/PasswordResetForm/index.js +1 -1
- package/dist/interfaces.d.ts +3 -0
- package/package.json +2 -2
- package/src/components/Auth/index.tsx +20 -9
- package/src/components/Password/index.tsx +8 -4
- package/src/forms/LoginForm/index.tsx +9 -3
- package/src/forms/PasswordForm/index.tsx +3 -1
- package/src/forms/PasswordResetForm/index.tsx +7 -2
- package/src/interfaces.ts +5 -1
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { NextPageProps } from '@sqrzro/ui/utility';
|
|
2
|
-
|
|
2
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
3
|
+
interface AuthPageProps extends AuthClassNameProps, NextPageProps {
|
|
4
|
+
logo?: React.ReactElement;
|
|
5
|
+
}
|
|
6
|
+
declare function Auth({ classNames, logo, ...props }: AuthPageProps): React.ReactElement;
|
|
3
7
|
export default Auth;
|
|
@@ -3,23 +3,23 @@ import { Suspense } from 'react';
|
|
|
3
3
|
import { notFound } from 'next/navigation';
|
|
4
4
|
import LoginForm from '../../forms/LoginForm';
|
|
5
5
|
import Password from '../Password';
|
|
6
|
-
async function AuthComponent({ params, searchParams }) {
|
|
6
|
+
async function AuthComponent({ classNames, params, searchParams, }) {
|
|
7
7
|
const awaitedParams = await params;
|
|
8
8
|
if (!awaitedParams || !Array.isArray(awaitedParams.auth) || awaitedParams.auth.length !== 1) {
|
|
9
9
|
return notFound();
|
|
10
10
|
}
|
|
11
11
|
if (awaitedParams.auth[0] === 'login') {
|
|
12
|
-
return _jsx(LoginForm, {});
|
|
12
|
+
return _jsx(LoginForm, { classNames: classNames });
|
|
13
13
|
}
|
|
14
14
|
if (awaitedParams.auth[0] === 'mfa') {
|
|
15
15
|
return _jsx("div", { children: "[MFA NOT DONE]" });
|
|
16
16
|
}
|
|
17
17
|
if (awaitedParams.auth[0] === 'password') {
|
|
18
|
-
return _jsx(Password, { searchParams: searchParams });
|
|
18
|
+
return _jsx(Password, { classNames: classNames, searchParams: searchParams });
|
|
19
19
|
}
|
|
20
20
|
return notFound();
|
|
21
21
|
}
|
|
22
|
-
function Auth(props) {
|
|
23
|
-
return (_jsxs("div", { children: ["
|
|
22
|
+
function Auth({ classNames, logo, ...props }) {
|
|
23
|
+
return (_jsxs("div", { className: classNames?.root, children: [_jsx("div", { className: classNames?.logo, children: logo }), _jsx("div", { className: classNames?.panel, children: _jsx(Suspense, { children: _jsx(AuthComponent, { classNames: classNames, ...props }) }) })] }));
|
|
24
24
|
}
|
|
25
25
|
export default Auth;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
2
|
+
interface PasswordProps extends AuthClassNameProps {
|
|
2
3
|
searchParams?: Promise<Record<string, string>> | null;
|
|
3
4
|
}
|
|
4
|
-
declare function Password({ searchParams }: Readonly<PasswordProps>): Promise<React.ReactElement>;
|
|
5
|
+
declare function Password({ classNames, searchParams, }: Readonly<PasswordProps>): Promise<React.ReactElement>;
|
|
5
6
|
export default Password;
|
|
@@ -2,17 +2,17 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { validateReset } from '@sqrzro/server/auth';
|
|
3
3
|
import PasswordForm from '../../forms/PasswordForm';
|
|
4
4
|
import PasswordResetForm from '../../forms/PasswordResetForm';
|
|
5
|
-
async function Password({ searchParams }) {
|
|
5
|
+
async function Password({ classNames, searchParams, }) {
|
|
6
6
|
const awaitedSearchParams = await searchParams;
|
|
7
7
|
if (awaitedSearchParams?.token) {
|
|
8
8
|
const validated = await validateReset('PASSWORD', awaitedSearchParams.token);
|
|
9
9
|
if (validated) {
|
|
10
|
-
return _jsx(PasswordResetForm, { token: awaitedSearchParams.token });
|
|
10
|
+
return _jsx(PasswordResetForm, { token: awaitedSearchParams.token, classNames: classNames });
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
13
13
|
return _jsx("div", { children: "Invalid or Expired Token" });
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
return _jsx(PasswordForm, {});
|
|
16
|
+
return _jsx(PasswordForm, { classNames: classNames });
|
|
17
17
|
}
|
|
18
18
|
export default Password;
|
|
@@ -4,10 +4,10 @@ import { Fragment } from 'react';
|
|
|
4
4
|
import { Link } from '@sqrzro/ui/components';
|
|
5
5
|
import { Form, FormSubmit, PasswordFormField, TextFormField, useForm } from '@sqrzro/ui/forms';
|
|
6
6
|
import submit from './server';
|
|
7
|
-
function LoginForm() {
|
|
7
|
+
function LoginForm({ classNames }) {
|
|
8
8
|
const { fieldProps, formData, formProps } = useForm({
|
|
9
9
|
onSubmit: submit,
|
|
10
10
|
});
|
|
11
|
-
return (
|
|
11
|
+
return (_jsxs(Fragment, { children: [_jsx("h1", { className: classNames?.title, children: "Sign in to continue" }), _jsxs(Form, { ...formProps, children: [_jsx(TextFormField, { ...fieldProps('email'), hasAssistiveError: true }), _jsx(PasswordFormField, { ...fieldProps('password'), hasAssistiveError: true }), _jsx("div", { className: classNames?.actions, children: _jsx(FormSubmit, { isFullWidth: true, children: "Sign In" }) }), _jsx("footer", { className: classNames?.footer, children: _jsx(Link, { className: classNames?.link, href: `/auth/password${formData.email ? `?email=${formData.email}` : ''}`, children: "Forgot Password?" }) })] })] }));
|
|
12
12
|
}
|
|
13
13
|
export default LoginForm;
|
|
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Fragment } from 'react';
|
|
4
4
|
import { Form, FormSubmit, TextFormField, useForm } from '@sqrzro/ui/forms';
|
|
5
5
|
import submit from './server';
|
|
6
|
-
function PasswordForm() {
|
|
6
|
+
function PasswordForm({ classNames }) {
|
|
7
7
|
const { fieldProps, formProps } = useForm({
|
|
8
8
|
onSubmit: submit,
|
|
9
9
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
2
|
+
interface PasswordResetFormProps extends AuthClassNameProps {
|
|
2
3
|
token: string;
|
|
3
4
|
}
|
|
4
|
-
declare function PasswordResetForm({ token }: Readonly<PasswordResetFormProps>): React.ReactElement | null;
|
|
5
|
+
declare function PasswordResetForm({ classNames, token, }: Readonly<PasswordResetFormProps>): React.ReactElement | null;
|
|
5
6
|
export default PasswordResetForm;
|
|
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Fragment } from 'react';
|
|
4
4
|
import { Form, FormSubmit, PasswordFormField, useForm } from '@sqrzro/ui/forms';
|
|
5
5
|
import submit from './server';
|
|
6
|
-
function PasswordResetForm({ token }) {
|
|
6
|
+
function PasswordResetForm({ classNames, token, }) {
|
|
7
7
|
const { fieldProps, formProps } = useForm({
|
|
8
8
|
defaults: { token },
|
|
9
9
|
onSubmit: submit,
|
package/dist/interfaces.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqrzro/auth",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.0.0-alpha.
|
|
4
|
+
"version": "4.0.0-alpha.7",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"zod": "^4.3.6",
|
|
9
|
-
"@sqrzro/server": "^4.0.0-alpha.
|
|
9
|
+
"@sqrzro/server": "^4.0.0-alpha.16",
|
|
10
10
|
"@sqrzro/ui": "^4.0.0-alpha.13"
|
|
11
11
|
},
|
|
12
12
|
"devDependencies": {
|
|
@@ -4,10 +4,19 @@ import type { NextPageProps } from '@sqrzro/ui/utility';
|
|
|
4
4
|
import { notFound } from 'next/navigation';
|
|
5
5
|
|
|
6
6
|
import LoginForm from '../../forms/LoginForm';
|
|
7
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
7
8
|
|
|
8
9
|
import Password from '../Password';
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
interface AuthPageProps extends AuthClassNameProps, NextPageProps {
|
|
12
|
+
logo?: React.ReactElement;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async function AuthComponent({
|
|
16
|
+
classNames,
|
|
17
|
+
params,
|
|
18
|
+
searchParams,
|
|
19
|
+
}: AuthPageProps): Promise<React.ReactElement> {
|
|
11
20
|
const awaitedParams = await params;
|
|
12
21
|
|
|
13
22
|
if (!awaitedParams || !Array.isArray(awaitedParams.auth) || awaitedParams.auth.length !== 1) {
|
|
@@ -15,7 +24,7 @@ async function AuthComponent({ params, searchParams }: NextPageProps): Promise<R
|
|
|
15
24
|
}
|
|
16
25
|
|
|
17
26
|
if (awaitedParams.auth[0] === 'login') {
|
|
18
|
-
return <LoginForm />;
|
|
27
|
+
return <LoginForm classNames={classNames} />;
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
if (awaitedParams.auth[0] === 'mfa') {
|
|
@@ -23,19 +32,21 @@ async function AuthComponent({ params, searchParams }: NextPageProps): Promise<R
|
|
|
23
32
|
}
|
|
24
33
|
|
|
25
34
|
if (awaitedParams.auth[0] === 'password') {
|
|
26
|
-
return <Password searchParams={searchParams} />;
|
|
35
|
+
return <Password classNames={classNames} searchParams={searchParams} />;
|
|
27
36
|
}
|
|
28
37
|
|
|
29
38
|
return notFound();
|
|
30
39
|
}
|
|
31
40
|
|
|
32
|
-
function Auth(props:
|
|
41
|
+
function Auth({ classNames, logo, ...props }: AuthPageProps): React.ReactElement {
|
|
33
42
|
return (
|
|
34
|
-
<div>
|
|
35
|
-
|
|
36
|
-
<
|
|
37
|
-
<
|
|
38
|
-
|
|
43
|
+
<div className={classNames?.root}>
|
|
44
|
+
<div className={classNames?.logo}>{logo}</div>
|
|
45
|
+
<div className={classNames?.panel}>
|
|
46
|
+
<Suspense>
|
|
47
|
+
<AuthComponent classNames={classNames} {...props} />
|
|
48
|
+
</Suspense>
|
|
49
|
+
</div>
|
|
39
50
|
</div>
|
|
40
51
|
);
|
|
41
52
|
}
|
|
@@ -2,25 +2,29 @@ import { validateReset } from '@sqrzro/server/auth';
|
|
|
2
2
|
|
|
3
3
|
import PasswordForm from '../../forms/PasswordForm';
|
|
4
4
|
import PasswordResetForm from '../../forms/PasswordResetForm';
|
|
5
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
5
6
|
|
|
6
|
-
interface PasswordProps {
|
|
7
|
+
interface PasswordProps extends AuthClassNameProps {
|
|
7
8
|
searchParams?: Promise<Record<string, string>> | null;
|
|
8
9
|
}
|
|
9
10
|
|
|
10
|
-
async function Password({
|
|
11
|
+
async function Password({
|
|
12
|
+
classNames,
|
|
13
|
+
searchParams,
|
|
14
|
+
}: Readonly<PasswordProps>): Promise<React.ReactElement> {
|
|
11
15
|
const awaitedSearchParams = await searchParams;
|
|
12
16
|
|
|
13
17
|
if (awaitedSearchParams?.token) {
|
|
14
18
|
const validated = await validateReset('PASSWORD', awaitedSearchParams.token);
|
|
15
19
|
|
|
16
20
|
if (validated) {
|
|
17
|
-
return <PasswordResetForm token={awaitedSearchParams.token} />;
|
|
21
|
+
return <PasswordResetForm token={awaitedSearchParams.token} classNames={classNames} />;
|
|
18
22
|
} else {
|
|
19
23
|
return <div>Invalid or Expired Token</div>;
|
|
20
24
|
}
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
return <PasswordForm />;
|
|
27
|
+
return <PasswordForm classNames={classNames} />;
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
export default Password;
|
|
@@ -5,21 +5,27 @@ import { Fragment } from 'react';
|
|
|
5
5
|
import { Link } from '@sqrzro/ui/components';
|
|
6
6
|
import { Form, FormSubmit, PasswordFormField, TextFormField, useForm } from '@sqrzro/ui/forms';
|
|
7
7
|
|
|
8
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
9
|
+
|
|
8
10
|
import submit from './server';
|
|
9
11
|
|
|
10
|
-
function LoginForm(): React.ReactElement | null {
|
|
12
|
+
function LoginForm({ classNames }: AuthClassNameProps): React.ReactElement | null {
|
|
11
13
|
const { fieldProps, formData, formProps } = useForm({
|
|
12
14
|
onSubmit: submit,
|
|
13
15
|
});
|
|
14
16
|
|
|
15
17
|
return (
|
|
16
18
|
<Fragment>
|
|
19
|
+
<h1 className={classNames?.title}>Sign in to continue</h1>
|
|
17
20
|
<Form {...formProps}>
|
|
18
21
|
<TextFormField {...fieldProps('email')} hasAssistiveError />
|
|
19
22
|
<PasswordFormField {...fieldProps('password')} hasAssistiveError />
|
|
20
|
-
<
|
|
21
|
-
|
|
23
|
+
<div className={classNames?.actions}>
|
|
24
|
+
<FormSubmit isFullWidth>Sign In</FormSubmit>
|
|
25
|
+
</div>
|
|
26
|
+
<footer className={classNames?.footer}>
|
|
22
27
|
<Link
|
|
28
|
+
className={classNames?.link}
|
|
23
29
|
href={`/auth/password${formData.email ? `?email=${formData.email}` : ''}`}
|
|
24
30
|
>
|
|
25
31
|
Forgot Password?
|
|
@@ -4,9 +4,11 @@ import { Fragment } from 'react';
|
|
|
4
4
|
|
|
5
5
|
import { Form, FormSubmit, TextFormField, useForm } from '@sqrzro/ui/forms';
|
|
6
6
|
|
|
7
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
8
|
+
|
|
7
9
|
import submit from './server';
|
|
8
10
|
|
|
9
|
-
function PasswordForm(): React.ReactElement | null {
|
|
11
|
+
function PasswordForm({ classNames }: AuthClassNameProps): React.ReactElement | null {
|
|
10
12
|
const { fieldProps, formProps } = useForm({
|
|
11
13
|
onSubmit: submit,
|
|
12
14
|
});
|
|
@@ -4,13 +4,18 @@ import { Fragment } from 'react';
|
|
|
4
4
|
|
|
5
5
|
import { Form, FormSubmit, PasswordFormField, useForm } from '@sqrzro/ui/forms';
|
|
6
6
|
|
|
7
|
+
import type { AuthClassNameProps } from '../../interfaces';
|
|
8
|
+
|
|
7
9
|
import submit from './server';
|
|
8
10
|
|
|
9
|
-
interface PasswordResetFormProps {
|
|
11
|
+
interface PasswordResetFormProps extends AuthClassNameProps {
|
|
10
12
|
token: string;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
|
-
function PasswordResetForm({
|
|
15
|
+
function PasswordResetForm({
|
|
16
|
+
classNames,
|
|
17
|
+
token,
|
|
18
|
+
}: Readonly<PasswordResetFormProps>): React.ReactElement | null {
|
|
14
19
|
const { fieldProps, formProps } = useForm({
|
|
15
20
|
defaults: { token },
|
|
16
21
|
onSubmit: submit,
|