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,92 @@
1
+ import * as admin from "firebase-admin";
2
+ import { Injectable } from "@nestjs/common";
3
+
4
+ import { InjectLogger } from "@/decorators/logger.decorator";
5
+ import { EnvService } from "@/modules/env/env.service";
6
+ import { LoggerService } from "@/modules/logger/logger.service";
7
+ import { PrismaService } from "@/modules/prisma/prisma.service";
8
+
9
+ @Injectable()
10
+ export class PushService {
11
+ @InjectLogger()
12
+ private readonly logger!: LoggerService;
13
+
14
+ constructor(
15
+ private readonly env: EnvService,
16
+ private readonly prisma: PrismaService,
17
+ ) {}
18
+
19
+ async sendPush(user: SafeUser, title: string, body: string) {
20
+ const sessions = await this.prisma.session.findMany({
21
+ where: { userId: user.id, status: "active", pushToken: { not: null } },
22
+ select: { pushToken: true, pushProvider: true },
23
+ });
24
+
25
+ for (const s of sessions) {
26
+ if (!s.pushToken || !s.pushProvider) continue;
27
+
28
+ switch (s.pushProvider) {
29
+ case "fcm":
30
+ await this.sendWithFCM(s.pushToken, title, body, user.id);
31
+ break;
32
+
33
+ case "expo":
34
+ await this.sendWithExpo(s.pushToken, title, body);
35
+ break;
36
+
37
+ default:
38
+ this.logger.warn("Unknown push provider", {
39
+ provider: s.pushProvider,
40
+ });
41
+ }
42
+ }
43
+ }
44
+
45
+ private async sendWithFCM(
46
+ token: string,
47
+ title: string,
48
+ body: string,
49
+ userId: string,
50
+ ) {
51
+ try {
52
+ this.ensureFirebase();
53
+ const message: admin.messaging.Message = {
54
+ token,
55
+ notification: { title, body },
56
+ };
57
+
58
+ await admin.messaging().send(message);
59
+ } catch (err: any) {
60
+ this.logger.error("FCM push failed", { token, error: err.message });
61
+ if (
62
+ err.code === "messaging/registration-token-not-registered" ||
63
+ err.code === "messaging/invalid-registration-token"
64
+ ) {
65
+ await this.prisma.session.updateMany({
66
+ where: { userId, pushToken: token },
67
+ data: { pushToken: null },
68
+ });
69
+ this.logger.warn("Removed invalid FCM token", { token });
70
+ }
71
+ }
72
+ }
73
+
74
+ private async sendWithExpo(token: string, title: string, body: string) {
75
+ // TODO: implement Expo push logic here
76
+ this.logger.log("Expo push placeholder", { token, title, body });
77
+ }
78
+
79
+ private ensureFirebase() {
80
+ if (admin.apps.length) return;
81
+
82
+ admin.initializeApp({
83
+ credential: admin.credential.cert({
84
+ projectId: this.env.get("FIREBASE_PROJECT_ID"),
85
+ clientEmail: this.env.get("FIREBASE_CLIENT_EMAIL"),
86
+ privateKey: this.env.get("FIREBASE_PRIVATE_KEY"),
87
+ }),
88
+ });
89
+
90
+ this.logger.log("โœ… Firebase Admin initialized");
91
+ }
92
+ }
@@ -1,72 +1,100 @@
1
1
  import { Prisma } from "@generated/prisma";
2
+ import { SoftDeleteModels } from "./soft-delete.models";
2
3
 
3
- const hasDeletedAt = (model: string) => {
4
- const dmmf = Prisma.dmmf.datamodel.models;
5
- const m = dmmf.find((m) => m.name === model);
6
- return !!m?.fields.find((f) => f.name === "deletedAt");
4
+ export type SoftDeleteExtraArgs = {
5
+ force?: boolean | string;
7
6
  };
8
7
 
9
- export const softDeleteExtension = Prisma.defineExtension({
10
- name: "softDelete",
8
+ export const softDeleteExtension = Prisma.defineExtension((client) =>
9
+ client.$extends({
10
+ name: "softDelete",
11
+ query: {
12
+ $allModels: {
13
+ // Single delete
14
+ async delete<T, A extends Prisma.Args<T, "delete">>({
15
+ model,
16
+ args,
17
+ query,
18
+ }: {
19
+ model: string;
20
+ args: Prisma.Exact<A & SoftDeleteExtraArgs, A & SoftDeleteExtraArgs>;
21
+ query: (args: A) => Promise<Prisma.Result<T, A, "delete">>;
22
+ }) {
23
+ const hasDel = SoftDeleteModels.has(model);
24
+ const { force, ...rest } = args as A & SoftDeleteExtraArgs;
25
+ const isForce = force === true || force === "true";
11
26
 
12
- query: {
13
- $allModels: {
14
- async delete({ model, args, query }) {
15
- const hasDel = hasDeletedAt(model);
16
- const force = (args as any).force;
27
+ if (hasDel && !isForce) {
28
+ return (client as any)[model].update({
29
+ where: rest.where,
30
+ data: { deletedAt: new Date() },
31
+ });
32
+ }
17
33
 
18
- if (hasDel && !force) {
19
- const prisma = Prisma.getExtensionContext(this);
20
- console.log("prisma", prisma);
21
- return (prisma as any)[model].update({
22
- where: args.where,
23
- data: { deletedAt: new Date() },
24
- });
25
- }
34
+ return query(rest as A);
35
+ },
26
36
 
27
- return query(args);
28
- },
37
+ // Delete many
38
+ async deleteMany<T, A extends Prisma.Args<T, "deleteMany">>({
39
+ model,
40
+ args,
41
+ query,
42
+ }: {
43
+ model: string;
44
+ args: Prisma.Exact<A & SoftDeleteExtraArgs, A & SoftDeleteExtraArgs>;
45
+ query: (args: A) => Promise<Prisma.Result<T, A, "deleteMany">>;
46
+ }) {
47
+ const hasDel = SoftDeleteModels.has(model);
48
+ const { force, ...rest } = args as A & SoftDeleteExtraArgs;
49
+ const isForce = force === true || force === "true";
29
50
 
30
- async deleteMany({ model, args, query }) {
31
- const hasDel = hasDeletedAt(model);
32
- const force = (args as any).force;
51
+ if (hasDel && !isForce) {
52
+ return (client as any)[model].updateMany({
53
+ where: rest.where,
54
+ data: { deletedAt: new Date() },
55
+ });
56
+ }
33
57
 
34
- if (hasDel && !force) {
35
- const prisma = Prisma.getExtensionContext(this);
36
- console.log("prisma", prisma);
37
- return (prisma as any)[model].updateMany({
38
- where: args.where,
39
- data: { deletedAt: new Date() },
40
- });
41
- }
58
+ return query(rest as A);
59
+ },
42
60
 
43
- return query(args);
44
- },
61
+ // Intercept all operations
62
+ async $allOperations<T, A>({
63
+ model,
64
+ operation,
65
+ args,
66
+ query,
67
+ }: {
68
+ model: string;
69
+ operation: string;
70
+ args: A & SoftDeleteExtraArgs;
71
+ query: (args: A) => Promise<Prisma.Result<T, A, any>>;
72
+ }) {
73
+ const hasDel = SoftDeleteModels.has(model);
74
+ const readOps = [
75
+ "findUnique",
76
+ "findFirst",
77
+ "findMany",
78
+ "count",
79
+ "aggregate",
80
+ ] as const;
45
81
 
46
- async $allOperations({ model, operation, args, query }) {
47
- const hasDel = hasDeletedAt(model);
48
- const _args = args as Record<string, any>;
49
- const targetOps = [
50
- "findUnique",
51
- "findFirst",
52
- "findMany",
53
- "count",
54
- "aggregate",
55
- ];
82
+ if (!hasDel || !readOps.includes(operation as any)) {
83
+ return query(args as A);
84
+ }
56
85
 
57
- if (!targetOps.includes(operation) || !hasDel) return query(args);
58
- if (_args.includeDeleted) {
59
- delete _args.includeDeleted;
60
- return query(_args);
61
- }
86
+ const next: any = { ...args };
62
87
 
63
- _args.where = _args.where ?? {};
64
- if (!("deletedAt" in _args.where)) {
65
- _args.where = { ..._args.where, deletedAt: null };
66
- }
88
+ next.where ??= {};
89
+ if (next.where.deletedAt === undefined) {
90
+ next.where.deletedAt = null;
91
+ }
67
92
 
68
- return query(_args);
93
+ return query(next as A);
94
+ },
69
95
  },
70
96
  },
71
- },
72
- });
97
+ }),
98
+ );
99
+
100
+ export type ExtendedPrismaClient = ReturnType<typeof softDeleteExtension>;
@@ -3,9 +3,10 @@ import { Injectable } from "@nestjs/common";
3
3
  import { PrismaClient } from "@generated/prisma";
4
4
  import { PrismaPg } from "@prisma/adapter-pg";
5
5
 
6
- import { LoggerService } from "@modules/logger/logger.service";
7
- import { InjectLogger } from "@decorators/logger.decorator";
8
6
  import { softDeleteExtension } from "./prisma.extension";
7
+ import { InjectLogger } from "@/decorators/logger.decorator";
8
+ import { EnvService } from "@/modules/env/env.service";
9
+ import { LoggerService } from "@/modules/logger/logger.service";
9
10
 
10
11
  @Injectable()
11
12
  export class PrismaService
@@ -15,15 +16,15 @@ export class PrismaService
15
16
  @InjectLogger()
16
17
  private readonly logger!: LoggerService;
17
18
 
18
- constructor() {
19
- const adapter = new PrismaPg({
20
- connectionString: process.env.DB_URI!,
21
- });
19
+ constructor(env: EnvService) {
20
+ const adapter = new PrismaPg({
21
+ connectionString: env.get("DB_URI"),
22
+ });
22
23
 
23
- super({ adapter });
24
+ super({ adapter });
24
25
 
25
- Object.assign(this, this.$extends(softDeleteExtension));
26
- }
26
+ Object.assign(this, this.$extends(softDeleteExtension));
27
+ }
27
28
 
28
29
  async onModuleInit() {
29
30
  this.logger.log("Connecting to the database...");
@@ -0,0 +1,7 @@
1
+ // AUTO-GENERATED FILE โ€” DO NOT EDIT
2
+ // Generated from schema.prisma
3
+
4
+ export const SoftDeleteModels = new Set<string>([
5
+ "User",
6
+ "Media"
7
+ ]);
@@ -1,7 +1,8 @@
1
+ import type { Request } from "express";
1
2
  import { Controller, Get, Req } from "@nestjs/common";
3
+
2
4
  import { PublicService } from "./public.service";
3
- import type { Request } from "express";
4
- import { Public } from "@decorators/public.decorator";
5
+ import { Public } from "@/decorators/public.decorator";
5
6
 
6
7
  @Controller()
7
8
  export class PublicController {
@@ -1,9 +1,10 @@
1
- import { Module } from '@nestjs/common';
2
- import { PublicService } from './public.service';
3
- import { PublicController } from './public.controller';
1
+ import { Module } from "@nestjs/common";
2
+
3
+ import { PublicService } from "./public.service";
4
+ import { PublicController } from "./public.controller";
4
5
 
5
6
  @Module({
6
7
  providers: [PublicService],
7
- controllers: [PublicController]
8
+ controllers: [PublicController],
8
9
  })
9
10
  export class PublicModule {}
@@ -1,7 +1,8 @@
1
- import { Injectable } from "@nestjs/common";
2
- import { LoggerService } from "@modules/logger/logger.service";
3
1
  import type { Request } from "express";
4
- import { InjectLogger } from "@decorators/logger.decorator";
2
+ import { Injectable } from "@nestjs/common";
3
+
4
+ import { InjectLogger } from "@/decorators/logger.decorator";
5
+ import { LoggerService } from "@/modules/logger/logger.service";
5
6
 
6
7
  @Injectable()
7
8
  export class PublicService {
@@ -9,8 +10,10 @@ export class PublicService {
9
10
  private readonly logger!: LoggerService;
10
11
 
11
12
  welcome(req: Request) {
13
+ const origin = `${req.protocol}://${req.get("host")}`;
14
+
12
15
  this.logger.log(
13
- `Welcome endpoint hit from IP: ${req.ip}, path: ${req.url}`
16
+ `Welcome endpoint hit from IP: ${req.ip}, path: ${origin}${req.url}`,
14
17
  );
15
18
  return { message: "Server is running ๐Ÿš€" };
16
19
  }
@@ -1,8 +1,9 @@
1
1
  import { Injectable } from "@nestjs/common";
2
2
  import { Cron, CronExpression } from "@nestjs/schedule";
3
- import { PrismaService } from "@modules/prisma/prisma.service";
4
- import { LoggerService } from "@modules/logger/logger.service";
5
- import { InjectLogger } from "@decorators/logger.decorator";
3
+
4
+ import { InjectLogger } from "@/decorators/logger.decorator";
5
+ import { PrismaService } from "@/modules/prisma/prisma.service";
6
+ import { LoggerService } from "@/modules/logger/logger.service";
6
7
 
7
8
  @Injectable()
8
9
  export class CleanupService {
@@ -22,12 +23,19 @@ export class CleanupService {
22
23
 
23
24
  @Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
24
25
  async handleRefreshTokenCleanup() {
25
- this.logger.log("๐Ÿงน Running Refresh Token cleanup job...");
26
- const result = await this.prisma.refreshToken.deleteMany({
26
+ this.logger.log("๐Ÿงน Running Session Revokes job...");
27
+ const updated = await this.prisma.session.updateMany({
28
+ where: { expiresAt: { lt: new Date() } },
29
+ data: { status: "expired" },
30
+ });
31
+ this.logger.log(`โœ… Updated ${updated.count} expired sessions`);
32
+
33
+ const deleted = await this.prisma.session.deleteMany({
27
34
  where: {
28
- expiresAt: { lt: new Date() },
35
+ pushToken: null,
36
+ OR: [{ expiresAt: { lt: new Date() } }, { status: "revoked" }],
29
37
  },
30
38
  });
31
- this.logger.log(`โœ… Deleted ${result.count} expired refresh tokens`);
39
+ this.logger.log(`โœ… Deleted ${deleted.count} expired sessions`);
32
40
  }
33
41
  }
@@ -1,7 +1,9 @@
1
1
  import { Module } from "@nestjs/common";
2
+ import { ScheduleModule } from "@nestjs/schedule";
2
3
  import { CleanupService } from "./cleanup.service";
3
4
 
4
5
  @Module({
6
+ imports: [ScheduleModule.forRoot()],
5
7
  providers: [CleanupService],
6
8
  })
7
9
  export class SchedulerModule {}
@@ -1,11 +1,10 @@
1
1
  import { Module } from "@nestjs/common";
2
2
  import { TokenService } from "./token.service";
3
- import { JwtModule } from "@nestjs/jwt";
4
- import { CookieService } from "@utils/cookie.util";
3
+ import { CookieService } from "@/utils/cookie.util";
4
+ import { ClientService } from "@/utils/client.utils";
5
5
 
6
6
  @Module({
7
- imports: [JwtModule.register({})],
8
- providers: [TokenService, CookieService],
7
+ providers: [TokenService, CookieService, ClientService],
9
8
  exports: [TokenService],
10
9
  })
11
10
  export class TokenModule {}