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
@@ -1,131 +1,260 @@
1
- import { Injectable } from "@nestjs/common";
2
- import { JwtService } from "@nestjs/jwt";
3
- import { expiryDate } from "@utils/general.util";
4
- import { PrismaService } from "@modules/prisma/prisma.service";
5
- import { UserRole } from "@generated/prisma";
6
- import { EnvService } from "@modules/env/env.service";
1
+ import { ulid } from "ulid";
2
+ import argon2 from "argon2";
7
3
  import type { Request, Response } from "express";
8
- import { CookieService } from "@utils/cookie.util";
4
+ import { SignJWT, jwtVerify, type JWTPayload } from "jose";
5
+ import { Injectable, UnauthorizedException } from "@nestjs/common";
6
+ import { futureDate } from "@workspace/shared/utils";
7
+ import { Prisma, UserRole } from "@generated/prisma";
8
+ import type { SessionUncheckedCreateInput } from "prisma/generated/models";
9
9
 
10
- export interface TokenPayload {
10
+ import { CookieService } from "@/utils/cookie.util";
11
+ import { ClientService } from "@/utils/client.utils";
12
+ import { EnvService } from "@/modules/env/env.service";
13
+ import { PrismaService } from "@/modules/prisma/prisma.service";
14
+
15
+ type TokenType = "accessToken" | "refreshToken";
16
+
17
+ export interface JwtPayload {
11
18
  sub: string;
12
- roles: UserRole[];
19
+ sid: string;
20
+ rol: UserRole;
21
+ sts: UserStatus;
13
22
  }
14
23
 
15
24
  interface TokensType {
16
25
  accessToken: string;
17
26
  refreshToken: string;
18
- tokenId: string;
27
+ deviceId: string;
19
28
  }
20
29
 
21
30
  @Injectable()
22
31
  export class TokenService {
32
+ private encoder = new TextEncoder();
33
+ private readonly accessSecret;
34
+ private readonly refreshSecret;
35
+
23
36
  constructor(
24
- private readonly jwtService: JwtService,
25
37
  private readonly env: EnvService,
26
38
  private readonly prisma: PrismaService,
27
- private readonly cookieService: CookieService
28
- ) {}
29
-
30
- async generateTokens(req: Request, payload: TokenPayload) {
31
- const [accessToken, refreshToken] = await Promise.all([
32
- this.jwtService.signAsync(payload, {
33
- secret: this.env.get("JWT_ACCESS_SECRET"),
34
- expiresIn: this.env.get("ACCESS_TOKEN_EXP"),
35
- }),
36
- this.jwtService.signAsync(payload, {
37
- secret: this.env.get("JWT_REFRESH_SECRET"),
38
- expiresIn: this.env.get("REFRESH_TOKEN_EXP"),
39
- }),
40
- ]);
41
-
42
- const tokenId = req.cookies["tokenId"] || "undefined";
43
- const refreshExp = expiryDate(this.env.get("REFRESH_TOKEN_EXP"), true);
44
-
45
- const tokenData = {
46
- token: refreshToken,
39
+ private readonly cookieService: CookieService,
40
+ private readonly client: ClientService,
41
+ ) {
42
+ this.accessSecret = this.encoder.encode(this.env.get("JWT_ACCESS_SECRET"));
43
+ this.refreshSecret = this.encoder.encode(
44
+ this.env.get("JWT_REFRESH_SECRET"),
45
+ );
46
+ }
47
+
48
+ async generateTokens(req: Request, user: Express.User) {
49
+ const ctx = await this.client.resolve(req);
50
+ const isTrusted = req.headers["x-trusted-device"] === "true";
51
+ const refreshExp = futureDate(this.env.get("REFRESH_TOKEN_EXP"));
52
+ const deviceId =
53
+ req.cookies["deviceId"] ?? req.headers["x-device-id"] ?? ulid();
54
+
55
+ const payload: JWTPayload & JwtPayload = {
56
+ sid: user.sessionId ?? ulid(),
57
+ sub: user.id,
58
+ rol: user.role,
59
+ sts: user.status,
60
+ };
61
+
62
+ const accessToken = await new SignJWT(payload)
63
+ .setProtectedHeader({ alg: "HS256" })
64
+ .setIssuedAt()
65
+ .setExpirationTime(this.env.get("ACCESS_TOKEN_EXP"))
66
+ .sign(this.accessSecret);
67
+
68
+ const refreshToken = await new SignJWT(payload)
69
+ .setProtectedHeader({ alg: "HS256" })
70
+ .setIssuedAt()
71
+ .setExpirationTime(this.env.get("REFRESH_TOKEN_EXP"))
72
+ .sign(this.refreshSecret);
73
+
74
+ const refreshTokenHash = await argon2.hash(refreshToken);
75
+
76
+ const tokenData: SessionUncheckedCreateInput = {
77
+ ...ctx,
78
+ deviceId,
79
+ id: payload.sid,
47
80
  userId: payload.sub,
48
- ip: req.ip || "Unknown IP",
49
- userAgent: req.headers["user-agent"] || "Unknown User Agent",
50
- lastUsed: new Date(),
51
- blacklisted: false,
52
- isActive: true,
81
+ refreshTokenHash,
82
+ status: "active",
83
+ lastSeenAt: new Date(),
53
84
  expiresAt: refreshExp,
54
85
  };
55
86
 
56
- const newToken = await this.prisma.refreshToken.upsert({
57
- where: { id: tokenId },
87
+ const where = user.sessionId
88
+ ? { id: user.sessionId }
89
+ : { userId_deviceId: { userId: user.id, deviceId } };
90
+
91
+ await this.prisma.session.upsert({
92
+ where,
58
93
  update: tokenData,
59
- create: tokenData,
94
+ create: { ...tokenData, isTrusted },
60
95
  });
61
96
 
62
- return { accessToken, refreshToken, tokenId: newToken.id };
97
+ return { accessToken, refreshToken, deviceId, payload, isTrusted };
63
98
  }
64
99
 
65
- async verifyToken(
66
- token: string,
67
- type: "access" | "refresh"
68
- ): Promise<TokenPayload | null> {
100
+ async verifyToken(req: Request, type: TokenType): Promise<JwtPayload> {
101
+ const token = req.cookies[type] as string;
102
+
69
103
  const secret =
70
- type === "access"
71
- ? this.env.get("JWT_ACCESS_SECRET")
72
- : this.env.get("JWT_REFRESH_SECRET");
104
+ type === "accessToken" ? this.accessSecret : this.refreshSecret;
105
+
106
+ if (!token) {
107
+ throw new UnauthorizedException({
108
+ errorCode:
109
+ type === "accessToken" ? "access_token_missing" : "session_expired",
110
+ });
111
+ }
112
+
73
113
  try {
74
- return await this.jwtService.verifyAsync<TokenPayload>(token, { secret });
75
- } catch (error) {
76
- return null;
114
+ const { payload } = await jwtVerify<JWTPayload & JwtPayload>(
115
+ token,
116
+ secret,
117
+ );
118
+ return payload;
119
+ } catch {
120
+ throw new UnauthorizedException({
121
+ errorCode: "unauthorized",
122
+ });
77
123
  }
78
124
  }
79
125
 
80
- async refreshTokens(req: Request, res: Response, payload: TokenPayload) {
126
+ async refreshTokens(req: Request, res: Response, payload: JwtPayload) {
81
127
  const refreshToken = req.cookies["refreshToken"];
82
128
 
83
- const tokenRecord = await this.prisma.refreshToken.findUnique({
84
- where: { token: refreshToken, blacklisted: false },
85
- });
129
+ await this.prisma.$transaction(async (tx) => {
130
+ const session = await tx.session.findUnique({
131
+ where: { id: payload.sid },
132
+ });
86
133
 
87
- if (!tokenRecord) {
88
- throw new Error("Invalid or expired refresh token.");
89
- }
134
+ if (!session || session.status !== "active") {
135
+ throw new UnauthorizedException({ errorCode: "session_expired" });
136
+ }
90
137
 
91
- await this.createAuthSession(req, res, {
92
- id: payload.sub,
93
- roles: payload.roles,
138
+ if (session.expiresAt <= new Date()) {
139
+ await tx.session.update({
140
+ where: { id: payload.sid },
141
+ data: { status: "expired" },
142
+ });
143
+ throw new UnauthorizedException({ errorCode: "session_expired" });
144
+ }
145
+
146
+ const isValid = await argon2.verify(
147
+ session.refreshTokenHash,
148
+ refreshToken,
149
+ );
150
+
151
+ const IS_PROD = this.env.get("NODE_ENV") === "production";
152
+
153
+ if (!isValid && IS_PROD) {
154
+ await this.revokeSession(session.id, undefined, tx);
155
+ throw new UnauthorizedException({ errorCode: "session_expired" });
156
+ }
157
+
158
+ await this.createAuthSession(req, res, {
159
+ id: payload.sub,
160
+ role: payload.rol,
161
+ status: payload.sts,
162
+ sessionId: payload.sid,
163
+ });
94
164
  });
95
165
  }
96
166
 
97
167
  async createAuthSession(req: Request, res: Response, user: Express.User) {
98
- const tokens = await this.generateTokens(req, {
99
- sub: user.id,
100
- roles: user.roles,
101
- });
102
- this.setAuthCookies(res, tokens);
103
- return tokens;
168
+ const tokens = await this.generateTokens(req, user);
169
+ this.setAuthCookies(res, tokens, tokens.isTrusted);
170
+ this.attachAuthContext(req, tokens.payload);
104
171
  }
105
172
 
106
- attachDecodedUser = (req: Request, decoded: TokenPayload) => {
107
- if (decoded) req["user"] = { id: decoded.sub, roles: decoded.roles };
173
+ attachAuthContext = (req: Request, payload: JwtPayload) => {
174
+ req["user"] = {
175
+ id: payload.sub,
176
+ role: payload.rol,
177
+ status: payload.sts,
178
+ sessionId: payload.sid,
179
+ };
108
180
  };
109
181
 
110
- setAuthCookies(res: Response, tokens: TokensType): void {
111
- const { accessToken, refreshToken, tokenId } = tokens;
112
- const accessExp = expiryDate(this.env.get("ACCESS_TOKEN_EXP"), true);
113
- const refreshExp = expiryDate(this.env.get("REFRESH_TOKEN_EXP"), true);
182
+ setAuthCookies(res: Response, tokens: TokensType, isTrusted: boolean): void {
183
+ const { accessToken, refreshToken, deviceId } = tokens;
184
+ const accessExp = futureDate(this.env.get("ACCESS_TOKEN_EXP"));
185
+ const refreshExp = futureDate(this.env.get("REFRESH_TOKEN_EXP"));
114
186
 
115
187
  this.cookieService.setCookie(res, "accessToken", accessToken, {
116
188
  expires: accessExp,
117
189
  });
118
190
  this.cookieService.setCookie(res, "refreshToken", refreshToken, {
119
- expires: refreshExp,
191
+ expires: isTrusted ? refreshExp : undefined,
120
192
  });
121
- this.cookieService.setCookie(res, "tokenId", tokenId, {
122
- expires: refreshExp,
193
+ this.cookieService.setCookie(res, "deviceId", deviceId, {
194
+ expires: futureDate("1y"),
123
195
  });
124
196
  }
125
197
 
126
198
  clearAuthCookies(res: Response): void {
127
199
  res.clearCookie("accessToken");
128
200
  res.clearCookie("refreshToken");
129
- res.clearCookie("tokenId");
201
+ }
202
+
203
+ async getUserSessions(user: Express.User) {
204
+ const sessions = await this.prisma.session.findMany({
205
+ where: { userId: user.id },
206
+ orderBy: { lastSeenAt: "desc" },
207
+ select: {
208
+ id: true,
209
+ ip: true,
210
+ isp: true,
211
+ location: true,
212
+ timezone: true,
213
+ deviceType: true,
214
+ deviceInfo: true,
215
+
216
+ status: true,
217
+ isTrusted: true,
218
+ lastSeenAt: true,
219
+ createdAt: true,
220
+ expiresAt: true,
221
+ revokedAt: true,
222
+ },
223
+ });
224
+
225
+ const currentSessionId = user.sessionId;
226
+
227
+ const sortedSessions = sessions.sort((a, b) => {
228
+ if (a.id === currentSessionId) return -1;
229
+ if (b.id === currentSessionId) return 1;
230
+ return 0;
231
+ });
232
+
233
+ return { message: "Session Fetched Successfully.", data: sortedSessions };
234
+ }
235
+
236
+ async revokeSession(
237
+ sessionId: string,
238
+ res?: Response,
239
+ tx?: Prisma.TransactionClient,
240
+ ) {
241
+ if (!tx) tx = this.prisma;
242
+ await tx.session.updateMany({
243
+ where: { id: sessionId, status: "active" },
244
+ data: { status: "revoked", revokedAt: new Date() },
245
+ });
246
+
247
+ if (res) this.clearAuthCookies(res);
248
+
249
+ return { message: "Session Revoked Successfully." };
250
+ }
251
+
252
+ async revokeAllSessions(user: Express.User) {
253
+ await this.prisma.session.updateMany({
254
+ where: { userId: user.id, status: "active", NOT: { id: user.sessionId } },
255
+ data: { status: "revoked", revokedAt: new Date() },
256
+ });
257
+
258
+ return { message: "All Session Revoked Successfully." };
130
259
  }
131
260
  }
@@ -0,0 +1,21 @@
1
+ import { type Request } from "express";
2
+ import { Body, Controller, Get, Put } from "@nestjs/common";
3
+ import { UserProfileDto } from "@workspace/contracts/user";
4
+
5
+ import { UserService } from "./user.service";
6
+ import { User } from "@/decorators/user.decorator";
7
+
8
+ @Controller("user")
9
+ export class UserController {
10
+ constructor(private readonly userService: UserService) {}
11
+
12
+ @Get()
13
+ async getCurrentUser(@User("id") userId: string) {
14
+ return this.userService.getCurrentUser(userId);
15
+ }
16
+
17
+ @Put()
18
+ async updateUserProfile(@Body() dto: UserProfileDto, req: Request) {
19
+ return this.userService.updateUserProfile(dto, req);
20
+ }
21
+ }
@@ -0,0 +1,12 @@
1
+ import { Module } from "@nestjs/common";
2
+
3
+ import { UserService } from "./user.service";
4
+ import { UserController } from "./user.controller";
5
+ import { AuthModule } from "@/modules/auth/auth.module";
6
+
7
+ @Module({
8
+ imports: [AuthModule],
9
+ providers: [UserService],
10
+ controllers: [UserController],
11
+ })
12
+ export class UserModule {}
@@ -0,0 +1,38 @@
1
+ import { type Request } from "express";
2
+ import { Injectable } from "@nestjs/common";
3
+
4
+ import { AuthService } from "@/modules/auth/auth.service";
5
+ import { PrismaService } from "@/modules/prisma/prisma.service";
6
+
7
+ @Injectable()
8
+ export class UserService {
9
+ constructor(
10
+ private readonly authService: AuthService,
11
+ private readonly prisma: PrismaService,
12
+ ) {}
13
+
14
+ async getCurrentUser(userId: string) {
15
+ const user = await this.prisma.user.findUniqueOrThrow({
16
+ where: { id: userId },
17
+ ...this.authService.userView,
18
+ });
19
+
20
+ return {
21
+ message: "User Fetched Successfully.",
22
+ data: user,
23
+ };
24
+ }
25
+
26
+ async updateUserProfile(dto: UserProfileDto, req: Request) {
27
+ const userId = req.user!.id;
28
+
29
+ await this.prisma.user.update({
30
+ where: { id: userId },
31
+ data: dto,
32
+ });
33
+
34
+ return {
35
+ message: "Profile Updated Successfully.",
36
+ };
37
+ }
38
+ }
@@ -1,10 +1,14 @@
1
- import { UserRole } from "@generated/prisma";
1
+ import type { UserStatus, UserRole } from "@generated/prisma";
2
2
 
3
3
  declare global {
4
4
  namespace Express {
5
5
  interface User {
6
6
  id: string;
7
- roles: UserRole[];
7
+ role: UserRole;
8
+ status: UserStatus;
9
+ sessionId?: string;
8
10
  }
9
11
  }
10
12
  }
13
+
14
+ export {};
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ type IdentifierType = "email" | "phone";
3
+ }
4
+
5
+ export {};
@@ -1,23 +1,28 @@
1
1
  {
2
- "extends": "@workspace/config/typescript/nest",
2
+ "extends": "@workspace/config/typescript/node",
3
3
  "compilerOptions": {
4
4
  "baseUrl": ".",
5
5
  "outDir": "dist",
6
6
  "paths": {
7
7
  "@/*": ["src/*"],
8
- "@modules/*" : ["src/modules/*"],
9
- "@decorators/*": ["src/lib/decorators/*"],
10
- "@dto/*": ["src/lib/dto/*"],
11
- "@filters/*": ["src/lib/filters/*"],
12
- "@guards/*": ["src/lib/guards/*"],
13
- "@interceptors/*": ["src/lib/interceptors/*"],
14
- "@pipes/*": ["src/lib/pipes/*"],
15
- "@schemas/*": ["src/lib/schemas/*"],
16
- "@templates/*": ["src/lib/templates/*"],
17
- "@utils/*": ["src/lib/utils/*"],
8
+ "@/decorators/*": ["src/lib/decorators/*"],
9
+ "@/dto/*": ["src/lib/dto/*"],
10
+ "@/filters/*": ["src/lib/filters/*"],
11
+ "@/guards/*": ["src/lib/guards/*"],
12
+ "@/middleware/*": ["src/lib/middleware/*"],
13
+ "@/interceptors/*": ["src/lib/interceptors/*"],
14
+ "@/pipes/*": ["src/lib/pipes/*"],
15
+ "@/schemas/*": ["src/lib/schemas/*"],
16
+ "@/templates/*": ["src/lib/templates/*"],
17
+ "@/utils/*": ["src/lib/utils/*"],
18
+ "@/constants/*": ["src/lib/constants/*"],
18
19
  "@generated/prisma": ["./prisma/generated/client"]
19
20
  }
20
21
  },
21
- "include": ["**/*.ts"],
22
+ "include": [
23
+ "**/*.ts",
24
+ "../packages/templates/src/types/global.d.ts",
25
+ "../packages/contracts/src/**/*types.d.ts"
26
+ ],
22
27
  "exclude": ["node_modules", "dist"]
23
28
  }
@@ -3,12 +3,17 @@ import { defineConfig } from "tsup";
3
3
  export default defineConfig({
4
4
  entry: ["src/main.ts"],
5
5
  outDir: "dist",
6
- target: "es2022",
6
+ target: "es2024",
7
7
  format: ["esm"],
8
8
  splitting: false,
9
9
  sourcemap: true,
10
10
  clean: true,
11
- dts: true,
11
+ dts: false,
12
12
  minify: false,
13
13
  onSuccess: "node dist/main.js",
14
+ external: [
15
+ "@workspace/shared",
16
+ "@workspace/contracts",
17
+ "@workspace/templates",
18
+ ],
14
19
  });
@@ -1,3 +1,3 @@
1
1
  {
2
- "extends": "@workspace/config/typescript/base"
2
+ "extends": "@workspace/config/typescript/node"
3
3
  }
@@ -5,7 +5,7 @@
5
5
  "build": {
6
6
  "dependsOn": ["^build"],
7
7
  "inputs": ["$TURBO_DEFAULT$", ".env*"],
8
- "outputs": [".next/**", "!.next/cache/**"]
8
+ "outputs": [".next/**", "!.next/cache/**", "dist/**"]
9
9
  },
10
10
  "lint": {
11
11
  "dependsOn": ["^lint"]
@@ -1,4 +0,0 @@
1
- import { config } from "@workspace/config/eslint/next";
2
-
3
- /** @type {import("eslint").Linter.Config} */
4
- export default config;
@@ -1,7 +0,0 @@
1
- import React from "react";
2
-
3
- const AuthLayout = ({ children }: LayoutProps) => {
4
- return <div>{children}</div>;
5
- }
6
-
7
- export default AuthLayout;
@@ -1 +0,0 @@
1
- @import "tailwindcss";
@@ -1,34 +0,0 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import { Moon, Sun } from "lucide-react";
5
- import { useTheme } from "next-themes";
6
- import { Button, type ButtonProps } from "@workspace/ui/components/button";
7
-
8
- function ThemeSwitch(props: ButtonProps) {
9
- const { setTheme, theme, systemTheme } = useTheme();
10
-
11
- const currentTheme = theme === "system" ? systemTheme : theme;
12
-
13
- const toggleTheme = () =>
14
- setTheme(currentTheme === "dark" ? "light" : "dark");
15
-
16
- return (
17
- <Button
18
- variant="outline"
19
- size="icon"
20
- className="rounded-full"
21
- {...props}
22
- onClick={toggleTheme}
23
- >
24
- {currentTheme === "dark" ? (
25
- <Moon className="text-white" />
26
- ) : (
27
- <Sun className="text-black" />
28
- )}
29
- <span className="sr-only">Toggle theme</span>
30
- </Button>
31
- );
32
- }
33
-
34
- export default ThemeSwitch;
@@ -1,10 +0,0 @@
1
- "use client";
2
-
3
- import React from "react";
4
- import ThemeProvider from "./theme";
5
-
6
- function Provider({ children }: { children: React.ReactNode }) {
7
- return <ThemeProvider>{children}</ThemeProvider>;
8
- }
9
-
10
- export default Provider;
@@ -1,16 +0,0 @@
1
-
2
-
3
- interface SegmentParams {
4
- [key: string]: string;
5
- }
6
-
7
- type TSearchParams = Record<string, string | string[] | undefined>;
8
-
9
- interface PageProps {
10
- params: Promise<SegmentParams>;
11
- searchParams: Promise<TSearchParams>;
12
- }
13
-
14
- interface LayoutProps extends PageProps {
15
- children?: React.ReactNode;
16
- }
@@ -1,31 +0,0 @@
1
- import js from "@eslint/js";
2
- import eslintConfigPrettier from "eslint-config-prettier";
3
- import turboPlugin from "eslint-plugin-turbo";
4
- import tseslint from "typescript-eslint";
5
-
6
- /** @type {import("eslint").Linter.Config} */
7
- export const config = [
8
- js.configs.recommended,
9
- eslintConfigPrettier,
10
- ...tseslint.configs.recommended,
11
- {
12
- plugins: { turbo: turboPlugin },
13
- rules: {
14
- "turbo/no-undeclared-env-vars": "error",
15
- },
16
- },
17
- {
18
- ignores: [
19
- "dist/**",
20
- "build/**",
21
- "coverage/**",
22
- "node_modules/**",
23
- ".next/**",
24
- ],
25
- },
26
- {
27
- languageOptions: {
28
- sourceType: "module",
29
- },
30
- },
31
- ];
@@ -1,26 +0,0 @@
1
- import tseslint from "typescript-eslint";
2
- import globals from "globals";
3
- import { config as baseConfig } from "./base.js";
4
-
5
- /** @type {import("eslint").Linter.Config} */
6
- export const config = [
7
- ...baseConfig,
8
- {
9
- languageOptions: {
10
- globals: {
11
- ...globals.node,
12
- },
13
- sourceType: "module",
14
- },
15
- },
16
- {
17
- rules: {
18
- "@typescript-eslint/no-explicit-any": "off",
19
- "@typescript-eslint/no-floating-promises": "error",
20
- "@typescript-eslint/no-unsafe-argument": "error",
21
- },
22
- },
23
- {
24
- ignores: ["test/**"],
25
- },
26
- ];