create-zhx-monorepo 0.2.2 → 2.0.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/README.md +1 -1
- package/bin/index.js +0 -0
- package/package.json +3 -3
- package/templates/monorepo-starter/apps/dashboard/components.json +20 -0
- package/templates/monorepo-starter/apps/dashboard/eslint.config.js +1 -0
- package/templates/monorepo-starter/apps/dashboard/next-env.d.ts +6 -0
- package/templates/monorepo-starter/apps/dashboard/next.config.mjs +30 -0
- package/templates/monorepo-starter/apps/dashboard/package.json +43 -0
- package/templates/monorepo-starter/apps/dashboard/postcss.config.mjs +1 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/edit/page.tsx +8 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/page.tsx +104 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/new/page.tsx +7 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/page.tsx +88 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/data.json +614 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/page.tsx +21 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/layout.tsx +40 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/media/page.tsx +7 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/(root)/users/account/page.tsx +75 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/auth/[type]/page.tsx +19 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/auth/layout.tsx +11 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/auth/verify/page.tsx +11 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/favicon.ico +0 -0
- package/templates/monorepo-starter/apps/dashboard/src/app/layout.tsx +28 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/forms/AuthForm.tsx +345 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/forms/CUUserForm.tsx +223 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/forms/MediaForm.tsx +35 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/forms/SocialAuthField.tsx +56 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/layout/AppSidebar.tsx +141 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardChart.tsx +293 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardStats.tsx +104 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/layout/Header.tsx +21 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/layout/NavMain.tsx +99 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/LibraryPopup.tsx +25 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaCard.tsx +175 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaDetails.tsx +58 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaGrid.tsx +51 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaUploader.tsx +182 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/media/index.tsx +96 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/DateWrapper.tsx +43 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericArrayField.tsx +189 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericCUForm.tsx +124 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericDetailsPage.tsx +291 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericFormTable.tsx +189 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericTable.tsx +244 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/ListPage.tsx +134 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/Pagination.tsx +120 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/SearchToolbar.tsx +133 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/ThemeSwitch.tsx +41 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/shared/VerifyAuthPage.tsx +109 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/CUFormSkeleton.tsx +31 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DashboardSke1eton.tsx +135 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DetailsPageSkeleton.tsx +64 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/RootLayoutSkeleton.tsx +106 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/TableSkeleton.tsx +77 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/user/UserAccountSection.tsx +530 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/user/UserCard.tsx +54 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/user/UserProfileSection.tsx +239 -0
- package/templates/monorepo-starter/apps/dashboard/src/components/user/UserSessions.tsx +154 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/admin.ts +100 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/auth.ts +59 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/crud.ts +275 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/lookup.ts +38 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/media.ts +34 -0
- package/templates/monorepo-starter/apps/dashboard/src/hooks/user.ts +58 -0
- package/templates/monorepo-starter/apps/dashboard/src/lib/constants.ts +61 -0
- package/templates/monorepo-starter/apps/dashboard/src/providers/index.tsx +15 -0
- package/templates/monorepo-starter/apps/dashboard/src/providers/media-library.tsx +48 -0
- package/templates/monorepo-starter/apps/dashboard/tsconfig.json +20 -0
- package/templates/monorepo-starter/apps/web/components.json +20 -20
- package/templates/monorepo-starter/apps/web/eslint.config.js +1 -0
- package/templates/monorepo-starter/apps/web/next-env.d.ts +6 -6
- package/templates/monorepo-starter/apps/web/next.config.mjs +20 -6
- package/templates/monorepo-starter/apps/web/package.json +36 -31
- package/templates/monorepo-starter/apps/web/postcss.config.mjs +1 -1
- package/templates/monorepo-starter/apps/web/src/app/(root)/layout.tsx +2 -2
- package/templates/monorepo-starter/apps/web/src/app/favicon.ico +0 -0
- package/templates/monorepo-starter/apps/web/src/app/layout.tsx +13 -9
- package/templates/monorepo-starter/apps/web/src/components/Footer.tsx +5 -7
- package/templates/monorepo-starter/apps/web/src/components/Header.tsx +5 -9
- package/templates/monorepo-starter/apps/web/tsconfig.json +20 -20
- package/templates/monorepo-starter/eslint.config.mjs +1 -1
- package/templates/monorepo-starter/gitignore +13 -4
- package/templates/monorepo-starter/package.json +49 -23
- package/templates/monorepo-starter/packages/config/eslint/next.mjs +18 -0
- package/templates/monorepo-starter/packages/config/eslint/node.mjs +44 -0
- package/templates/monorepo-starter/packages/config/eslint/react.mjs +68 -0
- package/templates/monorepo-starter/packages/config/package.json +23 -32
- package/templates/monorepo-starter/packages/config/typescript/node.json +25 -0
- package/templates/monorepo-starter/packages/config/typescript/react.json +20 -3
- package/templates/monorepo-starter/packages/contracts/eslint.config.mjs +1 -0
- package/templates/monorepo-starter/packages/contracts/package.json +51 -0
- package/templates/monorepo-starter/packages/contracts/src/admin/dto.ts +6 -0
- package/templates/monorepo-starter/packages/contracts/src/admin/index.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/admin/schema.ts +28 -0
- package/templates/monorepo-starter/packages/contracts/src/admin/types.d.ts +27 -0
- package/templates/monorepo-starter/packages/contracts/src/auth/dto.ts +24 -0
- package/templates/monorepo-starter/packages/contracts/src/auth/index.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/auth/schema.ts +35 -0
- package/templates/monorepo-starter/packages/contracts/src/auth/types.d.ts +73 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/enums.ts +55 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/index.ts +4 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/prisma.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/schema.ts +61 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/types.d.ts +149 -0
- package/templates/monorepo-starter/packages/contracts/src/lib/utils.ts +8 -0
- package/templates/monorepo-starter/packages/contracts/src/media/dto.ts +12 -0
- package/templates/monorepo-starter/packages/contracts/src/media/index.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/media/schema.ts +27 -0
- package/templates/monorepo-starter/packages/contracts/src/media/types.d.ts +36 -0
- package/templates/monorepo-starter/packages/contracts/src/notification/dto.ts +6 -0
- package/templates/monorepo-starter/packages/contracts/src/notification/index.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/notification/schema.ts +7 -0
- package/templates/monorepo-starter/packages/contracts/src/notification/types.d.ts +22 -0
- package/templates/monorepo-starter/packages/contracts/src/user/dto.ts +4 -0
- package/templates/monorepo-starter/packages/contracts/src/user/index.ts +2 -0
- package/templates/monorepo-starter/packages/contracts/src/user/schema.ts +16 -0
- package/templates/monorepo-starter/packages/contracts/src/user/types.d.ts +36 -0
- package/templates/monorepo-starter/packages/contracts/tsconfig.json +12 -0
- package/templates/monorepo-starter/packages/contracts/tsup.config.ts +20 -0
- package/templates/monorepo-starter/packages/sdk/eslint.config.mjs +1 -0
- package/templates/monorepo-starter/packages/sdk/package.json +31 -0
- package/templates/monorepo-starter/packages/sdk/src/admin/index.ts +31 -0
- package/templates/monorepo-starter/packages/sdk/src/auth/index.ts +71 -0
- package/templates/monorepo-starter/packages/sdk/src/lib/api-client.ts +71 -0
- package/templates/monorepo-starter/packages/sdk/src/lib/index.ts +2 -0
- package/templates/monorepo-starter/packages/sdk/src/lib/types.ts +40 -0
- package/templates/monorepo-starter/packages/sdk/src/media/index.ts +27 -0
- package/templates/monorepo-starter/packages/sdk/src/notification/index.ts +10 -0
- package/templates/monorepo-starter/packages/sdk/src/public/index.ts +6 -0
- package/templates/monorepo-starter/packages/sdk/src/user/index.ts +7 -0
- package/templates/monorepo-starter/packages/sdk/tsconfig.json +12 -0
- package/templates/monorepo-starter/packages/shared/eslint.config.mjs +1 -0
- package/templates/monorepo-starter/packages/shared/package.json +36 -0
- package/templates/monorepo-starter/packages/shared/src/constants/app.ts +4 -0
- package/templates/monorepo-starter/packages/shared/src/constants/index.ts +1 -0
- package/templates/monorepo-starter/packages/shared/src/utils/date.ts +137 -0
- package/templates/monorepo-starter/packages/shared/src/utils/identifier.ts +11 -0
- package/templates/monorepo-starter/packages/shared/src/utils/index.ts +2 -0
- package/templates/monorepo-starter/packages/shared/tsconfig.json +12 -0
- package/templates/monorepo-starter/packages/shared/tsup.config.ts +16 -0
- package/templates/monorepo-starter/packages/templates/eslint.config.mjs +1 -0
- package/templates/monorepo-starter/packages/templates/package.json +38 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/disableMfa.tsx +40 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/index.ts +10 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/resetPassword.tsx +41 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/securityAlert.tsx +21 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/setPassword.tsx +42 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/signin.tsx +19 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/signup.tsx +24 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/updateIdentifier.tsx +79 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/updateMfa.tsx +40 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/verifyIdentifier.tsx +42 -0
- package/templates/monorepo-starter/packages/templates/src/email/auth/verifyMfa.tsx +23 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/actionBlock.tsx +39 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/footer.tsx +0 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/greeting.tsx +11 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/header.tsx +15 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/layout.tsx +33 -0
- package/templates/monorepo-starter/packages/templates/src/email/components/numericCode.tsx +16 -0
- package/templates/monorepo-starter/packages/templates/src/email/index.ts +2 -0
- package/templates/monorepo-starter/packages/templates/src/email/service/accountReactivated.tsx +31 -0
- package/templates/monorepo-starter/packages/templates/src/email/service/accountSuspended.tsx +37 -0
- package/templates/monorepo-starter/packages/templates/src/email/service/index.ts +2 -0
- package/templates/monorepo-starter/packages/templates/src/email/test.tsx +141 -0
- package/templates/monorepo-starter/packages/templates/src/index.ts +1 -0
- package/templates/monorepo-starter/packages/templates/src/lib/constants.ts +22 -0
- package/templates/monorepo-starter/packages/templates/src/lib/utils.ts +19 -0
- package/templates/monorepo-starter/packages/templates/src/types/global.d.ts +37 -0
- package/templates/monorepo-starter/packages/templates/tsconfig.json +13 -0
- package/templates/monorepo-starter/packages/templates/tsup.config.ts +23 -0
- package/templates/monorepo-starter/packages/ui/components.json +1 -1
- package/templates/monorepo-starter/packages/ui/eslint.config.mjs +1 -4
- package/templates/monorepo-starter/packages/ui/package.json +81 -38
- package/templates/monorepo-starter/packages/ui/src/components/accordion.tsx +66 -0
- package/templates/monorepo-starter/packages/ui/src/components/airport-search-field.tsx +203 -0
- package/templates/monorepo-starter/packages/ui/src/components/alert-dialog.tsx +157 -0
- package/templates/monorepo-starter/packages/ui/src/components/alert.tsx +66 -0
- package/templates/monorepo-starter/packages/ui/src/components/aspect-ratio.tsx +11 -0
- package/templates/monorepo-starter/packages/ui/src/components/avatar.tsx +53 -0
- package/templates/monorepo-starter/packages/ui/src/components/badge.tsx +46 -0
- package/templates/monorepo-starter/packages/ui/src/components/breadcrumb.tsx +109 -0
- package/templates/monorepo-starter/packages/ui/src/components/button-group.tsx +83 -0
- package/templates/monorepo-starter/packages/ui/src/components/button.tsx +2 -1
- package/templates/monorepo-starter/packages/ui/src/components/calendar.tsx +220 -0
- package/templates/monorepo-starter/packages/ui/src/components/card.tsx +92 -0
- package/templates/monorepo-starter/packages/ui/src/components/carousel.tsx +241 -0
- package/templates/monorepo-starter/packages/ui/src/components/chart.tsx +357 -0
- package/templates/monorepo-starter/packages/ui/src/components/checkbox.tsx +32 -0
- package/templates/monorepo-starter/packages/ui/src/components/collapsible.tsx +33 -0
- package/templates/monorepo-starter/packages/ui/src/components/combobox-field.tsx +181 -0
- package/templates/monorepo-starter/packages/ui/src/components/combobox.tsx +309 -0
- package/templates/monorepo-starter/packages/ui/src/components/command.tsx +184 -0
- package/templates/monorepo-starter/packages/ui/src/components/context-menu.tsx +252 -0
- package/templates/monorepo-starter/packages/ui/src/components/date-field.tsx +65 -0
- package/templates/monorepo-starter/packages/ui/src/components/dialog.tsx +143 -0
- package/templates/monorepo-starter/packages/ui/src/components/direction.tsx +22 -0
- package/templates/monorepo-starter/packages/ui/src/components/drawer.tsx +135 -0
- package/templates/monorepo-starter/packages/ui/src/components/dropdown-menu.tsx +257 -0
- package/templates/monorepo-starter/packages/ui/src/components/empty.tsx +104 -0
- package/templates/monorepo-starter/packages/ui/src/components/field.tsx +248 -0
- package/templates/monorepo-starter/packages/ui/src/components/form.tsx +197 -0
- package/templates/monorepo-starter/packages/ui/src/components/hover-card.tsx +44 -0
- package/templates/monorepo-starter/packages/ui/src/components/input-field.tsx +116 -0
- package/templates/monorepo-starter/packages/ui/src/components/input-group.tsx +170 -0
- package/templates/monorepo-starter/packages/ui/src/components/input-otp.tsx +77 -0
- package/templates/monorepo-starter/packages/ui/src/components/input.tsx +44 -0
- package/templates/monorepo-starter/packages/ui/src/components/item.tsx +193 -0
- package/templates/monorepo-starter/packages/ui/src/components/kbd.tsx +28 -0
- package/templates/monorepo-starter/packages/ui/src/components/label.tsx +24 -0
- package/templates/monorepo-starter/packages/ui/src/components/menubar.tsx +276 -0
- package/templates/monorepo-starter/packages/ui/src/components/native-select.tsx +53 -0
- package/templates/monorepo-starter/packages/ui/src/components/navigation-menu.tsx +168 -0
- package/templates/monorepo-starter/packages/ui/src/components/otp-modal.tsx +125 -0
- package/templates/monorepo-starter/packages/ui/src/components/pagination.tsx +127 -0
- package/templates/monorepo-starter/packages/ui/src/components/popover.tsx +48 -0
- package/templates/monorepo-starter/packages/ui/src/components/progress.tsx +31 -0
- package/templates/monorepo-starter/packages/ui/src/components/radio-group.tsx +45 -0
- package/templates/monorepo-starter/packages/ui/src/components/resizable.tsx +53 -0
- package/templates/monorepo-starter/packages/ui/src/components/scroll-area.tsx +58 -0
- package/templates/monorepo-starter/packages/ui/src/components/select-field.tsx +165 -0
- package/templates/monorepo-starter/packages/ui/src/components/select.tsx +190 -0
- package/templates/monorepo-starter/packages/ui/src/components/separator.tsx +28 -0
- package/templates/monorepo-starter/packages/ui/src/components/sheet.tsx +139 -0
- package/templates/monorepo-starter/packages/ui/src/components/sidebar.tsx +728 -0
- package/templates/monorepo-starter/packages/ui/src/components/skeleton.tsx +13 -0
- package/templates/monorepo-starter/packages/ui/src/components/slider.tsx +63 -0
- package/templates/monorepo-starter/packages/ui/src/components/sonner.tsx +57 -0
- package/templates/monorepo-starter/packages/ui/src/components/spinner.tsx +16 -0
- package/templates/monorepo-starter/packages/ui/src/components/switch-field.tsx +22 -0
- package/templates/monorepo-starter/packages/ui/src/components/switch.tsx +35 -0
- package/templates/monorepo-starter/packages/ui/src/components/table.tsx +120 -0
- package/templates/monorepo-starter/packages/ui/src/components/tabs.tsx +66 -0
- package/templates/monorepo-starter/packages/ui/src/components/textarea.tsx +18 -0
- package/templates/monorepo-starter/packages/ui/src/components/toggle-group.tsx +83 -0
- package/templates/monorepo-starter/packages/ui/src/components/toggle.tsx +47 -0
- package/templates/monorepo-starter/packages/ui/src/components/tooltip.tsx +61 -0
- package/templates/monorepo-starter/packages/ui/src/hooks/use-confirm.ts +12 -0
- package/templates/monorepo-starter/packages/ui/src/hooks/use-dialog.ts +12 -0
- package/templates/monorepo-starter/packages/ui/src/hooks/use-mobile.ts +21 -0
- package/templates/monorepo-starter/packages/ui/src/lib/utils.ts +38 -3
- package/templates/monorepo-starter/packages/ui/src/provider/confirm-dialog.tsx +99 -0
- package/templates/monorepo-starter/packages/ui/src/provider/dialog.tsx +62 -0
- package/templates/monorepo-starter/packages/ui/src/provider/index.tsx +30 -0
- package/templates/monorepo-starter/packages/ui/src/provider/react-query.tsx +11 -0
- package/templates/monorepo-starter/{apps/web/src/providers → packages/ui/src/provider}/theme.tsx +5 -7
- package/templates/monorepo-starter/packages/ui/src/styles/globals.css +109 -61
- package/templates/monorepo-starter/packages/ui/src/types/airports-data.d.ts +21 -0
- package/templates/monorepo-starter/packages/ui/tsconfig.json +1 -3
- package/templates/monorepo-starter/pnpm-lock.yaml +17765 -12441
- package/templates/monorepo-starter/pnpm-workspace.yaml +3 -16
- package/templates/monorepo-starter/server/.env.example +7 -5
- package/templates/monorepo-starter/server/eslint.config.mjs +1 -4
- package/templates/monorepo-starter/server/package.json +129 -97
- package/templates/monorepo-starter/server/prisma/schema.prisma +170 -92
- package/templates/monorepo-starter/server/prisma/seed-functions.ts +0 -0
- package/templates/monorepo-starter/server/prisma/seed.ts +0 -0
- package/templates/monorepo-starter/server/prisma.config.ts +9 -9
- package/templates/monorepo-starter/server/scripts/admin-bootstrap.ts +61 -0
- package/templates/monorepo-starter/server/scripts/gen-module.sh +20 -0
- package/templates/monorepo-starter/server/scripts/gen-soft-delete.ts +52 -0
- package/templates/monorepo-starter/server/src/app.module.ts +35 -28
- package/templates/monorepo-starter/server/src/lib/constants/index.ts +59 -0
- package/templates/monorepo-starter/server/src/lib/decorators/boolean-query.decorator.ts +18 -0
- package/templates/monorepo-starter/server/src/lib/decorators/logger.decorator.ts +1 -1
- package/templates/monorepo-starter/server/src/lib/decorators/oauth.decorator.ts +7 -0
- package/templates/monorepo-starter/server/src/lib/decorators/user.decorator.ts +10 -0
- package/templates/monorepo-starter/server/src/lib/filters/exceptions.filter.ts +169 -24
- package/templates/monorepo-starter/server/src/lib/guards/auth.guard.ts +29 -65
- package/templates/monorepo-starter/server/src/lib/guards/oauth.guard.ts +28 -0
- package/templates/monorepo-starter/server/src/lib/interceptors/response.interceptor.ts +42 -5
- package/templates/monorepo-starter/server/src/lib/middleware/cache.middleware.ts +24 -0
- package/templates/monorepo-starter/server/src/lib/schemas/env.schema.ts +25 -5
- package/templates/monorepo-starter/server/src/lib/utils/client.utils.ts +95 -0
- package/templates/monorepo-starter/server/src/lib/utils/cookie.util.ts +4 -3
- package/templates/monorepo-starter/server/src/main.ts +20 -10
- package/templates/monorepo-starter/server/src/modules/admin/admin.controller.ts +54 -0
- package/templates/monorepo-starter/server/src/modules/admin/admin.module.ts +13 -0
- package/templates/monorepo-starter/server/src/modules/admin/admin.service.ts +134 -0
- package/templates/monorepo-starter/server/src/modules/auth/auth.controller.ts +60 -18
- package/templates/monorepo-starter/server/src/modules/auth/auth.module.ts +3 -2
- package/templates/monorepo-starter/server/src/modules/auth/auth.service.ts +354 -307
- package/templates/monorepo-starter/server/src/modules/auth/oauth.controller.ts +50 -28
- package/templates/monorepo-starter/server/src/modules/auth/oauth.service.ts +59 -34
- package/templates/monorepo-starter/server/src/modules/auth/otp.service.ts +29 -36
- package/templates/monorepo-starter/server/src/modules/cache/cache.module.ts +28 -0
- package/templates/monorepo-starter/server/src/modules/cache/cache.service.ts +33 -0
- package/templates/monorepo-starter/server/src/modules/env/env.service.ts +4 -3
- package/templates/monorepo-starter/server/src/modules/logger/logger.module.ts +1 -0
- package/templates/monorepo-starter/server/src/modules/logger/logger.service.ts +1 -1
- package/templates/monorepo-starter/server/src/modules/logger/winston.config.ts +15 -1
- package/templates/monorepo-starter/server/src/modules/media/cloudinary.provider.ts +14 -0
- package/templates/monorepo-starter/server/src/modules/media/cloudinary.service.ts +62 -0
- package/templates/monorepo-starter/server/src/modules/media/media.controller.ts +72 -0
- package/templates/monorepo-starter/server/src/modules/media/media.module.ts +13 -0
- package/templates/monorepo-starter/server/src/modules/media/media.service.ts +146 -0
- package/templates/monorepo-starter/server/src/modules/notification/email.service.ts +30 -0
- package/templates/monorepo-starter/server/src/modules/notification/messaging.service.ts +50 -0
- package/templates/monorepo-starter/server/src/modules/notification/notification.controller.ts +44 -0
- package/templates/monorepo-starter/server/src/modules/notification/notification.module.ts +7 -3
- package/templates/monorepo-starter/server/src/modules/notification/notification.service.ts +121 -78
- package/templates/monorepo-starter/server/src/modules/notification/push.service.ts +92 -0
- package/templates/monorepo-starter/server/src/modules/prisma/prisma.extension.ts +84 -56
- package/templates/monorepo-starter/server/src/modules/prisma/prisma.service.ts +10 -9
- package/templates/monorepo-starter/server/src/modules/prisma/soft-delete.models.ts +7 -0
- package/templates/monorepo-starter/server/src/modules/public/public.controller.ts +3 -2
- package/templates/monorepo-starter/server/src/modules/public/public.module.ts +5 -4
- package/templates/monorepo-starter/server/src/modules/public/public.service.ts +7 -4
- package/templates/monorepo-starter/server/src/modules/scheduler/cleanup.service.ts +15 -7
- package/templates/monorepo-starter/server/src/modules/scheduler/scheduler.module.ts +2 -0
- package/templates/monorepo-starter/server/src/modules/token/token.module.ts +3 -4
- package/templates/monorepo-starter/server/src/modules/token/token.service.ts +205 -76
- package/templates/monorepo-starter/server/src/modules/user/user.controller.ts +21 -0
- package/templates/monorepo-starter/server/src/modules/user/user.module.ts +12 -0
- package/templates/monorepo-starter/server/src/modules/user/user.service.ts +38 -0
- package/templates/monorepo-starter/server/src/types/express.d.ts +6 -2
- package/templates/monorepo-starter/server/src/types/index.ts +5 -0
- package/templates/monorepo-starter/server/tsconfig.json +17 -12
- package/templates/monorepo-starter/server/tsup.config.ts +7 -2
- package/templates/monorepo-starter/tsconfig.json +1 -1
- package/templates/monorepo-starter/turbo.json +1 -1
- package/templates/monorepo-starter/apps/web/eslint.config.mjs +0 -4
- package/templates/monorepo-starter/apps/web/src/app/(auth)/layout.tsx +0 -7
- package/templates/monorepo-starter/apps/web/src/app/globals.css +0 -1
- package/templates/monorepo-starter/apps/web/src/components/ThemeSwitch.tsx +0 -34
- package/templates/monorepo-starter/apps/web/src/providers/index.tsx +0 -10
- package/templates/monorepo-starter/apps/web/src/types/index.d.ts +0 -16
- package/templates/monorepo-starter/packages/config/eslint/base.js +0 -31
- package/templates/monorepo-starter/packages/config/eslint/nest.js +0 -26
- package/templates/monorepo-starter/packages/config/eslint/next.js +0 -39
- package/templates/monorepo-starter/packages/config/eslint/react.js +0 -30
- package/templates/monorepo-starter/packages/config/typescript/base.json +0 -31
- package/templates/monorepo-starter/packages/config/typescript/nest.json +0 -14
- package/templates/monorepo-starter/packages/config/typescript/next.json +0 -10
- package/templates/monorepo-starter/packages/ui/tsconfig.lint.json +0 -8
- package/templates/monorepo-starter/server/README.md +0 -63
- package/templates/monorepo-starter/server/scripts/generate.sh +0 -14
- package/templates/monorepo-starter/server/src/lib/dto/auth.dto.ts +0 -64
- package/templates/monorepo-starter/server/src/lib/dto/security-setting.dto.ts +0 -21
- package/templates/monorepo-starter/server/src/lib/pipes/validation.pipe.ts +0 -7
- package/templates/monorepo-starter/server/src/lib/templates/notification.templates.ts +0 -243
- package/templates/monorepo-starter/server/src/lib/utils/general.util.ts +0 -24
- package/templates/monorepo-starter/server/src/modules/auth/role.service.ts +0 -99
- package/templates/monorepo-starter/server/src/modules/auth/security-setting.service.ts +0 -102
- package/templates/monorepo-starter/server/src/modules/template/template.module.ts +0 -8
- package/templates/monorepo-starter/server/src/modules/template/template.service.ts +0 -33
- package/templates/monorepo-starter/server/src/types/index.d.ts +0 -13
- package/templates/monorepo-starter/server/test/app.e2e-spec.ts +0 -25
- package/templates/monorepo-starter/server/test/jest-e2e.json +0 -9
- /package/templates/monorepo-starter/{packages/ui/src/hooks → apps/dashboard/public}/.gitkeep +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { Signin } from "./signin";
|
|
2
|
+
export { Signup } from "./signup";
|
|
3
|
+
export { VerifyMfa } from "./verifyMfa";
|
|
4
|
+
export { UpdateMfa } from "./updateMfa";
|
|
5
|
+
export { DisableMfa } from "./disableMfa";
|
|
6
|
+
export { VerifyIdentifier } from "./verifyIdentifier";
|
|
7
|
+
export { UpdateIdentifier } from "./updateIdentifier";
|
|
8
|
+
export { SetPassword } from "./setPassword";
|
|
9
|
+
export { ResetPassword } from "./resetPassword";
|
|
10
|
+
export { SecurityAlert } from "./securityAlert";
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { ActionBlock } from "../components/actionBlock";
|
|
6
|
+
|
|
7
|
+
export const ResetPassword: EmailTemplateComponent = ({
|
|
8
|
+
user,
|
|
9
|
+
otp,
|
|
10
|
+
identifier,
|
|
11
|
+
clientUrl,
|
|
12
|
+
}) => {
|
|
13
|
+
if (otp) {
|
|
14
|
+
const link = `${clientUrl}/auth/reset-password?identifier=${identifier}&purpose=${otp.purpose}&secret=${otp.secret}&type=${otp.type}`;
|
|
15
|
+
return (
|
|
16
|
+
<Layout previewText="Reset your password">
|
|
17
|
+
<Header title="Reset Your Password" />
|
|
18
|
+
<Greeting name={user?.displayName} />
|
|
19
|
+
<Text className="text-base text-gray-900">
|
|
20
|
+
Use the code below to reset your password.
|
|
21
|
+
</Text>
|
|
22
|
+
<ActionBlock link={link} label="Reset password" otp={otp} />
|
|
23
|
+
</Layout>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<Layout previewText="Password reset successful">
|
|
29
|
+
<Header title="Password Reset Successful" />
|
|
30
|
+
<Greeting name={user?.displayName} />
|
|
31
|
+
<Text className="text-base text-gray-900">
|
|
32
|
+
Your password has been updated.
|
|
33
|
+
</Text>
|
|
34
|
+
</Layout>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
ResetPassword.subject = (props) =>
|
|
39
|
+
props.otp ? "Reset your password" : "Password reset successful";
|
|
40
|
+
ResetPassword.message = (props) =>
|
|
41
|
+
props.otp ? `Reset code: ${props.otp.secret}` : "Password reset.";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
|
|
6
|
+
export const SecurityAlert: EmailTemplateComponent = ({ user, message }) => (
|
|
7
|
+
<Layout previewText="Security alert">
|
|
8
|
+
<Header title="Security Alert" />
|
|
9
|
+
<Greeting name={user?.displayName} />
|
|
10
|
+
<table className="w-full bg-red-50 rounded-lg my-4">
|
|
11
|
+
<tr>
|
|
12
|
+
<td className="p-4">
|
|
13
|
+
<Text className="m-0 text-red-800 font-semibold">{message}</Text>
|
|
14
|
+
</td>
|
|
15
|
+
</tr>
|
|
16
|
+
</table>
|
|
17
|
+
</Layout>
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
SecurityAlert.subject = () => "Security alert";
|
|
21
|
+
SecurityAlert.message = (props) => `Security alert: ${props.message}`;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { appName } from "@workspace/shared/constants";
|
|
6
|
+
import { ActionBlock } from "../components/actionBlock";
|
|
7
|
+
|
|
8
|
+
export const SetPassword: EmailTemplateComponent = ({
|
|
9
|
+
user,
|
|
10
|
+
otp,
|
|
11
|
+
identifier,
|
|
12
|
+
clientUrl,
|
|
13
|
+
}) => {
|
|
14
|
+
if (otp) {
|
|
15
|
+
const link = `${clientUrl}/auth/set-password?identifier=${identifier}&purpose=${otp.purpose}&secret=${otp.secret}&type=${otp.type}`;
|
|
16
|
+
return (
|
|
17
|
+
<Layout previewText="Set your password">
|
|
18
|
+
<Header title="Set Your Password" />
|
|
19
|
+
<Greeting name={user?.displayName} />
|
|
20
|
+
<Text className="text-base text-gray-900">
|
|
21
|
+
Create a password to access your {appName.default} travel account.
|
|
22
|
+
</Text>
|
|
23
|
+
<ActionBlock link={link} label="Set password" otp={otp} />
|
|
24
|
+
</Layout>
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<Layout previewText="Password set successfully">
|
|
30
|
+
<Header title="Password Set Successfully" />
|
|
31
|
+
<Greeting name={user?.displayName} />
|
|
32
|
+
<Text className="text-base text-gray-900">
|
|
33
|
+
Your password has been created successfully.
|
|
34
|
+
</Text>
|
|
35
|
+
</Layout>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
SetPassword.subject = (props) =>
|
|
40
|
+
props.otp ? "Set your password" : "Password set successfully";
|
|
41
|
+
SetPassword.message = (props) =>
|
|
42
|
+
props.otp ? `Your setup code is ${props.otp.secret}` : "Password set.";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
|
|
6
|
+
export const Signin: EmailTemplateComponent = ({ user }) => (
|
|
7
|
+
<Layout previewText="New sign-in detected">
|
|
8
|
+
<Header title="New Sign-in Detected" />
|
|
9
|
+
<Greeting name={user?.displayName} />
|
|
10
|
+
<Text className="text-base text-gray-900">
|
|
11
|
+
A sign-in to your travel account was detected.
|
|
12
|
+
</Text>
|
|
13
|
+
<Text className="text-base text-gray-900">
|
|
14
|
+
If this wasn't you, please secure your account immediately.
|
|
15
|
+
</Text>
|
|
16
|
+
</Layout>
|
|
17
|
+
);
|
|
18
|
+
Signin.subject = () => "New sign-in detected";
|
|
19
|
+
Signin.message = () => "New sign-in detected.";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { appName } from "@workspace/shared/constants";
|
|
6
|
+
|
|
7
|
+
export const Signup: EmailTemplateComponent = ({ user }) => (
|
|
8
|
+
<Layout previewText={`Welcome to ${appName.default}`}>
|
|
9
|
+
<Header
|
|
10
|
+
title={`Welcome to ${appName.default}`}
|
|
11
|
+
subtitle="Your travel account is ready"
|
|
12
|
+
/>
|
|
13
|
+
<Greeting name={user?.displayName} />
|
|
14
|
+
<Text className="text-base text-gray-900">
|
|
15
|
+
Your travel agency account has been successfully created.
|
|
16
|
+
</Text>
|
|
17
|
+
<Text className="text-base text-gray-900">
|
|
18
|
+
You can now sign in and start planning your next adventure.
|
|
19
|
+
</Text>
|
|
20
|
+
</Layout>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
Signup.subject = () => `Welcome to ${appName.default}`;
|
|
24
|
+
Signup.message = () => `Welcome to ${appName.default}. Your account is ready.`;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { ActionBlock } from "../components/actionBlock";
|
|
6
|
+
|
|
7
|
+
export const UpdateIdentifier: EmailTemplateComponent = ({
|
|
8
|
+
user,
|
|
9
|
+
otp,
|
|
10
|
+
identifier,
|
|
11
|
+
newIdentifier,
|
|
12
|
+
clientUrl,
|
|
13
|
+
}) => {
|
|
14
|
+
const type = identifier?.includes("@") ? "email" : "phone number";
|
|
15
|
+
const subjectType = type === "email" ? "Email" : "Phone";
|
|
16
|
+
|
|
17
|
+
if (otp) {
|
|
18
|
+
const link = `${clientUrl}/auth/verify?identifier=${identifier}&newIdentifier=${newIdentifier}&purpose=${otp.purpose}&secret=${otp.secret}&type=${otp.type}`;
|
|
19
|
+
return (
|
|
20
|
+
<Layout previewText={`${subjectType} change request`}>
|
|
21
|
+
<Header
|
|
22
|
+
title={`${type === "email" ? "Email" : "Phone Number"} Change Request`}
|
|
23
|
+
subtitle={`Confirm your new ${type}`}
|
|
24
|
+
/>
|
|
25
|
+
<Greeting name={user?.displayName} />
|
|
26
|
+
<Text className="text-base text-gray-900">
|
|
27
|
+
A request was made to change your {type}.
|
|
28
|
+
</Text>
|
|
29
|
+
{newIdentifier && (
|
|
30
|
+
<>
|
|
31
|
+
<Text className="text-base text-gray-900">
|
|
32
|
+
Current {subjectType}: <strong>{identifier}</strong>
|
|
33
|
+
</Text>
|
|
34
|
+
<Text className="text-base text-gray-900">
|
|
35
|
+
New {subjectType}: <strong>{newIdentifier}</strong>
|
|
36
|
+
</Text>
|
|
37
|
+
</>
|
|
38
|
+
)}
|
|
39
|
+
<ActionBlock
|
|
40
|
+
link={link}
|
|
41
|
+
label={`Confirm ${subjectType} Change`}
|
|
42
|
+
otp={otp}
|
|
43
|
+
/>
|
|
44
|
+
</Layout>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<Layout previewText={`${subjectType} updated`}>
|
|
50
|
+
<Header
|
|
51
|
+
title={`${type === "email" ? "Email Address" : "Phone Number"} Updated`}
|
|
52
|
+
/>
|
|
53
|
+
<Greeting name={user?.displayName} />
|
|
54
|
+
<Text className="text-base text-gray-900">
|
|
55
|
+
Your {type} has been successfully updated.
|
|
56
|
+
</Text>
|
|
57
|
+
{newIdentifier && (
|
|
58
|
+
<>
|
|
59
|
+
<Text className="text-base text-gray-900">
|
|
60
|
+
Previous {subjectType}: <strong>{identifier}</strong>
|
|
61
|
+
</Text>
|
|
62
|
+
<Text className="text-base text-gray-900">
|
|
63
|
+
New {subjectType}: <strong>{newIdentifier}</strong>
|
|
64
|
+
</Text>
|
|
65
|
+
</>
|
|
66
|
+
)}
|
|
67
|
+
</Layout>
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
UpdateIdentifier.subject = (props) => {
|
|
72
|
+
const type = props.identifier?.includes("@") ? "email" : "phone number";
|
|
73
|
+
const subjectType = type === "email" ? "Email" : "Phone";
|
|
74
|
+
return props.otp ? `${subjectType} change request` : `${subjectType} updated`;
|
|
75
|
+
};
|
|
76
|
+
UpdateIdentifier.message = (props) => {
|
|
77
|
+
const type = props.identifier?.includes("@") ? "email" : "phone number";
|
|
78
|
+
return props.otp ? `Confirm ${type} change.` : `${type} updated.`;
|
|
79
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { NumericCode } from "../components/numericCode";
|
|
6
|
+
|
|
7
|
+
export const UpdateMfa: EmailTemplateComponent = ({ user, otp }) => {
|
|
8
|
+
if (otp) {
|
|
9
|
+
return (
|
|
10
|
+
<Layout previewText="Enable two-factor authentication">
|
|
11
|
+
<Header title="Enable Two-Factor Authentication" />
|
|
12
|
+
<Greeting name={user?.displayName} />
|
|
13
|
+
<Text className="text-base text-gray-900">
|
|
14
|
+
Use the code below to enable 2FA for your travel account.
|
|
15
|
+
</Text>
|
|
16
|
+
<NumericCode code={otp.secret} />
|
|
17
|
+
<Text className="text-xs text-gray-500 text-center">
|
|
18
|
+
This code expires in 15 minutes.
|
|
19
|
+
</Text>
|
|
20
|
+
</Layout>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<Layout previewText="Two-factor authentication enabled">
|
|
26
|
+
<Header title="2FA Enabled Successfully" />
|
|
27
|
+
<Greeting name={user?.displayName} />
|
|
28
|
+
<Text className="text-base text-gray-900">
|
|
29
|
+
Two-factor authentication is now active on your account.
|
|
30
|
+
</Text>
|
|
31
|
+
</Layout>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
UpdateMfa.subject = (props) =>
|
|
36
|
+
props.otp
|
|
37
|
+
? "Enable two-factor authentication"
|
|
38
|
+
: "Two-factor authentication enabled";
|
|
39
|
+
UpdateMfa.message = (props) =>
|
|
40
|
+
props.otp ? `Your 2FA setup code is ${props.otp.secret}.` : "2FA enabled.";
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { ActionBlock } from "../components/actionBlock";
|
|
6
|
+
|
|
7
|
+
export const VerifyIdentifier: EmailTemplateComponent = ({
|
|
8
|
+
user,
|
|
9
|
+
otp,
|
|
10
|
+
identifier,
|
|
11
|
+
clientUrl,
|
|
12
|
+
}) => {
|
|
13
|
+
const type = identifier?.includes("@") ? "email" : "phone number";
|
|
14
|
+
const typeLabel = type === "email" ? "Email Address" : "Phone Number";
|
|
15
|
+
const link = `${clientUrl}/auth/verify?identifier=${identifier}&purpose=${otp?.purpose}&secret=${otp?.secret}&type=${otp?.type}`;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<Layout previewText={`Verify your ${type}`}>
|
|
19
|
+
<Header title={`Verify Your ${typeLabel}`} />
|
|
20
|
+
<Greeting name={user?.displayName} />
|
|
21
|
+
<Text className="text-base text-gray-900">
|
|
22
|
+
Please verify your {type} to activate your travel account.
|
|
23
|
+
</Text>
|
|
24
|
+
{otp ? (
|
|
25
|
+
<ActionBlock link={link} label={`Verify ${type}`} otp={otp} />
|
|
26
|
+
) : (
|
|
27
|
+
<Text className="text-base text-gray-900">
|
|
28
|
+
Your {type} has been verified successfully.
|
|
29
|
+
</Text>
|
|
30
|
+
)}
|
|
31
|
+
</Layout>
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
VerifyIdentifier.subject = (props) => {
|
|
36
|
+
const type = props.identifier?.includes("@") ? "email" : "phone number";
|
|
37
|
+
return `Verify your ${type}`;
|
|
38
|
+
};
|
|
39
|
+
VerifyIdentifier.message = (props) =>
|
|
40
|
+
props.otp
|
|
41
|
+
? `Verification code: ${props.otp.secret}`
|
|
42
|
+
: "Your identifier has been verified.";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { NumericCode } from "../components/numericCode";
|
|
6
|
+
|
|
7
|
+
export const VerifyMfa: EmailTemplateComponent = ({ user, otp }) => (
|
|
8
|
+
<Layout previewText="Your security code">
|
|
9
|
+
<Header title="Security Code" />
|
|
10
|
+
<Greeting name={user?.displayName} />
|
|
11
|
+
<Text className="text-base text-gray-900">
|
|
12
|
+
Use the code below to complete your sign-in.
|
|
13
|
+
</Text>
|
|
14
|
+
{otp && <NumericCode code={otp.secret} />}
|
|
15
|
+
<Text className="text-xs text-gray-500 text-center">
|
|
16
|
+
This code expires in 15 minutes.
|
|
17
|
+
</Text>
|
|
18
|
+
</Layout>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
VerifyMfa.subject = () => "Your security code";
|
|
22
|
+
VerifyMfa.message = (props) =>
|
|
23
|
+
props.otp ? `Your security code is ${props.otp.secret}.` : "";
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Section, Text, Button } from "@react-email/components";
|
|
2
|
+
import { NumericCode } from "./numericCode";
|
|
3
|
+
import type { Otp } from "@workspace/contracts";
|
|
4
|
+
import { diffInMinutes } from "@workspace/shared/utils";
|
|
5
|
+
|
|
6
|
+
interface ActionBlockProps {
|
|
7
|
+
link: string;
|
|
8
|
+
label: string;
|
|
9
|
+
otp?: Otp;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const ActionBlock = ({ link, label, otp }: ActionBlockProps) => (
|
|
13
|
+
<Section className="my-7 text-center">
|
|
14
|
+
{otp?.type === "numericCode" ? (
|
|
15
|
+
<>
|
|
16
|
+
<Text className="text-sm text-gray-500">
|
|
17
|
+
Use the verification code below
|
|
18
|
+
</Text>
|
|
19
|
+
<NumericCode code={otp.secret} />
|
|
20
|
+
<Text className="text-xs text-gray-500 text-center">
|
|
21
|
+
This code expires in {diffInMinutes(otp.expiresAt)} minutes.
|
|
22
|
+
</Text>
|
|
23
|
+
<Button
|
|
24
|
+
href={link}
|
|
25
|
+
className="inline-block px-5 py-3 bg-rose-600 text-white rounded-lg font-semibold no-underline"
|
|
26
|
+
>
|
|
27
|
+
{label}
|
|
28
|
+
</Button>
|
|
29
|
+
</>
|
|
30
|
+
) : (
|
|
31
|
+
<Button
|
|
32
|
+
href={link}
|
|
33
|
+
className="inline-block px-5 py-3 bg-rose-600 text-white rounded-lg font-semibold no-underline"
|
|
34
|
+
>
|
|
35
|
+
{label}
|
|
36
|
+
</Button>
|
|
37
|
+
)}
|
|
38
|
+
</Section>
|
|
39
|
+
);
|
|
File without changes
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Text } from "@react-email/components";
|
|
2
|
+
|
|
3
|
+
interface GreetingProps {
|
|
4
|
+
name?: string | null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export const Greeting = ({ name }: GreetingProps) => (
|
|
8
|
+
<Text className="text-base text-gray-900">
|
|
9
|
+
Hello <strong>{name ?? "there"}</strong>,
|
|
10
|
+
</Text>
|
|
11
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Heading, Text } from "@react-email/components";
|
|
2
|
+
|
|
3
|
+
interface HeaderProps {
|
|
4
|
+
title: string;
|
|
5
|
+
subtitle?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const Header = ({ title, subtitle }: HeaderProps) => (
|
|
9
|
+
<>
|
|
10
|
+
<Heading className="text-xl font-semibold text-gray-900 mb-1">
|
|
11
|
+
{title}
|
|
12
|
+
</Heading>
|
|
13
|
+
{subtitle && <Text className="text-sm text-gray-500 mb-6">{subtitle}</Text>}
|
|
14
|
+
</>
|
|
15
|
+
);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Html,
|
|
3
|
+
Body,
|
|
4
|
+
Container,
|
|
5
|
+
Hr,
|
|
6
|
+
Text,
|
|
7
|
+
Preview,
|
|
8
|
+
Tailwind,
|
|
9
|
+
} from "@react-email/components";
|
|
10
|
+
import { appName } from "@workspace/shared/constants";
|
|
11
|
+
|
|
12
|
+
interface LayoutProps {
|
|
13
|
+
children: React.ReactNode;
|
|
14
|
+
previewText?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const Layout = ({ children, previewText }: LayoutProps) => (
|
|
18
|
+
<Html>
|
|
19
|
+
{previewText && <Preview>{previewText}</Preview>}
|
|
20
|
+
<Tailwind>
|
|
21
|
+
<Body className="bg-gray-50 font-sans">
|
|
22
|
+
<Container className="mx-auto max-w-150 bg-white rounded-lg border border-gray-200 p-8 my-8">
|
|
23
|
+
{children}
|
|
24
|
+
<Hr className="my-8 border-gray-200" />
|
|
25
|
+
<Text className="text-xs text-gray-500">
|
|
26
|
+
Sent by <strong>{appName.default}</strong>
|
|
27
|
+
<br />© {new Date().getFullYear()} {appName.default}
|
|
28
|
+
</Text>
|
|
29
|
+
</Container>
|
|
30
|
+
</Body>
|
|
31
|
+
</Tailwind>
|
|
32
|
+
</Html>
|
|
33
|
+
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface NumericCodeProps {
|
|
2
|
+
code: string;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export const NumericCode = ({ code }: NumericCodeProps) => (
|
|
6
|
+
<div className="my-5 text-center">
|
|
7
|
+
{code.split("").map((digit, i) => (
|
|
8
|
+
<span
|
|
9
|
+
key={i}
|
|
10
|
+
className="inline-block min-w-11 py-3 mx-1 bg-gray-50 border border-gray-200 rounded-lg text-xl font-mono font-bold text-gray-900"
|
|
11
|
+
>
|
|
12
|
+
{digit}
|
|
13
|
+
</span>
|
|
14
|
+
))}
|
|
15
|
+
</div>
|
|
16
|
+
);
|
package/templates/monorepo-starter/packages/templates/src/email/service/accountReactivated.tsx
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { appName } from "@workspace/shared/constants";
|
|
6
|
+
|
|
7
|
+
export const AccountReactivated: EmailTemplateComponent = ({ user }) => {
|
|
8
|
+
return (
|
|
9
|
+
<Layout previewText="Your account has been reactivated">
|
|
10
|
+
<Header
|
|
11
|
+
title="Account Reactivated"
|
|
12
|
+
subtitle={`Welcome back to ${appName.default}`}
|
|
13
|
+
/>
|
|
14
|
+
<Greeting name={user?.displayName} />
|
|
15
|
+
<Text className="text-base text-gray-900">
|
|
16
|
+
Great news! Your {appName.default} travel account has been successfully
|
|
17
|
+
reactivated.
|
|
18
|
+
</Text>
|
|
19
|
+
<Text className="text-base text-gray-900">
|
|
20
|
+
You can now sign in and continue planning your trips without any
|
|
21
|
+
restrictions.
|
|
22
|
+
</Text>
|
|
23
|
+
</Layout>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
AccountReactivated.subject = () =>
|
|
28
|
+
`Your ${appName.default} account has been reactivated`;
|
|
29
|
+
|
|
30
|
+
AccountReactivated.message = () =>
|
|
31
|
+
`Your ${appName.default} account has been successfully reactivated.`;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Layout } from "../components/layout";
|
|
2
|
+
import { Header } from "../components/header";
|
|
3
|
+
import { Greeting } from "../components/greeting";
|
|
4
|
+
import { Text } from "@react-email/components";
|
|
5
|
+
import { appName } from "@workspace/shared/constants";
|
|
6
|
+
|
|
7
|
+
export const AccountSuspended: EmailTemplateComponent = ({ user, message }) => {
|
|
8
|
+
return (
|
|
9
|
+
<Layout previewText="Your account has been suspended">
|
|
10
|
+
<Header
|
|
11
|
+
title="Account Suspended"
|
|
12
|
+
subtitle={`${appName.default} Travel Account Notice`}
|
|
13
|
+
/>
|
|
14
|
+
<Greeting name={user?.displayName} />
|
|
15
|
+
<Text className="text-base text-gray-900">
|
|
16
|
+
Your {appName.default} account has been temporarily suspended.
|
|
17
|
+
</Text>
|
|
18
|
+
|
|
19
|
+
{message && (
|
|
20
|
+
<Text className="text-base text-gray-900">Reason: {message}</Text>
|
|
21
|
+
)}
|
|
22
|
+
|
|
23
|
+
<Text className="text-base text-gray-900">
|
|
24
|
+
If you believe this is a mistake or need further assistance, please
|
|
25
|
+
contact our support team.
|
|
26
|
+
</Text>
|
|
27
|
+
</Layout>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
AccountSuspended.subject = () =>
|
|
32
|
+
`Your ${appName.default} account has been suspended`;
|
|
33
|
+
|
|
34
|
+
AccountSuspended.message = (props) =>
|
|
35
|
+
`Your ${appName.default} account has been suspended${
|
|
36
|
+
props.message ? `. Reason: ${props.message}` : "."
|
|
37
|
+
}`;
|