@yimingliao/cms 0.0.89 → 0.0.90

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.
@@ -1,16 +1,15 @@
1
- import { T as TocItem, i as AdminRole, y as SingleItem, B as BaseTranslation, e as Admin, g as AdminFull, j as AdminSafe, D as DeviceInfo, h as AdminRefreshToken, p as File, b as FileFull, r as FileType, a as Folder, F as FolderFull, M as MultiItems, m as ExternalLink, o as Faq, t as Post, w as PostType, u as PostListCard, v as PostTranslation, P as PostFull, l as Alternate, S as SuccessResult, R as Result } from './types-BGsFazJr.js';
2
- import * as zod from 'zod';
3
- import zod__default, { z, ZodType } from 'zod';
4
- import * as zod_v4_core from 'zod/v4/core';
5
1
  import { S as StorageService } from './types-J25u1G6t.js';
2
+ import { T as TocItem, i as AdminRole, y as SingleItem, B as BaseTranslation, e as Admin, g as AdminFull, j as AdminSafe, D as DeviceInfo, h as AdminRefreshToken, p as File, b as FileFull, r as FileType, a as Folder, F as FolderFull, M as MultiItems, m as ExternalLink, o as Faq, t as Post, w as PostType, u as PostListCard, v as PostTranslation, P as PostFull, l as Alternate, S as SuccessResult, R as Result } from './types-BGsFazJr.js';
6
3
  import jwt from 'jsonwebtoken';
7
4
  import { BinaryLike } from 'node:crypto';
8
5
  import { cookies } from 'next/headers';
9
6
  import { PrismaClient } from '@prisma/client';
7
+ import zod__default, { z, ZodType } from 'zod';
10
8
  import { Transporter, SentMessageInfo } from 'nodemailer';
11
9
  import { Logger } from 'logry';
12
10
  import { BaseTranslator, LocaleMessages } from 'intor';
13
11
  import Keyv from 'keyv';
12
+ import * as zod_v4_core from 'zod/v4/core';
14
13
 
15
14
  interface CreateJwtServiceParams {
16
15
  defaultSecret: string;
@@ -856,21 +855,4 @@ interface ActionContext {
856
855
  };
857
856
  }
858
857
 
859
- declare const signInValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
860
- email: zod.ZodEmail;
861
- password: zod.ZodString;
862
- }, zod_v4_core.$strip>;
863
-
864
- type SignInFormData = zod__default.infer<ReturnType<typeof signInValidator>>;
865
- declare function createSignInAction(ctx: ActionContext): ({ formData, deviceInfo, }: {
866
- formData: SignInFormData;
867
- deviceInfo: DeviceInfo;
868
- }) => Promise<Result<{
869
- admin: AdminFull;
870
- }>>;
871
-
872
- declare function createVerifyAction(ctx: ActionContext): () => Promise<Result<{
873
- admin: AdminFull;
874
- }>>;
875
-
876
- export { type ActionContext as A, createPostQueryRepository as B, createRenderEmailTemplate as C, createSendEmail as D, createSeoMetadataCommandRepository as E, createUnique as F, createVerifyAccessToken as G, createVerifyRefreshToken as H, normalizeCacheKey as I, type RawCacheKey as R, type SignInFormData as S, createSignInAction as a, createZod as b, createVerifyAction as c, createSchemas as d, createTocItemSchema as e, createAdminCommandRepository as f, createAdminQueryRepository as g, createAdminRefreshTokenCommandRepository as h, createAdminRefreshTokenQueryRepository as i, createArgon2Service as j, createAuthMiddleware as k, createAuthUseCases as l, createCacheResult as m, createCookieService as n, createCryptoService as o, createEmailVerificationEmail as p, createExecuteAction as q, createExist as r, createFileCommandRepository as s, createFileQueryRepository as t, createFolderCommandRepository as u, createFolderQueryRepository as v, createForgotPasswordEmail as w, createIpRateLimiter as x, createJwtService as y, createPostCommandRepository as z };
858
+ export { type ActionContext as A, createSendEmail as B, createSeoMetadataCommandRepository as C, createUnique as D, createVerifyAccessToken as E, createVerifyRefreshToken as F, normalizeCacheKey as G, type RawCacheKey as R, createZod as a, createTocItemSchema as b, createSchemas as c, createAdminCommandRepository as d, createAdminQueryRepository as e, createAdminRefreshTokenCommandRepository as f, createAdminRefreshTokenQueryRepository as g, createArgon2Service as h, createAuthMiddleware as i, createAuthUseCases as j, createCacheResult as k, createCookieService as l, createCryptoService as m, createEmailVerificationEmail as n, createExecuteAction as o, createExist as p, createFileCommandRepository as q, createFileQueryRepository as r, createFolderCommandRepository as s, createFolderQueryRepository as t, createForgotPasswordEmail as u, createIpRateLimiter as v, createJwtService as w, createPostCommandRepository as x, createPostQueryRepository as y, createRenderEmailTemplate as z };
@@ -1,6 +1,6 @@
1
1
  import { clsx } from 'clsx';
2
2
  import { twMerge } from 'tailwind-merge';
3
- import { useState, useEffect } from 'react';
3
+ import { useState, useRef, useCallback, useEffect } from 'react';
4
4
  import { UAParser } from 'ua-parser-js';
5
5
  import { Slot } from '@radix-ui/react-slot';
6
6
  import { cva } from 'class-variance-authority';
@@ -12,6 +12,36 @@ import * as LabelPrimitive from '@radix-ui/react-label';
12
12
  var cn = (...inputs) => {
13
13
  return twMerge(clsx(inputs));
14
14
  };
15
+ var useCountdown = (initialTime) => {
16
+ const [timeLeft, setTimeLeft] = useState(initialTime);
17
+ const [isCounting, setIsCounting] = useState(false);
18
+ const intervalRef = useRef(null);
19
+ const startCountdown = useCallback(() => {
20
+ setTimeLeft(initialTime);
21
+ setIsCounting(true);
22
+ }, [initialTime]);
23
+ useEffect(() => {
24
+ if (!isCounting) return;
25
+ intervalRef.current = setInterval(() => {
26
+ setTimeLeft((prev) => {
27
+ if (prev <= 1) {
28
+ clearInterval(intervalRef.current);
29
+ intervalRef.current = null;
30
+ setIsCounting(false);
31
+ return 0;
32
+ }
33
+ return prev - 1;
34
+ });
35
+ }, 1e3);
36
+ return () => {
37
+ if (intervalRef.current) {
38
+ clearInterval(intervalRef.current);
39
+ intervalRef.current = null;
40
+ }
41
+ };
42
+ }, [isCounting]);
43
+ return { timeLeft, isCounting, startCountdown };
44
+ };
15
45
  function useDeviceInfo() {
16
46
  const [deviceInfo, setDeviceInfo] = useState(null);
17
47
  useEffect(() => {
@@ -355,4 +385,4 @@ function Label({ className, ...props }) {
355
385
  );
356
386
  }
357
387
 
358
- export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, Spinner, Textarea, cn, useDeviceInfo };
388
+ export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, Spinner, Textarea, cn, useCountdown, useDeviceInfo };
@@ -1,17 +1,18 @@
1
- import { z as Translation, R as Result, S as SuccessResult, d as ErrorResult, g as AdminFull, D as DeviceInfo } from '../types-BGsFazJr.js';
1
+ import { z as Translation, R as Result, S as SuccessResult, d as ErrorResult, g as AdminFull, D as DeviceInfo, j as AdminSafe } from '../types-BGsFazJr.js';
2
2
  import { Logger } from 'logry';
3
3
  import * as _tanstack_react_query from '@tanstack/react-query';
4
4
  import { QueryClient, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
5
5
  import * as _tanstack_query_core from '@tanstack/query-core';
6
6
  import * as react_jsx_runtime from 'react/jsx-runtime';
7
- import { c as createVerifyAction, a as createSignInAction } from '../create-verify-action-lojNGPwl.js';
7
+ import { c as createSchemas, A as ActionContext } from '../action-context-yvi5OrMJ.js';
8
8
  import * as React$1 from 'react';
9
9
  import { ComponentProps, ReactNode, HTMLAttributes } from 'react';
10
10
  import { L as LabelProps, B as ButtonProps$1 } from '../label-BF4qxS03.js';
11
11
  import { LucideIcon } from 'lucide-react';
12
+ import * as zod from 'zod';
13
+ import zod__default from 'zod';
14
+ import * as zod_v4_core from 'zod/v4/core';
12
15
  import { ClassValue } from 'clsx';
13
- import 'zod';
14
- import 'zod/v4/core';
15
16
  import '../types-J25u1G6t.js';
16
17
  import '../types-0oS1A2K5.js';
17
18
  import 'jsonwebtoken';
@@ -343,6 +344,75 @@ declare function AdminProvider({ children }: {
343
344
  }): react_jsx_runtime.JSX.Element;
344
345
  declare function useAdmin(): AdminContextValue;
345
346
 
347
+ declare const signInValidator: (schemas: ReturnType<typeof createSchemas>) => zod__default.ZodObject<{
348
+ email: zod__default.ZodEmail;
349
+ password: zod__default.ZodString;
350
+ }, zod__default.core.$strip>;
351
+
352
+ type SignInFormData = zod__default.infer<ReturnType<typeof signInValidator>>;
353
+ declare function createSignInAction(ctx: ActionContext): ({ formData, deviceInfo, }: {
354
+ formData: SignInFormData;
355
+ deviceInfo: DeviceInfo;
356
+ }) => Promise<Result<{
357
+ admin: AdminFull;
358
+ }>>;
359
+
360
+ declare function createVerifyAction(ctx: ActionContext): () => Promise<Result<{
361
+ admin: AdminFull;
362
+ }>>;
363
+
364
+ declare const changePasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
365
+ password: zod.ZodString;
366
+ newPassword: zod.ZodString;
367
+ newPasswordConfirm: zod.ZodString;
368
+ }, zod_v4_core.$strip>;
369
+
370
+ type ChangePasswordFormData = zod__default.infer<ReturnType<typeof changePasswordValidator>>;
371
+ declare function createChangePasswordAction(ctx: ActionContext): ({ formData, }: {
372
+ formData: ChangePasswordFormData;
373
+ }) => Promise<Result<void>>;
374
+
375
+ declare const verifyEmailValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
376
+ email: zod.ZodEmail;
377
+ emailVerificationToken: zod.ZodString;
378
+ }, zod_v4_core.$strip>;
379
+
380
+ type VerifyEmailFormData = zod__default.infer<ReturnType<typeof verifyEmailValidator>>;
381
+ declare function createVerifyEmailAction(ctx: ActionContext): ({ formData, }: {
382
+ formData: VerifyEmailFormData;
383
+ }) => Promise<Result<{
384
+ admin: AdminSafe;
385
+ }>>;
386
+
387
+ declare const emailUnverifiedValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
388
+ email: zod.ZodEmail;
389
+ }, zod_v4_core.$strip>;
390
+
391
+ type EmailUnverifiedFormData = zod__default.infer<ReturnType<typeof emailUnverifiedValidator>>;
392
+ declare function createEmailUnverifiedAction(ctx: ActionContext): ({ formData, }: {
393
+ formData: EmailUnverifiedFormData;
394
+ }) => Promise<Result<void>>;
395
+
396
+ declare const forgetPasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
397
+ email: zod.ZodEmail;
398
+ }, zod_v4_core.$strip>;
399
+
400
+ type ForgotPasswordFormData = zod__default.infer<ReturnType<typeof forgetPasswordValidator>>;
401
+ declare function createForgotPasswordAction(ctx: ActionContext): ({ formData, }: {
402
+ formData: ForgotPasswordFormData;
403
+ }) => Promise<Result<void>>;
404
+
405
+ declare const resetPasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
406
+ passwordResetToken: zod.ZodString;
407
+ newPassword: zod.ZodString;
408
+ newPasswordConfirm: zod.ZodString;
409
+ }, zod_v4_core.$strip>;
410
+
411
+ type ResetPasswordFormData = zod__default.infer<ReturnType<typeof resetPasswordValidator>>;
412
+ declare function createResetPasswordAction(ctx: ActionContext): ({ formData, }: {
413
+ formData: ResetPasswordFormData;
414
+ }) => Promise<Result<void>>;
415
+
346
416
  declare function createAdminInitializer({ useAdmin, useQuery, verifyAction, }: {
347
417
  useAdmin: () => AdminContextValue;
348
418
  useQuery: ReturnType<typeof createUseQuery>;
@@ -392,8 +462,68 @@ declare function createSignInPage({ useCommand, signInAction, }: {
392
462
  signInAction: ReturnType<typeof createSignInAction>;
393
463
  }): () => react_jsx_runtime.JSX.Element;
394
464
 
465
+ /**
466
+ * [Auth] verify email
467
+ *
468
+ * http://localhost:3000/cms/verify-email
469
+ *
470
+ * src/app/cms/(auth)/verify-email/page.tsx
471
+ */
472
+ declare function createVerifyEmailPage({ useCommand, verifyEmailAction, }: {
473
+ useCommand: ReturnType<typeof createUseCommand>;
474
+ verifyEmailAction: ReturnType<typeof createVerifyEmailAction>;
475
+ }): () => react_jsx_runtime.JSX.Element;
476
+
477
+ /**
478
+ * [Auth] email unverified
479
+ *
480
+ * http://localhost:3000/cms/email-unverified
481
+ *
482
+ * src/app/cms/(auth)/email-unverified/page.tsx
483
+ */
484
+ declare function createEmailUnverifiedPage({ useCommand, emailUnverifiedAction, }: {
485
+ useCommand: ReturnType<typeof createUseCommand>;
486
+ emailUnverifiedAction: ReturnType<typeof createEmailUnverifiedAction>;
487
+ }): () => react_jsx_runtime.JSX.Element;
488
+
489
+ /**
490
+ * [Auth] forgot-password
491
+ *
492
+ * http://localhost:3000/cms/forgot-password
493
+ *
494
+ * src/app/cms/(auth)/forgot-password/page.tsx
495
+ */
496
+ declare function createForgotPasswordPage({ useCommand, forgotPasswordAction, }: {
497
+ useCommand: ReturnType<typeof createUseCommand>;
498
+ forgotPasswordAction: ReturnType<typeof createForgotPasswordAction>;
499
+ }): () => react_jsx_runtime.JSX.Element;
500
+
501
+ /**
502
+ * [Auth] reset-password
503
+ *
504
+ * http://localhost:3000/cms/reset-password
505
+ *
506
+ * src/app/cms/(auth)/reset-password/page.tsx
507
+ */
508
+ declare function createResetPasswordPage({ useCommand, resetPasswordAction, }: {
509
+ useCommand: ReturnType<typeof createUseCommand>;
510
+ resetPasswordAction: ReturnType<typeof createResetPasswordAction>;
511
+ }): () => react_jsx_runtime.JSX.Element;
512
+
513
+ /**
514
+ * [Auth] change-password
515
+ *
516
+ * http://localhost:3000/cms/dashboard/change-password
517
+ *
518
+ * src/app/cms/dashboard/(auth)/change-password/page.tsx
519
+ */
520
+ declare function createChangePasswordPage({ useCommand, changePasswordAction, }: {
521
+ useCommand: ReturnType<typeof createUseCommand>;
522
+ changePasswordAction: ReturnType<typeof createChangePasswordAction>;
523
+ }): () => react_jsx_runtime.JSX.Element;
524
+
395
525
  declare const cn: (...inputs: ClassValue[]) => string;
396
526
 
397
527
  declare function useDeviceInfo(): DeviceInfo | null;
398
528
 
399
- export { AdminProvider, Button, type ButtonProps, Field, FieldBody, Form, Input, type InputProps, PasswordInput, type ShowToastOption, cn, createAdminInitializer, createRequestInterceptor, createResponseInterceptor, createSignInPage, createSmartFetch, createUseCommand, createUseQuery, handleToast, useAdmin, useDeviceInfo };
529
+ export { AdminProvider, Button, type ButtonProps, Field, FieldBody, Form, Input, type InputProps, PasswordInput, type ShowToastOption, cn, createAdminInitializer, createChangePasswordPage, createEmailUnverifiedPage, createForgotPasswordPage, createRequestInterceptor, createResetPasswordPage, createResponseInterceptor, createSignInPage, createSmartFetch, createUseCommand, createUseQuery, createVerifyEmailPage, handleToast, useAdmin, useDeviceInfo };
@@ -1,14 +1,13 @@
1
- import { cn, Label, Spinner, Button, InputGroup, InputGroupAddon, InputGroupInput, InputGroupButton, useDeviceInfo, Card, CardHeader, CardTitle, CardContent } from '../chunk-OQGJBZXQ.js';
2
- export { cn, useDeviceInfo } from '../chunk-OQGJBZXQ.js';
1
+ import { cn, Label, Spinner, Button, InputGroup, InputGroupAddon, InputGroupInput, InputGroupButton, useDeviceInfo, Card, CardHeader, CardTitle, CardContent, useCountdown, CardDescription } from '../chunk-BVWT2DIB.js';
2
+ export { cn, useDeviceInfo } from '../chunk-BVWT2DIB.js';
3
3
  import { ensureArray } from '../chunk-OAENV763.js';
4
4
  import { toast } from 'sonner';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { useMutation, useQuery } from '@tanstack/react-query';
7
- import * as React from 'react';
8
- import { createContext, useState, useContext, useEffect } from 'react';
9
- import { Asterisk, Eye, EyeOff } from 'lucide-react';
7
+ import { createContext, useState, useContext, useEffect, createElement } from 'react';
8
+ import { Asterisk, Eye, EyeOff, Mail } from 'lucide-react';
10
9
  import { useTranslator } from 'intor/react';
11
- import { useRouter } from 'next/navigation';
10
+ import { useRouter, useSearchParams } from 'next/navigation';
12
11
  import Link from 'next/link';
13
12
 
14
13
  // src/client/infrastructure/fetch/smart-fetch.ts
@@ -266,7 +265,7 @@ function Field({
266
265
  /* @__PURE__ */ jsxs(Label, { className: "flex gap-1 truncate", ...props, children: [
267
266
  label,
268
267
  isRequired && /* @__PURE__ */ jsx(Asterisk, { className: "text-destructive size-3" }),
269
- hint && /* @__PURE__ */ jsx("span", { className: "ml-2 text-xs text-muted-foreground", children: hint })
268
+ hint && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground ml-2 text-xs", children: hint })
270
269
  ] }),
271
270
  /* @__PURE__ */ jsx("span", { children: labelChildren })
272
271
  ] }),
@@ -356,7 +355,7 @@ function Button2({
356
355
  onClick: props.onClick ?? handleClick,
357
356
  ...props,
358
357
  children: isLoading ? /* @__PURE__ */ jsx(Spinner, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
359
- icon && React.createElement(icon),
358
+ icon && createElement(icon),
360
359
  children
361
360
  ] })
362
361
  }
@@ -406,29 +405,62 @@ function PasswordInput({ ...props }) {
406
405
 
407
406
  // src/constants/keys/auth.ts
408
407
  var AUTH_KEYS = {
408
+ signIn: { key: "sign-in" },
409
409
  forgotPassword: { key: "forgot-password" }};
410
410
 
411
+ // src/constants/keys/main.ts
412
+ var MAIN_KEYS = {
413
+ dashboard: { key: "dashboard" },
414
+ cmsSettings: { key: "cms-settings" }};
415
+
416
+ // src/constants/keys/resources.ts
417
+ var RESOURCES_KEYS = {
418
+ admin: { key: "admin" }};
419
+
411
420
  // src/constants/keys/index.ts
412
421
  var KEYS = {
413
- auth: AUTH_KEYS};
422
+ main: MAIN_KEYS,
423
+ auth: AUTH_KEYS,
424
+ resources: RESOURCES_KEYS};
414
425
 
415
426
  // src/constants/paths/cms-path.ts
416
427
  var CMS_PATH = "/cms";
417
428
 
429
+ // src/constants/paths/main.ts
430
+ var MAIN_PATHS = {
431
+ dashboard: {
432
+ path: `${CMS_PATH}/${KEYS.main.dashboard.key}`
433
+ },
434
+ cmsSettings: {
435
+ path: `${CMS_PATH}/${KEYS.main.dashboard.key}/${KEYS.main.cmsSettings.key}`
436
+ }};
437
+
418
438
  // src/constants/paths/auth.ts
419
439
  var AUTH_PATHS = {
440
+ signIn: {
441
+ path: `${CMS_PATH}/${KEYS.auth.signIn.key}`
442
+ },
420
443
  forgotPassword: {
421
444
  path: `${CMS_PATH}/${KEYS.auth.forgotPassword.key}`
422
445
  }};
423
446
 
447
+ // src/constants/paths/resources.ts
448
+ var RESOURCES_PATHS = {
449
+ admin: {
450
+ path: `${MAIN_PATHS.cmsSettings.path}/${KEYS.resources.admin.key}`
451
+ }};
452
+
424
453
  // src/constants/paths/index.ts
425
454
  var PATHS = {
426
- auth: AUTH_PATHS};
455
+ main: MAIN_PATHS,
456
+ auth: AUTH_PATHS,
457
+ resources: RESOURCES_PATHS
458
+ };
427
459
  function createSignInPage({
428
460
  useCommand,
429
461
  signInAction
430
462
  }) {
431
- return function CmsSignInPage() {
463
+ return function SignInPage() {
432
464
  const { t } = useTranslator();
433
465
  const { setAdmin } = useAdmin();
434
466
  const deviceInfo = useDeviceInfo();
@@ -487,5 +519,324 @@ function createSignInPage({
487
519
  ] }) });
488
520
  };
489
521
  }
522
+ function createVerifyEmailPage({
523
+ useCommand,
524
+ verifyEmailAction
525
+ }) {
526
+ return function VerifyEmailPage() {
527
+ const router = useRouter();
528
+ const searchParams = useSearchParams();
529
+ const email = searchParams.get("email") ?? "";
530
+ const emailVerificationToken = searchParams.get("emailVerificationToken") ?? "";
531
+ const { execute } = useCommand(
532
+ () => verifyEmailAction({ formData: { email, emailVerificationToken } }),
533
+ {
534
+ onSuccess: (data) => router.push(`${PATHS.resources.admin.path}/${data?.admin.id}`),
535
+ onError: () => router.push(PATHS.auth.signIn.path)
536
+ }
537
+ );
538
+ useEffect(() => {
539
+ void (async () => {
540
+ if (email && emailVerificationToken) {
541
+ await execute();
542
+ } else {
543
+ router.push(PATHS.auth.signIn.path);
544
+ }
545
+ })();
546
+ }, [email, emailVerificationToken]);
547
+ return /* @__PURE__ */ jsx("div", { className: "flex-center relative flex-1 flex-col", children: /* @__PURE__ */ jsx(Spinner, { className: "size-10" }) });
548
+ };
549
+ }
550
+ function createEmailUnverifiedPage({
551
+ useCommand,
552
+ emailUnverifiedAction
553
+ }) {
554
+ return function EmailUnverifiedPage() {
555
+ const { t } = useTranslator();
556
+ const router = useRouter();
557
+ const { admin, isLoading } = useAdmin();
558
+ const { timeLeft, isCounting, startCountdown } = useCountdown(30);
559
+ useEffect(() => {
560
+ if (!admin && !isLoading) {
561
+ router.replace(PATHS.auth.signIn.path);
562
+ }
563
+ if (admin?.emailVerifiedAt) {
564
+ router.replace(PATHS.main.dashboard.path);
565
+ }
566
+ }, [admin, isLoading, router]);
567
+ const { execute, isPending } = useCommand(
568
+ () => emailUnverifiedAction({ formData: { email: admin?.email ?? "" } }),
569
+ { onSuccess: () => startCountdown() }
570
+ );
571
+ const buttonText = !isCounting ? t("auth.email-unverified.button.send-email.text") : /* @__PURE__ */ jsxs("span", { children: [
572
+ t("auth.email-unverified.button.please-wait.text"),
573
+ /* @__PURE__ */ jsx("span", { className: "ml-1 inline-block w-5 text-end", children: timeLeft }),
574
+ "\xA0",
575
+ t("auth.email-unverified.button.second.text"),
576
+ "\xA0",
577
+ t("auth.email-unverified.button.send-again.text")
578
+ ] });
579
+ return /* @__PURE__ */ jsx(Form, { className: "mx-auto mt-20 w-96", onSubmit: () => void execute(), children: /* @__PURE__ */ jsxs(Card, { children: [
580
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "mx-auto", children: t("auth.email-unverified.text") }) }),
581
+ /* @__PURE__ */ jsxs(CardContent, { className: "relative flex flex-col gap-6", children: [
582
+ /* @__PURE__ */ jsxs(InputGroup, { children: [
583
+ /* @__PURE__ */ jsx(InputGroupAddon, { children: /* @__PURE__ */ jsx(Label, { htmlFor: "email", className: "text-foreground", children: /* @__PURE__ */ jsx(Mail, { className: "size-4" }) }) }),
584
+ isLoading ? /* @__PURE__ */ jsx("div", { className: "px-2", children: /* @__PURE__ */ jsx(Spinner, {}) }) : /* @__PURE__ */ jsx(
585
+ InputGroupInput,
586
+ {
587
+ id: "email",
588
+ placeholder: "shadcn@vercel.com",
589
+ disabled: true,
590
+ value: admin?.email
591
+ }
592
+ )
593
+ ] }),
594
+ /* @__PURE__ */ jsx(CardDescription, { children: /* @__PURE__ */ jsx("p", { className: "text-sm whitespace-pre-line", children: t("auth.email-unverified.notice.text") }) }),
595
+ /* @__PURE__ */ jsx(
596
+ Button2,
597
+ {
598
+ type: "submit",
599
+ isLoading: isLoading || isPending,
600
+ isDisabled: isCounting,
601
+ children: buttonText
602
+ }
603
+ )
604
+ ] })
605
+ ] }) });
606
+ };
607
+ }
608
+ function createForgotPasswordPage({
609
+ useCommand,
610
+ forgotPasswordAction
611
+ }) {
612
+ return function ForgotPasswordPage() {
613
+ const { t } = useTranslator();
614
+ const { timeLeft, isCounting, startCountdown } = useCountdown(30);
615
+ const [formData, setFormData] = useState({
616
+ email: ""
617
+ });
618
+ const { execute, isPending, errors } = useCommand(
619
+ () => forgotPasswordAction({ formData: { email: formData.email } }),
620
+ { onSuccess: () => startCountdown() }
621
+ );
622
+ const buttonText = !isCounting ? t("auth.forgot-password.button.send-email.text") : /* @__PURE__ */ jsxs("span", { children: [
623
+ t("auth.forgot-password.button.please-wait.text"),
624
+ /* @__PURE__ */ jsx("span", { className: "ml-1 inline-block w-5 text-end", children: timeLeft }),
625
+ "\xA0",
626
+ t("auth.forgot-password.button.second.text"),
627
+ "\xA0",
628
+ t("auth.forgot-password.button.send-again.text")
629
+ ] });
630
+ return /* @__PURE__ */ jsx(Form, { className: "mx-auto mt-20 w-96", onSubmit: () => void execute(), children: /* @__PURE__ */ jsxs(Card, { children: [
631
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "mx-auto", children: t("auth.forgot-password.text") }) }),
632
+ /* @__PURE__ */ jsxs(CardContent, { className: "relative flex flex-col gap-6", children: [
633
+ /* @__PURE__ */ jsx(Field, { htmlFor: "email", label: t("auth.forgot-password.email.text"), children: /* @__PURE__ */ jsx(
634
+ Input,
635
+ {
636
+ id: "email",
637
+ placeholder: t("auth.forgot-password.email.placeholder.text"),
638
+ autoComplete: "email",
639
+ fieldName: "email",
640
+ value: formData.email,
641
+ setFormData,
642
+ isDisabled: isPending || isCounting,
643
+ isError: errors.includes("email")
644
+ }
645
+ ) }),
646
+ /* @__PURE__ */ jsx(
647
+ Button2,
648
+ {
649
+ size: "xs",
650
+ variant: "link",
651
+ className: "w-fit",
652
+ isDisabled: isPending,
653
+ children: /* @__PURE__ */ jsx(Link, { href: PATHS.auth.signIn.path, children: t("auth.forgot-password.anchor.text") })
654
+ }
655
+ ),
656
+ /* @__PURE__ */ jsx(Button2, { type: "submit", isLoading: isPending, isDisabled: isCounting, children: buttonText })
657
+ ] })
658
+ ] }) });
659
+ };
660
+ }
661
+ function createResetPasswordPage({
662
+ useCommand,
663
+ resetPasswordAction
664
+ }) {
665
+ return function ResetPasswordPage() {
666
+ const { t } = useTranslator();
667
+ const router = useRouter();
668
+ const passwordResetToken = useSearchParams().get("passwordResetToken") ?? "";
669
+ const [formData, setFormData] = useState({
670
+ newPassword: "",
671
+ newPasswordConfirm: ""
672
+ });
673
+ const { execute, isRedirecting, errors } = useCommand(
674
+ () => resetPasswordAction({ formData: { passwordResetToken, ...formData } }),
675
+ { onSuccess: () => router.push(PATHS.auth.signIn.path) }
676
+ );
677
+ return /* @__PURE__ */ jsx(Form, { className: "mx-auto mt-20 w-96", onSubmit: () => void execute(), children: /* @__PURE__ */ jsxs(Card, { children: [
678
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "mx-auto", children: t("auth.reset-password.text") }) }),
679
+ /* @__PURE__ */ jsxs(CardContent, { className: "relative flex flex-col gap-6", children: [
680
+ /* @__PURE__ */ jsx(
681
+ Field,
682
+ {
683
+ htmlFor: "newPassword",
684
+ label: t("auth.reset-password.new-password.text"),
685
+ children: /* @__PURE__ */ jsx(
686
+ PasswordInput,
687
+ {
688
+ id: "newPassword",
689
+ placeholder: t(
690
+ "auth.reset-password.new-password.placeholder.text"
691
+ ),
692
+ fieldName: "newPassword",
693
+ value: formData.newPassword,
694
+ setFormData,
695
+ isDisabled: isRedirecting,
696
+ isError: errors.includes("newPassword")
697
+ }
698
+ )
699
+ }
700
+ ),
701
+ /* @__PURE__ */ jsx(
702
+ Field,
703
+ {
704
+ htmlFor: "newPasswordConfirm",
705
+ label: t("auth.reset-password.new-password-confirm.text"),
706
+ children: /* @__PURE__ */ jsx(
707
+ PasswordInput,
708
+ {
709
+ id: "newPasswordConfirm",
710
+ placeholder: t(
711
+ `auth.reset-password.new-password-confirm.placeholder.text`
712
+ ),
713
+ fieldName: "newPasswordConfirm",
714
+ value: formData.newPasswordConfirm,
715
+ setFormData,
716
+ isDisabled: isRedirecting,
717
+ isError: errors.includes("newPasswordConfirm")
718
+ }
719
+ )
720
+ }
721
+ ),
722
+ /* @__PURE__ */ jsx(
723
+ Button2,
724
+ {
725
+ size: "xs",
726
+ variant: "link",
727
+ className: "w-fit",
728
+ isDisabled: isRedirecting,
729
+ children: /* @__PURE__ */ jsx(Link, { href: PATHS.auth.signIn.path, children: t("auth.reset-password.anchor.text") })
730
+ }
731
+ ),
732
+ /* @__PURE__ */ jsx(Button2, { type: "submit", isLoading: isRedirecting, children: t("auth.reset-password.button.text") })
733
+ ] })
734
+ ] }) });
735
+ };
736
+ }
737
+ function createChangePasswordPage({
738
+ useCommand,
739
+ changePasswordAction
740
+ }) {
741
+ return function ChangePasswordPage() {
742
+ const { t } = useTranslator();
743
+ const router = useRouter();
744
+ const [formData, setFormData] = useState({
745
+ password: "",
746
+ newPassword: "",
747
+ newPasswordConfirm: ""
748
+ });
749
+ const { execute, isRedirecting, errors } = useCommand(
750
+ () => changePasswordAction({
751
+ formData: {
752
+ password: formData.password,
753
+ newPassword: formData.newPassword,
754
+ newPasswordConfirm: formData.newPasswordConfirm
755
+ }
756
+ }),
757
+ { onSuccess: () => router.push(PATHS.main.dashboard.path) }
758
+ );
759
+ return /* @__PURE__ */ jsx(Form, { className: "mx-auto mt-20 w-96", onSubmit: () => void execute(), children: /* @__PURE__ */ jsxs(Card, { children: [
760
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { className: "mx-auto", children: t("auth.change-password.text") }) }),
761
+ /* @__PURE__ */ jsxs(CardContent, { className: "relative flex flex-col gap-6", children: [
762
+ /* @__PURE__ */ jsx(
763
+ Field,
764
+ {
765
+ htmlFor: "password",
766
+ label: t("auth.change-password.password.text"),
767
+ children: /* @__PURE__ */ jsx(
768
+ PasswordInput,
769
+ {
770
+ id: "password",
771
+ placeholder: t(
772
+ "auth.change-password.password.placeholder.text"
773
+ ),
774
+ fieldName: "password",
775
+ value: formData.password,
776
+ setFormData,
777
+ isDisabled: isRedirecting,
778
+ isError: errors.includes("password")
779
+ }
780
+ )
781
+ }
782
+ ),
783
+ /* @__PURE__ */ jsx(
784
+ Field,
785
+ {
786
+ htmlFor: "newPassword",
787
+ label: t("auth.change-password.new-password.text"),
788
+ children: /* @__PURE__ */ jsx(
789
+ PasswordInput,
790
+ {
791
+ id: "newPassword",
792
+ placeholder: t(
793
+ "auth.change-password.new-password.placeholder.text"
794
+ ),
795
+ fieldName: "newPassword",
796
+ value: formData.newPassword,
797
+ setFormData,
798
+ isDisabled: isRedirecting,
799
+ isError: errors.includes("newPassword")
800
+ }
801
+ )
802
+ }
803
+ ),
804
+ /* @__PURE__ */ jsx(
805
+ Field,
806
+ {
807
+ htmlFor: "newPasswordConfirm",
808
+ label: t("auth.change-password.new-password-confirm.text"),
809
+ children: /* @__PURE__ */ jsx(
810
+ PasswordInput,
811
+ {
812
+ id: "newPasswordConfirm",
813
+ placeholder: t(
814
+ "auth.change-password.new-password-confirm.placeholder.text"
815
+ ),
816
+ fieldName: "newPasswordConfirm",
817
+ value: formData.newPasswordConfirm,
818
+ setFormData,
819
+ isDisabled: isRedirecting,
820
+ isError: errors.includes("newPasswordConfirm")
821
+ }
822
+ )
823
+ }
824
+ ),
825
+ /* @__PURE__ */ jsx(
826
+ Button2,
827
+ {
828
+ size: "xs",
829
+ variant: "link",
830
+ className: "w-fit",
831
+ isDisabled: isRedirecting,
832
+ children: /* @__PURE__ */ jsx(Link, { href: PATHS.main.dashboard.path, children: t("auth.change-password.anchor.text") })
833
+ }
834
+ ),
835
+ /* @__PURE__ */ jsx(Button2, { type: "submit", isLoading: isRedirecting, children: t("auth.change-password.button.text") }),
836
+ " "
837
+ ] })
838
+ ] }) });
839
+ };
840
+ }
490
841
 
491
- export { AdminProvider, Button2 as Button, Field, FieldBody, Form, Input, PasswordInput, createAdminInitializer, createRequestInterceptor, createResponseInterceptor, createSignInPage, createSmartFetch, createUseCommand, createUseQuery, handleToast, useAdmin };
842
+ export { AdminProvider, Button2 as Button, Field, FieldBody, Form, Input, PasswordInput, createAdminInitializer, createChangePasswordPage, createEmailUnverifiedPage, createForgotPasswordPage, createRequestInterceptor, createResetPasswordPage, createResponseInterceptor, createSignInPage, createSmartFetch, createUseCommand, createUseQuery, createVerifyEmailPage, handleToast, useAdmin };
@@ -1 +1 @@
1
- export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, Spinner, Textarea } from '../../chunk-OQGJBZXQ.js';
1
+ export { Button, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea, Label, Spinner, Textarea } from '../../chunk-BVWT2DIB.js';
@@ -1,5 +1,5 @@
1
- import { b as createZod, A as ActionContext, d as createSchemas, e as createTocItemSchema } from '../create-verify-action-lojNGPwl.js';
2
- export { R as RawCacheKey, S as SignInFormData, f as createAdminCommandRepository, g as createAdminQueryRepository, h as createAdminRefreshTokenCommandRepository, i as createAdminRefreshTokenQueryRepository, j as createArgon2Service, k as createAuthMiddleware, l as createAuthUseCases, m as createCacheResult, n as createCookieService, o as createCryptoService, p as createEmailVerificationEmail, q as createExecuteAction, r as createExist, s as createFileCommandRepository, t as createFileQueryRepository, u as createFolderCommandRepository, v as createFolderQueryRepository, w as createForgotPasswordEmail, x as createIpRateLimiter, y as createJwtService, z as createPostCommandRepository, B as createPostQueryRepository, C as createRenderEmailTemplate, D as createSendEmail, E as createSeoMetadataCommandRepository, a as createSignInAction, F as createUnique, G as createVerifyAccessToken, c as createVerifyAction, H as createVerifyRefreshToken, I as normalizeCacheKey } from '../create-verify-action-lojNGPwl.js';
1
+ import { a as createZod, c as createSchemas, A as ActionContext, b as createTocItemSchema } from '../action-context-yvi5OrMJ.js';
2
+ export { R as RawCacheKey, d as createAdminCommandRepository, e as createAdminQueryRepository, f as createAdminRefreshTokenCommandRepository, g as createAdminRefreshTokenQueryRepository, h as createArgon2Service, i as createAuthMiddleware, j as createAuthUseCases, k as createCacheResult, l as createCookieService, m as createCryptoService, n as createEmailVerificationEmail, o as createExecuteAction, p as createExist, q as createFileCommandRepository, r as createFileQueryRepository, s as createFolderCommandRepository, t as createFolderQueryRepository, u as createForgotPasswordEmail, v as createIpRateLimiter, w as createJwtService, x as createPostCommandRepository, y as createPostQueryRepository, z as createRenderEmailTemplate, B as createSendEmail, C as createSeoMetadataCommandRepository, D as createUnique, E as createVerifyAccessToken, F as createVerifyRefreshToken, G as normalizeCacheKey } from '../action-context-yvi5OrMJ.js';
3
3
  import Keyv from 'keyv';
4
4
  import * as zod from 'zod';
5
5
  import zod__default from 'zod';
@@ -9,7 +9,7 @@ import nodemailer from 'nodemailer';
9
9
  import { BaseTranslator, LocaleMessages } from 'intor';
10
10
  import { Logger } from 'logry';
11
11
  import { NextResponse } from 'next/server';
12
- import { R as Result, j as AdminSafe, e as Admin, g as AdminFull, h as AdminRefreshToken, a as Folder, b as FileFull, p as File$1, r as FileType, F as FolderFull, T as TocItem, f as AdminCard, u as PostListCard, c as FileCard, t as Post, w as PostType, v as PostTranslation, P as PostFull } from '../types-BGsFazJr.js';
12
+ import { R as Result, e as Admin, g as AdminFull, h as AdminRefreshToken, a as Folder, b as FileFull, p as File$1, r as FileType, F as FolderFull, T as TocItem, f as AdminCard, u as PostListCard, c as FileCard, t as Post, w as PostType, v as PostTranslation, P as PostFull } from '../types-BGsFazJr.js';
13
13
  import * as zod_v4_core from 'zod/v4/core';
14
14
  import '../types-J25u1G6t.js';
15
15
  import 'jsonwebtoken';
@@ -80,60 +80,6 @@ interface CreateExecuteApiParams {
80
80
  }
81
81
  declare function createExecuteApi({ initI18n, logger }: CreateExecuteApiParams): (fn: Api) => Promise<NextResponse<unknown>>;
82
82
 
83
- declare function createSignOutAction(ctx: ActionContext): () => Promise<Result<void>>;
84
-
85
- declare const changePasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
86
- password: zod.ZodString;
87
- newPassword: zod.ZodString;
88
- newPasswordConfirm: zod.ZodString;
89
- }, zod_v4_core.$strip>;
90
-
91
- type ChangePasswordFormData = zod__default.infer<ReturnType<typeof changePasswordValidator>>;
92
- declare function createChangePasswordAction(ctx: ActionContext): ({ formData, }: {
93
- formData: ChangePasswordFormData;
94
- }) => Promise<Result<void>>;
95
-
96
- declare const verifyEmailValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
97
- email: zod.ZodEmail;
98
- emailVerificationToken: zod.ZodString;
99
- }, zod_v4_core.$strip>;
100
-
101
- type VerifyEmailFormData = zod__default.infer<ReturnType<typeof verifyEmailValidator>>;
102
- declare function createVerifyEmailAction(ctx: ActionContext): ({ formData, }: {
103
- formData: VerifyEmailFormData;
104
- }) => Promise<Result<{
105
- admin: AdminSafe;
106
- }>>;
107
-
108
- declare const emailUnverifiedValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
109
- email: zod.ZodEmail;
110
- }, zod_v4_core.$strip>;
111
-
112
- type EmailUnverifiedFormData = zod__default.infer<ReturnType<typeof emailUnverifiedValidator>>;
113
- declare function createEmailUnverifiedAction(ctx: ActionContext): ({ formData, }: {
114
- formData: EmailUnverifiedFormData;
115
- }) => Promise<Result<void>>;
116
-
117
- declare const forgetPasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
118
- email: zod.ZodEmail;
119
- }, zod_v4_core.$strip>;
120
-
121
- type ForgotPasswordFormData = zod__default.infer<ReturnType<typeof forgetPasswordValidator>>;
122
- declare function createForgotPasswordAction(ctx: ActionContext): ({ formData, }: {
123
- formData: ForgotPasswordFormData;
124
- }) => Promise<Result<void>>;
125
-
126
- declare const resetPasswordValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
127
- passwordResetToken: zod.ZodString;
128
- newPassword: zod.ZodString;
129
- newPasswordConfirm: zod.ZodString;
130
- }, zod_v4_core.$strip>;
131
-
132
- type ResetPasswordFormData = zod__default.infer<ReturnType<typeof resetPasswordValidator>>;
133
- declare function createResetPasswordAction(ctx: ActionContext): ({ formData, }: {
134
- formData: ResetPasswordFormData;
135
- }) => Promise<Result<void>>;
136
-
137
83
  declare const adminCreateValidator: (schemas: ReturnType<typeof createSchemas>) => zod.ZodObject<{
138
84
  role: zod.ZodEnum<{
139
85
  SUPER_ADMIN: "SUPER_ADMIN";
@@ -1595,4 +1541,4 @@ declare class ServerError extends Error {
1595
1541
  static internalServerError(): ServerError;
1596
1542
  }
1597
1543
 
1598
- export { ADMIN_ORDER_BY, ActionContext, type AdminCreateFormData, type AdminUpdateFormData, type ChangePasswordFormData, type EmailUnverifiedFormData, type FileCreateFormData, type FileCreateManyFormData, type FileUpdateFormData, type FolderCreateFormData, type FolderUpdateFormData, type ForgotPasswordFormData, ORDER_BY, POST_ORDER_BY, type PostCreateFormData, type PostUpdateFormData, type ResetPasswordFormData, type SeoMetadataUpsertFormData, ServerError, type VerifyEmailFormData, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminUpdateAction, createCache, createChangePasswordAction, createEmailUnverifiedAction, createExecuteApi, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderUpdateAction, createForgotPasswordAction, createMultiFileSchema, createPostCreateAction, createPostDeleteAction, createPostFindAction, createPostFindFullAction, createPostFindListCardsAction, createPostFindManyAction, createPostUpdateAction, createResetPasswordAction, createSchemas, createSeoMetadataUpsertAction, createSignOutAction, createTocItemSchema, createTransporter, createVerifyEmailAction, createZod };
1544
+ export { ADMIN_ORDER_BY, ActionContext, type AdminCreateFormData, type AdminUpdateFormData, type FileCreateFormData, type FileCreateManyFormData, type FileUpdateFormData, type FolderCreateFormData, type FolderUpdateFormData, ORDER_BY, POST_ORDER_BY, type PostCreateFormData, type PostUpdateFormData, type SeoMetadataUpsertFormData, ServerError, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminUpdateAction, createCache, createExecuteApi, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderUpdateAction, createMultiFileSchema, createPostCreateAction, createPostDeleteAction, createPostFindAction, createPostFindFullAction, createPostFindListCardsAction, createPostFindManyAction, createPostUpdateAction, createSchemas, createSeoMetadataUpsertAction, createTocItemSchema, createTransporter, createZod };
@@ -2095,313 +2095,6 @@ function createVerifyRefreshToken({
2095
2095
  };
2096
2096
  }
2097
2097
 
2098
- // src/server/interfaces/actions/auth/sign-in/sign-in-validator.ts
2099
- var signInValidator = (schemas) => schemas.z.object({
2100
- email: schemas.email(),
2101
- password: schemas.password()
2102
- });
2103
-
2104
- // src/server/interfaces/actions/auth/sign-in/create-sign-in-action.ts
2105
- function createSignInAction(ctx) {
2106
- return async function signInAction({
2107
- formData,
2108
- deviceInfo
2109
- }) {
2110
- const {
2111
- repositories: {
2112
- adminQueryRepository,
2113
- adminRefreshTokenCommandRepository
2114
- },
2115
- useCases: { authUseCases },
2116
- action: { executeAction, ipRateLimiter },
2117
- http: { headers },
2118
- schemas: { schemas }
2119
- } = ctx;
2120
- return executeAction(
2121
- async () => {
2122
- await ipRateLimiter({ key: ["sign-in"] });
2123
- const { email, password } = await signInValidator(schemas).parseAsync(formData);
2124
- const verified = await authUseCases.verifyCredentials({
2125
- email,
2126
- password
2127
- });
2128
- const admin = await adminQueryRepository.findFull({
2129
- id: verified.id
2130
- });
2131
- if (!admin) throw ServerError.notFound();
2132
- await authUseCases.refreshTokens({
2133
- admin,
2134
- deviceInfo,
2135
- ip: (await headers()).get("x-forwarded-for") || "unknown"
2136
- });
2137
- await adminRefreshTokenCommandRepository.deleteManyByExpired();
2138
- return {
2139
- i18nKey: "ok.sign-in-ok",
2140
- data: { admin }
2141
- };
2142
- },
2143
- { type: "command" }
2144
- );
2145
- };
2146
- }
2147
-
2148
- // src/server/interfaces/actions/auth/sign-out/create-sign-out-action.ts
2149
- function createSignOutAction(ctx) {
2150
- const {
2151
- services: { cryptoService, cookieService },
2152
- repositories: { adminRefreshTokenCommandRepository },
2153
- action: { executeAction },
2154
- config: { accessTokenName, refreshTokenName }
2155
- } = ctx;
2156
- return async function signOutAction() {
2157
- return executeAction(
2158
- async () => {
2159
- let token;
2160
- try {
2161
- token = await cookieService.getSignedCookie({
2162
- name: refreshTokenName
2163
- });
2164
- } catch {
2165
- }
2166
- if (token) {
2167
- await adminRefreshTokenCommandRepository.delete({
2168
- tokenHash: cryptoService.hash(token)
2169
- });
2170
- }
2171
- await cookieService.delete({ name: accessTokenName });
2172
- await cookieService.delete({ name: refreshTokenName });
2173
- return {
2174
- i18nKey: "ok.sign-out-ok"
2175
- };
2176
- },
2177
- { type: "command" }
2178
- );
2179
- };
2180
- }
2181
-
2182
- // src/server/interfaces/actions/auth/verify/create-verify-action.ts
2183
- function createVerifyAction(ctx) {
2184
- const {
2185
- middlewares: { authMiddleware },
2186
- action: { executeAction, ipRateLimiter }
2187
- } = ctx;
2188
- return async function verifyAction() {
2189
- return executeAction(async () => {
2190
- await ipRateLimiter({ key: ["verify"], maxAttempts: 60 });
2191
- const admin = await authMiddleware.authenticate();
2192
- return {
2193
- data: { admin }
2194
- };
2195
- });
2196
- };
2197
- }
2198
-
2199
- // src/server/interfaces/actions/auth/change-password/change-password-validator.ts
2200
- var changePasswordValidator = (schemas) => schemas.z.object({
2201
- password: schemas.password(),
2202
- newPassword: schemas.password(),
2203
- newPasswordConfirm: schemas.password()
2204
- }).superRefine((data, ctx) => {
2205
- if (data.newPassword !== data.newPasswordConfirm) {
2206
- ctx.addIssue({
2207
- code: "custom",
2208
- params: { i18nKey: "validator.password-confirm" },
2209
- path: ["newPassword"]
2210
- });
2211
- ctx.addIssue({
2212
- code: "custom",
2213
- params: { i18nKey: "validator.password-confirm" },
2214
- path: ["newPasswordConfirm"]
2215
- });
2216
- }
2217
- });
2218
-
2219
- // src/server/interfaces/actions/auth/change-password/create-change-password-action.ts
2220
- function createChangePasswordAction(ctx) {
2221
- return async function changePasswordAction({
2222
- formData
2223
- }) {
2224
- const {
2225
- action: { executeAction, ipRateLimiter },
2226
- useCases: { authUseCases },
2227
- middlewares: { authMiddleware },
2228
- schemas: { schemas }
2229
- } = ctx;
2230
- return executeAction(
2231
- async () => {
2232
- await ipRateLimiter({ key: ["change-password"] });
2233
- const { email } = await authMiddleware.authenticate();
2234
- const { password, newPassword } = await changePasswordValidator(schemas).parseAsync(formData);
2235
- await authUseCases.verifyCredentials({ email, password });
2236
- await authUseCases.updatePassword({ email, password: newPassword });
2237
- return {
2238
- i18nKey: "ok.change-password-ok"
2239
- };
2240
- },
2241
- { type: "command" }
2242
- );
2243
- };
2244
- }
2245
-
2246
- // src/server/interfaces/actions/auth/verify-email/verify-email-validator.ts
2247
- var verifyEmailValidator = (schemas) => schemas.z.object({
2248
- email: schemas.email(),
2249
- emailVerificationToken: schemas.z.string().trim().max(1e3)
2250
- });
2251
-
2252
- // src/server/interfaces/actions/auth/verify-email/create-verify-email-action.ts
2253
- function createVerifyEmailAction(ctx) {
2254
- return async function verifyEmailAction({
2255
- formData
2256
- }) {
2257
- const {
2258
- repositories: { adminQueryRepository },
2259
- useCases: { authUseCases },
2260
- action: { executeAction, ipRateLimiter },
2261
- schemas: { schemas }
2262
- } = ctx;
2263
- return executeAction(
2264
- async () => {
2265
- await ipRateLimiter({ key: ["verify-email"] });
2266
- const { email, emailVerificationToken } = await verifyEmailValidator(schemas).parseAsync(formData);
2267
- const admin = await adminQueryRepository.find({ email });
2268
- if (!admin) throw new ServerError({ i18nKey: "error.email-not-found" });
2269
- await authUseCases.verifyEmailAndUpdate({
2270
- token: emailVerificationToken || "",
2271
- admin
2272
- });
2273
- return {
2274
- i18nKey: "ok.verify-email-ok",
2275
- data: { admin }
2276
- };
2277
- },
2278
- { type: "command" }
2279
- );
2280
- };
2281
- }
2282
-
2283
- // src/server/interfaces/actions/auth/email-unverifired/email-unverifired-validator.ts
2284
- var emailUnverifiedValidator = (schemas) => schemas.z.object({
2285
- email: schemas.email()
2286
- });
2287
-
2288
- // src/server/interfaces/actions/auth/email-unverifired/create-email-unverifired-action.ts
2289
- function createEmailUnverifiedAction(ctx) {
2290
- return async function emailUnverifiedAction({
2291
- formData
2292
- }) {
2293
- const {
2294
- repositories: { adminQueryRepository },
2295
- action: { executeAction, ipRateLimiter },
2296
- emails: { emailVerificationEmail },
2297
- schemas: { schemas }
2298
- } = ctx;
2299
- return executeAction(
2300
- async (translator) => {
2301
- await ipRateLimiter({
2302
- key: ["email-unverified"],
2303
- maxAttempts: 2,
2304
- timeWindow: 60
2305
- });
2306
- const { email } = await emailUnverifiedValidator(schemas).parseAsync(formData);
2307
- const admin = await adminQueryRepository.find({ email });
2308
- if (!admin) throw new ServerError({ i18nKey: "error.email-not-found" });
2309
- void emailVerificationEmail.send({ translator, admin });
2310
- return {
2311
- i18nKey: "ok.email-unverified-ok"
2312
- };
2313
- },
2314
- { type: "command" }
2315
- );
2316
- };
2317
- }
2318
-
2319
- // src/server/interfaces/actions/auth/forgot-password/forgot-password-validator.ts
2320
- var forgetPasswordValidator = (schemas) => schemas.z.object({
2321
- email: schemas.email()
2322
- });
2323
-
2324
- // src/server/interfaces/actions/auth/forgot-password/create-forgot-password-action.ts
2325
- function createForgotPasswordAction(ctx) {
2326
- return async function forgotPasswordAction({
2327
- formData
2328
- }) {
2329
- const {
2330
- repositories: { adminQueryRepository },
2331
- action: { executeAction, ipRateLimiter },
2332
- emails: { forgotPasswordEmail },
2333
- schemas: { schemas }
2334
- } = ctx;
2335
- return executeAction(
2336
- async (translator) => {
2337
- await ipRateLimiter({
2338
- key: ["forget-password"],
2339
- maxAttempts: 2,
2340
- timeWindow: 60
2341
- });
2342
- const { email } = await forgetPasswordValidator(schemas).parseAsync(formData);
2343
- const admin = await adminQueryRepository.find({ email });
2344
- if (!admin) throw new ServerError({ i18nKey: "error.email-not-found" });
2345
- void forgotPasswordEmail.send({ translator, admin });
2346
- return {
2347
- i18nKey: "ok.forgot-password-ok"
2348
- };
2349
- },
2350
- { type: "command" }
2351
- );
2352
- };
2353
- }
2354
-
2355
- // src/server/interfaces/actions/auth/reset-password/reset-password-validator.ts
2356
- var resetPasswordValidator = (schemas) => schemas.z.object({
2357
- passwordResetToken: schemas.z.string().trim().max(1e3),
2358
- newPassword: schemas.password(),
2359
- newPasswordConfirm: schemas.password()
2360
- }).superRefine((data, ctx) => {
2361
- if (data.newPassword !== data.newPasswordConfirm) {
2362
- ctx.addIssue({
2363
- code: "custom",
2364
- message: "custom.password-confirm",
2365
- path: ["newPassword"]
2366
- });
2367
- ctx.addIssue({
2368
- code: "custom",
2369
- message: "custom.password-confirm",
2370
- path: ["newPasswordConfirm"]
2371
- });
2372
- }
2373
- });
2374
-
2375
- // src/server/interfaces/actions/auth/reset-password/create-reset-password-action.ts
2376
- function createResetPasswordAction(ctx) {
2377
- return async function ResetPasswordAction({
2378
- formData
2379
- }) {
2380
- const {
2381
- useCases: { authUseCases },
2382
- action: { executeAction, ipRateLimiter },
2383
- schemas: { schemas }
2384
- } = ctx;
2385
- return executeAction(
2386
- async () => {
2387
- await ipRateLimiter({ key: ["reset-password"] });
2388
- const { newPassword, passwordResetToken } = await resetPasswordValidator(schemas).parseAsync(formData);
2389
- const decoded = authUseCases.verifyPasswordResetToken({
2390
- token: passwordResetToken
2391
- });
2392
- await authUseCases.updatePassword({
2393
- email: decoded.email,
2394
- password: newPassword
2395
- });
2396
- return {
2397
- i18nKey: "ok.reset-password-ok"
2398
- };
2399
- },
2400
- { type: "command" }
2401
- );
2402
- };
2403
- }
2404
-
2405
2098
  // src/server/interfaces/actions/resources/admin/commands/create/admin-create-validator.ts
2406
2099
  var adminCreateValidator = (schemas) => schemas.z.object({
2407
2100
  // core
@@ -4348,4 +4041,4 @@ function createForgotPasswordEmail({
4348
4041
  };
4349
4042
  }
4350
4043
 
4351
- export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createChangePasswordAction, createCookieService, createCryptoService, createEmailUnverifiedAction, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderQueryRepository, createFolderUpdateAction, createForgotPasswordAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostCreateAction, createPostDeleteAction, createPostFindAction, createPostFindFullAction, createPostFindListCardsAction, createPostFindManyAction, createPostQueryRepository, createPostUpdateAction, createRenderEmailTemplate, createResetPasswordAction, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSeoMetadataUpsertAction, createSignInAction, createSignOutAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyAction, createVerifyEmailAction, createVerifyRefreshToken, createZod, normalizeCacheKey };
4044
+ export { ADMIN_ORDER_BY, ORDER_BY, POST_ORDER_BY, ServerError, createAdminCommandRepository, createAdminCreateAction, createAdminDeleteAction, createAdminFindFullAction, createAdminFindListCardsAction, createAdminQueryRepository, createAdminRefreshTokenCommandRepository, createAdminRefreshTokenDeleteAction, createAdminRefreshTokenFindManyAction, createAdminRefreshTokenQueryRepository, createAdminUpdateAction, createArgon2Service, createAuthMiddleware, createAuthUseCases, createCache, createCacheResult, createCookieService, createCryptoService, createEmailVerificationEmail, createExecuteAction, createExecuteApi, createExist, createFileCommandRepository, createFileCreateAction, createFileCreateManyAction, createFileFindFullAction, createFileFindListCardsAction, createFilePurgeManyAction, createFileQueryRepository, createFileRestoreManyAction, createFileSchema, createFileSoftDeleteAction, createFileSoftDeleteManyAction, createFileUpdateAction, createFolderCommandRepository, createFolderCreateAction, createFolderDeleteAction, createFolderFindFullAction, createFolderFindListCardsAction, createFolderQueryRepository, createFolderUpdateAction, createForgotPasswordEmail, createIpRateLimiter, createJwtService, createMultiFileSchema, createPostCommandRepository, createPostCreateAction, createPostDeleteAction, createPostFindAction, createPostFindFullAction, createPostFindListCardsAction, createPostFindManyAction, createPostQueryRepository, createPostUpdateAction, createRenderEmailTemplate, createSchemas, createSendEmail, createSeoMetadataCommandRepository, createSeoMetadataUpsertAction, createTocItemSchema, createTransporter, createUnique, createVerifyAccessToken, createVerifyRefreshToken, createZod, normalizeCacheKey };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yimingliao/cms",
3
- "version": "0.0.89",
3
+ "version": "0.0.90",
4
4
  "author": "Yiming Liao",
5
5
  "license": "MIT",
6
6
  "type": "module",