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.
Files changed (349) hide show
  1. package/README.md +1 -1
  2. package/bin/index.js +0 -0
  3. package/package.json +3 -3
  4. package/templates/monorepo-starter/apps/dashboard/components.json +20 -0
  5. package/templates/monorepo-starter/apps/dashboard/eslint.config.js +1 -0
  6. package/templates/monorepo-starter/apps/dashboard/next-env.d.ts +6 -0
  7. package/templates/monorepo-starter/apps/dashboard/next.config.mjs +30 -0
  8. package/templates/monorepo-starter/apps/dashboard/package.json +43 -0
  9. package/templates/monorepo-starter/apps/dashboard/postcss.config.mjs +1 -0
  10. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/edit/page.tsx +8 -0
  11. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/page.tsx +104 -0
  12. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/new/page.tsx +7 -0
  13. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/page.tsx +88 -0
  14. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/data.json +614 -0
  15. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/page.tsx +21 -0
  16. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/layout.tsx +40 -0
  17. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/media/page.tsx +7 -0
  18. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/users/account/page.tsx +75 -0
  19. package/templates/monorepo-starter/apps/dashboard/src/app/auth/[type]/page.tsx +19 -0
  20. package/templates/monorepo-starter/apps/dashboard/src/app/auth/layout.tsx +11 -0
  21. package/templates/monorepo-starter/apps/dashboard/src/app/auth/verify/page.tsx +11 -0
  22. package/templates/monorepo-starter/apps/dashboard/src/app/favicon.ico +0 -0
  23. package/templates/monorepo-starter/apps/dashboard/src/app/layout.tsx +28 -0
  24. package/templates/monorepo-starter/apps/dashboard/src/components/forms/AuthForm.tsx +345 -0
  25. package/templates/monorepo-starter/apps/dashboard/src/components/forms/CUUserForm.tsx +223 -0
  26. package/templates/monorepo-starter/apps/dashboard/src/components/forms/MediaForm.tsx +35 -0
  27. package/templates/monorepo-starter/apps/dashboard/src/components/forms/SocialAuthField.tsx +56 -0
  28. package/templates/monorepo-starter/apps/dashboard/src/components/layout/AppSidebar.tsx +141 -0
  29. package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardChart.tsx +293 -0
  30. package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardStats.tsx +104 -0
  31. package/templates/monorepo-starter/apps/dashboard/src/components/layout/Header.tsx +21 -0
  32. package/templates/monorepo-starter/apps/dashboard/src/components/layout/NavMain.tsx +99 -0
  33. package/templates/monorepo-starter/apps/dashboard/src/components/media/LibraryPopup.tsx +25 -0
  34. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaCard.tsx +175 -0
  35. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaDetails.tsx +58 -0
  36. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaGrid.tsx +51 -0
  37. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaUploader.tsx +182 -0
  38. package/templates/monorepo-starter/apps/dashboard/src/components/media/index.tsx +96 -0
  39. package/templates/monorepo-starter/apps/dashboard/src/components/shared/DateWrapper.tsx +43 -0
  40. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericArrayField.tsx +189 -0
  41. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericCUForm.tsx +124 -0
  42. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericDetailsPage.tsx +291 -0
  43. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericFormTable.tsx +189 -0
  44. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericTable.tsx +244 -0
  45. package/templates/monorepo-starter/apps/dashboard/src/components/shared/ListPage.tsx +134 -0
  46. package/templates/monorepo-starter/apps/dashboard/src/components/shared/Pagination.tsx +120 -0
  47. package/templates/monorepo-starter/apps/dashboard/src/components/shared/SearchToolbar.tsx +133 -0
  48. package/templates/monorepo-starter/apps/dashboard/src/components/shared/ThemeSwitch.tsx +41 -0
  49. package/templates/monorepo-starter/apps/dashboard/src/components/shared/VerifyAuthPage.tsx +109 -0
  50. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/CUFormSkeleton.tsx +31 -0
  51. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DashboardSke1eton.tsx +135 -0
  52. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DetailsPageSkeleton.tsx +64 -0
  53. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/RootLayoutSkeleton.tsx +106 -0
  54. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/TableSkeleton.tsx +77 -0
  55. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserAccountSection.tsx +530 -0
  56. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserCard.tsx +54 -0
  57. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserProfileSection.tsx +239 -0
  58. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserSessions.tsx +154 -0
  59. package/templates/monorepo-starter/apps/dashboard/src/hooks/admin.ts +100 -0
  60. package/templates/monorepo-starter/apps/dashboard/src/hooks/auth.ts +59 -0
  61. package/templates/monorepo-starter/apps/dashboard/src/hooks/crud.ts +275 -0
  62. package/templates/monorepo-starter/apps/dashboard/src/hooks/lookup.ts +38 -0
  63. package/templates/monorepo-starter/apps/dashboard/src/hooks/media.ts +34 -0
  64. package/templates/monorepo-starter/apps/dashboard/src/hooks/user.ts +58 -0
  65. package/templates/monorepo-starter/apps/dashboard/src/lib/constants.ts +61 -0
  66. package/templates/monorepo-starter/apps/dashboard/src/providers/index.tsx +15 -0
  67. package/templates/monorepo-starter/apps/dashboard/src/providers/media-library.tsx +48 -0
  68. package/templates/monorepo-starter/apps/dashboard/tsconfig.json +20 -0
  69. package/templates/monorepo-starter/apps/web/components.json +20 -20
  70. package/templates/monorepo-starter/apps/web/eslint.config.js +1 -0
  71. package/templates/monorepo-starter/apps/web/next-env.d.ts +6 -6
  72. package/templates/monorepo-starter/apps/web/next.config.mjs +20 -6
  73. package/templates/monorepo-starter/apps/web/package.json +36 -31
  74. package/templates/monorepo-starter/apps/web/postcss.config.mjs +1 -1
  75. package/templates/monorepo-starter/apps/web/src/app/(root)/layout.tsx +2 -2
  76. package/templates/monorepo-starter/apps/web/src/app/favicon.ico +0 -0
  77. package/templates/monorepo-starter/apps/web/src/app/layout.tsx +13 -9
  78. package/templates/monorepo-starter/apps/web/src/components/Footer.tsx +5 -7
  79. package/templates/monorepo-starter/apps/web/src/components/Header.tsx +5 -9
  80. package/templates/monorepo-starter/apps/web/tsconfig.json +20 -20
  81. package/templates/monorepo-starter/eslint.config.mjs +1 -1
  82. package/templates/monorepo-starter/gitignore +13 -4
  83. package/templates/monorepo-starter/package.json +49 -23
  84. package/templates/monorepo-starter/packages/config/eslint/next.mjs +18 -0
  85. package/templates/monorepo-starter/packages/config/eslint/node.mjs +44 -0
  86. package/templates/monorepo-starter/packages/config/eslint/react.mjs +68 -0
  87. package/templates/monorepo-starter/packages/config/package.json +23 -32
  88. package/templates/monorepo-starter/packages/config/typescript/node.json +25 -0
  89. package/templates/monorepo-starter/packages/config/typescript/react.json +20 -3
  90. package/templates/monorepo-starter/packages/contracts/eslint.config.mjs +1 -0
  91. package/templates/monorepo-starter/packages/contracts/package.json +51 -0
  92. package/templates/monorepo-starter/packages/contracts/src/admin/dto.ts +6 -0
  93. package/templates/monorepo-starter/packages/contracts/src/admin/index.ts +2 -0
  94. package/templates/monorepo-starter/packages/contracts/src/admin/schema.ts +28 -0
  95. package/templates/monorepo-starter/packages/contracts/src/admin/types.d.ts +27 -0
  96. package/templates/monorepo-starter/packages/contracts/src/auth/dto.ts +24 -0
  97. package/templates/monorepo-starter/packages/contracts/src/auth/index.ts +2 -0
  98. package/templates/monorepo-starter/packages/contracts/src/auth/schema.ts +35 -0
  99. package/templates/monorepo-starter/packages/contracts/src/auth/types.d.ts +73 -0
  100. package/templates/monorepo-starter/packages/contracts/src/lib/enums.ts +55 -0
  101. package/templates/monorepo-starter/packages/contracts/src/lib/index.ts +4 -0
  102. package/templates/monorepo-starter/packages/contracts/src/lib/prisma.ts +2 -0
  103. package/templates/monorepo-starter/packages/contracts/src/lib/schema.ts +61 -0
  104. package/templates/monorepo-starter/packages/contracts/src/lib/types.d.ts +149 -0
  105. package/templates/monorepo-starter/packages/contracts/src/lib/utils.ts +8 -0
  106. package/templates/monorepo-starter/packages/contracts/src/media/dto.ts +12 -0
  107. package/templates/monorepo-starter/packages/contracts/src/media/index.ts +2 -0
  108. package/templates/monorepo-starter/packages/contracts/src/media/schema.ts +27 -0
  109. package/templates/monorepo-starter/packages/contracts/src/media/types.d.ts +36 -0
  110. package/templates/monorepo-starter/packages/contracts/src/notification/dto.ts +6 -0
  111. package/templates/monorepo-starter/packages/contracts/src/notification/index.ts +2 -0
  112. package/templates/monorepo-starter/packages/contracts/src/notification/schema.ts +7 -0
  113. package/templates/monorepo-starter/packages/contracts/src/notification/types.d.ts +22 -0
  114. package/templates/monorepo-starter/packages/contracts/src/user/dto.ts +4 -0
  115. package/templates/monorepo-starter/packages/contracts/src/user/index.ts +2 -0
  116. package/templates/monorepo-starter/packages/contracts/src/user/schema.ts +16 -0
  117. package/templates/monorepo-starter/packages/contracts/src/user/types.d.ts +36 -0
  118. package/templates/monorepo-starter/packages/contracts/tsconfig.json +12 -0
  119. package/templates/monorepo-starter/packages/contracts/tsup.config.ts +20 -0
  120. package/templates/monorepo-starter/packages/sdk/eslint.config.mjs +1 -0
  121. package/templates/monorepo-starter/packages/sdk/package.json +31 -0
  122. package/templates/monorepo-starter/packages/sdk/src/admin/index.ts +31 -0
  123. package/templates/monorepo-starter/packages/sdk/src/auth/index.ts +71 -0
  124. package/templates/monorepo-starter/packages/sdk/src/lib/api-client.ts +71 -0
  125. package/templates/monorepo-starter/packages/sdk/src/lib/index.ts +2 -0
  126. package/templates/monorepo-starter/packages/sdk/src/lib/types.ts +40 -0
  127. package/templates/monorepo-starter/packages/sdk/src/media/index.ts +27 -0
  128. package/templates/monorepo-starter/packages/sdk/src/notification/index.ts +10 -0
  129. package/templates/monorepo-starter/packages/sdk/src/public/index.ts +6 -0
  130. package/templates/monorepo-starter/packages/sdk/src/user/index.ts +7 -0
  131. package/templates/monorepo-starter/packages/sdk/tsconfig.json +12 -0
  132. package/templates/monorepo-starter/packages/shared/eslint.config.mjs +1 -0
  133. package/templates/monorepo-starter/packages/shared/package.json +36 -0
  134. package/templates/monorepo-starter/packages/shared/src/constants/app.ts +4 -0
  135. package/templates/monorepo-starter/packages/shared/src/constants/index.ts +1 -0
  136. package/templates/monorepo-starter/packages/shared/src/utils/date.ts +137 -0
  137. package/templates/monorepo-starter/packages/shared/src/utils/identifier.ts +11 -0
  138. package/templates/monorepo-starter/packages/shared/src/utils/index.ts +2 -0
  139. package/templates/monorepo-starter/packages/shared/tsconfig.json +12 -0
  140. package/templates/monorepo-starter/packages/shared/tsup.config.ts +16 -0
  141. package/templates/monorepo-starter/packages/templates/eslint.config.mjs +1 -0
  142. package/templates/monorepo-starter/packages/templates/package.json +38 -0
  143. package/templates/monorepo-starter/packages/templates/src/email/auth/disableMfa.tsx +40 -0
  144. package/templates/monorepo-starter/packages/templates/src/email/auth/index.ts +10 -0
  145. package/templates/monorepo-starter/packages/templates/src/email/auth/resetPassword.tsx +41 -0
  146. package/templates/monorepo-starter/packages/templates/src/email/auth/securityAlert.tsx +21 -0
  147. package/templates/monorepo-starter/packages/templates/src/email/auth/setPassword.tsx +42 -0
  148. package/templates/monorepo-starter/packages/templates/src/email/auth/signin.tsx +19 -0
  149. package/templates/monorepo-starter/packages/templates/src/email/auth/signup.tsx +24 -0
  150. package/templates/monorepo-starter/packages/templates/src/email/auth/updateIdentifier.tsx +79 -0
  151. package/templates/monorepo-starter/packages/templates/src/email/auth/updateMfa.tsx +40 -0
  152. package/templates/monorepo-starter/packages/templates/src/email/auth/verifyIdentifier.tsx +42 -0
  153. package/templates/monorepo-starter/packages/templates/src/email/auth/verifyMfa.tsx +23 -0
  154. package/templates/monorepo-starter/packages/templates/src/email/components/actionBlock.tsx +39 -0
  155. package/templates/monorepo-starter/packages/templates/src/email/components/footer.tsx +0 -0
  156. package/templates/monorepo-starter/packages/templates/src/email/components/greeting.tsx +11 -0
  157. package/templates/monorepo-starter/packages/templates/src/email/components/header.tsx +15 -0
  158. package/templates/monorepo-starter/packages/templates/src/email/components/layout.tsx +33 -0
  159. package/templates/monorepo-starter/packages/templates/src/email/components/numericCode.tsx +16 -0
  160. package/templates/monorepo-starter/packages/templates/src/email/index.ts +2 -0
  161. package/templates/monorepo-starter/packages/templates/src/email/service/accountReactivated.tsx +31 -0
  162. package/templates/monorepo-starter/packages/templates/src/email/service/accountSuspended.tsx +37 -0
  163. package/templates/monorepo-starter/packages/templates/src/email/service/index.ts +2 -0
  164. package/templates/monorepo-starter/packages/templates/src/email/test.tsx +141 -0
  165. package/templates/monorepo-starter/packages/templates/src/index.ts +1 -0
  166. package/templates/monorepo-starter/packages/templates/src/lib/constants.ts +22 -0
  167. package/templates/monorepo-starter/packages/templates/src/lib/utils.ts +19 -0
  168. package/templates/monorepo-starter/packages/templates/src/types/global.d.ts +37 -0
  169. package/templates/monorepo-starter/packages/templates/tsconfig.json +13 -0
  170. package/templates/monorepo-starter/packages/templates/tsup.config.ts +23 -0
  171. package/templates/monorepo-starter/packages/ui/components.json +1 -1
  172. package/templates/monorepo-starter/packages/ui/eslint.config.mjs +1 -4
  173. package/templates/monorepo-starter/packages/ui/package.json +81 -38
  174. package/templates/monorepo-starter/packages/ui/src/components/accordion.tsx +66 -0
  175. package/templates/monorepo-starter/packages/ui/src/components/airport-search-field.tsx +203 -0
  176. package/templates/monorepo-starter/packages/ui/src/components/alert-dialog.tsx +157 -0
  177. package/templates/monorepo-starter/packages/ui/src/components/alert.tsx +66 -0
  178. package/templates/monorepo-starter/packages/ui/src/components/aspect-ratio.tsx +11 -0
  179. package/templates/monorepo-starter/packages/ui/src/components/avatar.tsx +53 -0
  180. package/templates/monorepo-starter/packages/ui/src/components/badge.tsx +46 -0
  181. package/templates/monorepo-starter/packages/ui/src/components/breadcrumb.tsx +109 -0
  182. package/templates/monorepo-starter/packages/ui/src/components/button-group.tsx +83 -0
  183. package/templates/monorepo-starter/packages/ui/src/components/button.tsx +2 -1
  184. package/templates/monorepo-starter/packages/ui/src/components/calendar.tsx +220 -0
  185. package/templates/monorepo-starter/packages/ui/src/components/card.tsx +92 -0
  186. package/templates/monorepo-starter/packages/ui/src/components/carousel.tsx +241 -0
  187. package/templates/monorepo-starter/packages/ui/src/components/chart.tsx +357 -0
  188. package/templates/monorepo-starter/packages/ui/src/components/checkbox.tsx +32 -0
  189. package/templates/monorepo-starter/packages/ui/src/components/collapsible.tsx +33 -0
  190. package/templates/monorepo-starter/packages/ui/src/components/combobox-field.tsx +181 -0
  191. package/templates/monorepo-starter/packages/ui/src/components/combobox.tsx +309 -0
  192. package/templates/monorepo-starter/packages/ui/src/components/command.tsx +184 -0
  193. package/templates/monorepo-starter/packages/ui/src/components/context-menu.tsx +252 -0
  194. package/templates/monorepo-starter/packages/ui/src/components/date-field.tsx +65 -0
  195. package/templates/monorepo-starter/packages/ui/src/components/dialog.tsx +143 -0
  196. package/templates/monorepo-starter/packages/ui/src/components/direction.tsx +22 -0
  197. package/templates/monorepo-starter/packages/ui/src/components/drawer.tsx +135 -0
  198. package/templates/monorepo-starter/packages/ui/src/components/dropdown-menu.tsx +257 -0
  199. package/templates/monorepo-starter/packages/ui/src/components/empty.tsx +104 -0
  200. package/templates/monorepo-starter/packages/ui/src/components/field.tsx +248 -0
  201. package/templates/monorepo-starter/packages/ui/src/components/form.tsx +197 -0
  202. package/templates/monorepo-starter/packages/ui/src/components/hover-card.tsx +44 -0
  203. package/templates/monorepo-starter/packages/ui/src/components/input-field.tsx +116 -0
  204. package/templates/monorepo-starter/packages/ui/src/components/input-group.tsx +170 -0
  205. package/templates/monorepo-starter/packages/ui/src/components/input-otp.tsx +77 -0
  206. package/templates/monorepo-starter/packages/ui/src/components/input.tsx +44 -0
  207. package/templates/monorepo-starter/packages/ui/src/components/item.tsx +193 -0
  208. package/templates/monorepo-starter/packages/ui/src/components/kbd.tsx +28 -0
  209. package/templates/monorepo-starter/packages/ui/src/components/label.tsx +24 -0
  210. package/templates/monorepo-starter/packages/ui/src/components/menubar.tsx +276 -0
  211. package/templates/monorepo-starter/packages/ui/src/components/native-select.tsx +53 -0
  212. package/templates/monorepo-starter/packages/ui/src/components/navigation-menu.tsx +168 -0
  213. package/templates/monorepo-starter/packages/ui/src/components/otp-modal.tsx +125 -0
  214. package/templates/monorepo-starter/packages/ui/src/components/pagination.tsx +127 -0
  215. package/templates/monorepo-starter/packages/ui/src/components/popover.tsx +48 -0
  216. package/templates/monorepo-starter/packages/ui/src/components/progress.tsx +31 -0
  217. package/templates/monorepo-starter/packages/ui/src/components/radio-group.tsx +45 -0
  218. package/templates/monorepo-starter/packages/ui/src/components/resizable.tsx +53 -0
  219. package/templates/monorepo-starter/packages/ui/src/components/scroll-area.tsx +58 -0
  220. package/templates/monorepo-starter/packages/ui/src/components/select-field.tsx +165 -0
  221. package/templates/monorepo-starter/packages/ui/src/components/select.tsx +190 -0
  222. package/templates/monorepo-starter/packages/ui/src/components/separator.tsx +28 -0
  223. package/templates/monorepo-starter/packages/ui/src/components/sheet.tsx +139 -0
  224. package/templates/monorepo-starter/packages/ui/src/components/sidebar.tsx +728 -0
  225. package/templates/monorepo-starter/packages/ui/src/components/skeleton.tsx +13 -0
  226. package/templates/monorepo-starter/packages/ui/src/components/slider.tsx +63 -0
  227. package/templates/monorepo-starter/packages/ui/src/components/sonner.tsx +57 -0
  228. package/templates/monorepo-starter/packages/ui/src/components/spinner.tsx +16 -0
  229. package/templates/monorepo-starter/packages/ui/src/components/switch-field.tsx +22 -0
  230. package/templates/monorepo-starter/packages/ui/src/components/switch.tsx +35 -0
  231. package/templates/monorepo-starter/packages/ui/src/components/table.tsx +120 -0
  232. package/templates/monorepo-starter/packages/ui/src/components/tabs.tsx +66 -0
  233. package/templates/monorepo-starter/packages/ui/src/components/textarea.tsx +18 -0
  234. package/templates/monorepo-starter/packages/ui/src/components/toggle-group.tsx +83 -0
  235. package/templates/monorepo-starter/packages/ui/src/components/toggle.tsx +47 -0
  236. package/templates/monorepo-starter/packages/ui/src/components/tooltip.tsx +61 -0
  237. package/templates/monorepo-starter/packages/ui/src/hooks/use-confirm.ts +12 -0
  238. package/templates/monorepo-starter/packages/ui/src/hooks/use-dialog.ts +12 -0
  239. package/templates/monorepo-starter/packages/ui/src/hooks/use-mobile.ts +21 -0
  240. package/templates/monorepo-starter/packages/ui/src/lib/utils.ts +38 -3
  241. package/templates/monorepo-starter/packages/ui/src/provider/confirm-dialog.tsx +99 -0
  242. package/templates/monorepo-starter/packages/ui/src/provider/dialog.tsx +62 -0
  243. package/templates/monorepo-starter/packages/ui/src/provider/index.tsx +30 -0
  244. package/templates/monorepo-starter/packages/ui/src/provider/react-query.tsx +11 -0
  245. package/templates/monorepo-starter/{apps/web/src/providers → packages/ui/src/provider}/theme.tsx +5 -7
  246. package/templates/monorepo-starter/packages/ui/src/styles/globals.css +109 -61
  247. package/templates/monorepo-starter/packages/ui/src/types/airports-data.d.ts +21 -0
  248. package/templates/monorepo-starter/packages/ui/tsconfig.json +1 -3
  249. package/templates/monorepo-starter/pnpm-lock.yaml +17765 -12441
  250. package/templates/monorepo-starter/pnpm-workspace.yaml +3 -16
  251. package/templates/monorepo-starter/server/.env.example +7 -5
  252. package/templates/monorepo-starter/server/eslint.config.mjs +1 -4
  253. package/templates/monorepo-starter/server/package.json +129 -97
  254. package/templates/monorepo-starter/server/prisma/schema.prisma +170 -92
  255. package/templates/monorepo-starter/server/prisma/seed-functions.ts +0 -0
  256. package/templates/monorepo-starter/server/prisma/seed.ts +0 -0
  257. package/templates/monorepo-starter/server/prisma.config.ts +9 -9
  258. package/templates/monorepo-starter/server/scripts/admin-bootstrap.ts +61 -0
  259. package/templates/monorepo-starter/server/scripts/gen-module.sh +20 -0
  260. package/templates/monorepo-starter/server/scripts/gen-soft-delete.ts +52 -0
  261. package/templates/monorepo-starter/server/src/app.module.ts +35 -28
  262. package/templates/monorepo-starter/server/src/lib/constants/index.ts +59 -0
  263. package/templates/monorepo-starter/server/src/lib/decorators/boolean-query.decorator.ts +18 -0
  264. package/templates/monorepo-starter/server/src/lib/decorators/logger.decorator.ts +1 -1
  265. package/templates/monorepo-starter/server/src/lib/decorators/oauth.decorator.ts +7 -0
  266. package/templates/monorepo-starter/server/src/lib/decorators/user.decorator.ts +10 -0
  267. package/templates/monorepo-starter/server/src/lib/filters/exceptions.filter.ts +169 -24
  268. package/templates/monorepo-starter/server/src/lib/guards/auth.guard.ts +29 -65
  269. package/templates/monorepo-starter/server/src/lib/guards/oauth.guard.ts +28 -0
  270. package/templates/monorepo-starter/server/src/lib/interceptors/response.interceptor.ts +42 -5
  271. package/templates/monorepo-starter/server/src/lib/middleware/cache.middleware.ts +24 -0
  272. package/templates/monorepo-starter/server/src/lib/schemas/env.schema.ts +25 -5
  273. package/templates/monorepo-starter/server/src/lib/utils/client.utils.ts +95 -0
  274. package/templates/monorepo-starter/server/src/lib/utils/cookie.util.ts +4 -3
  275. package/templates/monorepo-starter/server/src/main.ts +20 -10
  276. package/templates/monorepo-starter/server/src/modules/admin/admin.controller.ts +54 -0
  277. package/templates/monorepo-starter/server/src/modules/admin/admin.module.ts +13 -0
  278. package/templates/monorepo-starter/server/src/modules/admin/admin.service.ts +134 -0
  279. package/templates/monorepo-starter/server/src/modules/auth/auth.controller.ts +60 -18
  280. package/templates/monorepo-starter/server/src/modules/auth/auth.module.ts +3 -2
  281. package/templates/monorepo-starter/server/src/modules/auth/auth.service.ts +354 -307
  282. package/templates/monorepo-starter/server/src/modules/auth/oauth.controller.ts +50 -28
  283. package/templates/monorepo-starter/server/src/modules/auth/oauth.service.ts +59 -34
  284. package/templates/monorepo-starter/server/src/modules/auth/otp.service.ts +29 -36
  285. package/templates/monorepo-starter/server/src/modules/cache/cache.module.ts +28 -0
  286. package/templates/monorepo-starter/server/src/modules/cache/cache.service.ts +33 -0
  287. package/templates/monorepo-starter/server/src/modules/env/env.service.ts +4 -3
  288. package/templates/monorepo-starter/server/src/modules/logger/logger.module.ts +1 -0
  289. package/templates/monorepo-starter/server/src/modules/logger/logger.service.ts +1 -1
  290. package/templates/monorepo-starter/server/src/modules/logger/winston.config.ts +15 -1
  291. package/templates/monorepo-starter/server/src/modules/media/cloudinary.provider.ts +14 -0
  292. package/templates/monorepo-starter/server/src/modules/media/cloudinary.service.ts +62 -0
  293. package/templates/monorepo-starter/server/src/modules/media/media.controller.ts +72 -0
  294. package/templates/monorepo-starter/server/src/modules/media/media.module.ts +13 -0
  295. package/templates/monorepo-starter/server/src/modules/media/media.service.ts +146 -0
  296. package/templates/monorepo-starter/server/src/modules/notification/email.service.ts +30 -0
  297. package/templates/monorepo-starter/server/src/modules/notification/messaging.service.ts +50 -0
  298. package/templates/monorepo-starter/server/src/modules/notification/notification.controller.ts +44 -0
  299. package/templates/monorepo-starter/server/src/modules/notification/notification.module.ts +7 -3
  300. package/templates/monorepo-starter/server/src/modules/notification/notification.service.ts +121 -78
  301. package/templates/monorepo-starter/server/src/modules/notification/push.service.ts +92 -0
  302. package/templates/monorepo-starter/server/src/modules/prisma/prisma.extension.ts +84 -56
  303. package/templates/monorepo-starter/server/src/modules/prisma/prisma.service.ts +10 -9
  304. package/templates/monorepo-starter/server/src/modules/prisma/soft-delete.models.ts +7 -0
  305. package/templates/monorepo-starter/server/src/modules/public/public.controller.ts +3 -2
  306. package/templates/monorepo-starter/server/src/modules/public/public.module.ts +5 -4
  307. package/templates/monorepo-starter/server/src/modules/public/public.service.ts +7 -4
  308. package/templates/monorepo-starter/server/src/modules/scheduler/cleanup.service.ts +15 -7
  309. package/templates/monorepo-starter/server/src/modules/scheduler/scheduler.module.ts +2 -0
  310. package/templates/monorepo-starter/server/src/modules/token/token.module.ts +3 -4
  311. package/templates/monorepo-starter/server/src/modules/token/token.service.ts +205 -76
  312. package/templates/monorepo-starter/server/src/modules/user/user.controller.ts +21 -0
  313. package/templates/monorepo-starter/server/src/modules/user/user.module.ts +12 -0
  314. package/templates/monorepo-starter/server/src/modules/user/user.service.ts +38 -0
  315. package/templates/monorepo-starter/server/src/types/express.d.ts +6 -2
  316. package/templates/monorepo-starter/server/src/types/index.ts +5 -0
  317. package/templates/monorepo-starter/server/tsconfig.json +17 -12
  318. package/templates/monorepo-starter/server/tsup.config.ts +7 -2
  319. package/templates/monorepo-starter/tsconfig.json +1 -1
  320. package/templates/monorepo-starter/turbo.json +1 -1
  321. package/templates/monorepo-starter/apps/web/eslint.config.mjs +0 -4
  322. package/templates/monorepo-starter/apps/web/src/app/(auth)/layout.tsx +0 -7
  323. package/templates/monorepo-starter/apps/web/src/app/globals.css +0 -1
  324. package/templates/monorepo-starter/apps/web/src/components/ThemeSwitch.tsx +0 -34
  325. package/templates/monorepo-starter/apps/web/src/providers/index.tsx +0 -10
  326. package/templates/monorepo-starter/apps/web/src/types/index.d.ts +0 -16
  327. package/templates/monorepo-starter/packages/config/eslint/base.js +0 -31
  328. package/templates/monorepo-starter/packages/config/eslint/nest.js +0 -26
  329. package/templates/monorepo-starter/packages/config/eslint/next.js +0 -39
  330. package/templates/monorepo-starter/packages/config/eslint/react.js +0 -30
  331. package/templates/monorepo-starter/packages/config/typescript/base.json +0 -31
  332. package/templates/monorepo-starter/packages/config/typescript/nest.json +0 -14
  333. package/templates/monorepo-starter/packages/config/typescript/next.json +0 -10
  334. package/templates/monorepo-starter/packages/ui/tsconfig.lint.json +0 -8
  335. package/templates/monorepo-starter/server/README.md +0 -63
  336. package/templates/monorepo-starter/server/scripts/generate.sh +0 -14
  337. package/templates/monorepo-starter/server/src/lib/dto/auth.dto.ts +0 -64
  338. package/templates/monorepo-starter/server/src/lib/dto/security-setting.dto.ts +0 -21
  339. package/templates/monorepo-starter/server/src/lib/pipes/validation.pipe.ts +0 -7
  340. package/templates/monorepo-starter/server/src/lib/templates/notification.templates.ts +0 -243
  341. package/templates/monorepo-starter/server/src/lib/utils/general.util.ts +0 -24
  342. package/templates/monorepo-starter/server/src/modules/auth/role.service.ts +0 -99
  343. package/templates/monorepo-starter/server/src/modules/auth/security-setting.service.ts +0 -102
  344. package/templates/monorepo-starter/server/src/modules/template/template.module.ts +0 -8
  345. package/templates/monorepo-starter/server/src/modules/template/template.service.ts +0 -33
  346. package/templates/monorepo-starter/server/src/types/index.d.ts +0 -13
  347. package/templates/monorepo-starter/server/test/app.e2e-spec.ts +0 -25
  348. package/templates/monorepo-starter/server/test/jest-e2e.json +0 -9
  349. /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
+ );
@@ -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
+ );
@@ -0,0 +1,2 @@
1
+ export * from "./auth";
2
+ export * from "./service";
@@ -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
+ }`;
@@ -0,0 +1,2 @@
1
+ export { AccountSuspended } from "./accountSuspended";
2
+ export { AccountReactivated } from "./accountReactivated";