create-ej-app 6.0.0 → 7.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 (364) hide show
  1. package/cli.js +88 -14
  2. package/cli.ts +100 -17
  3. package/package.json +2 -2
  4. package/template/base/.env.example +11 -15
  5. package/template/base/Dockerfile +15 -0
  6. package/template/base/components.json +10 -5
  7. package/template/base/drizzle.config.ts +4 -5
  8. package/template/{new → base}/eslint.config.mjs +6 -1
  9. package/template/base/package.json +58 -75
  10. package/template/base/postcss.config.mjs +1 -4
  11. package/template/base/src/app/(admin)/layout.tsx +20 -0
  12. package/template/base/src/app/(app)/layout.tsx +13 -118
  13. package/template/base/src/app/(auth)/login/page.tsx +65 -42
  14. package/template/base/src/app/(marketing)/layout.tsx +7 -35
  15. package/template/base/src/app/(marketing)/page.tsx +2 -96
  16. package/template/base/src/app/(marketing)/privacy/page.tsx +3 -0
  17. package/template/base/src/app/(marketing)/terms/page.tsx +3 -0
  18. package/template/base/src/app/globals.css +118 -66
  19. package/template/base/src/app/layout.tsx +27 -12
  20. package/template/base/src/app/not-found.tsx +27 -0
  21. package/template/base/src/components/site-footer.tsx +16 -24
  22. package/template/base/src/components/ui/button.tsx +31 -27
  23. package/template/base/src/components/ui/card.tsx +83 -70
  24. package/template/base/src/components/ui/form.tsx +38 -47
  25. package/template/base/src/components/ui/input.tsx +16 -20
  26. package/template/base/src/components/ui/label.tsx +16 -18
  27. package/template/base/src/components/ui/separator.tsx +11 -14
  28. package/template/base/src/components/ui/sonner.tsx +22 -13
  29. package/template/base/src/db/index.ts +4 -11
  30. package/template/base/src/db/schema.ts +60 -268
  31. package/template/{new → base}/src/env.ts +2 -2
  32. package/template/{new → base}/src/lib/auth-client.ts +2 -0
  33. package/template/base/src/lib/auth.ts +64 -80
  34. package/template/base/src/lib/safe-action.ts +30 -6
  35. package/template/base/tsconfig.json +9 -7
  36. package/template/{prisma-advanced → old}/.env.example +10 -9
  37. package/template/{prisma → old}/components.json +1 -1
  38. package/template/old/drizzle.config.ts +11 -0
  39. package/template/old/package.json +87 -0
  40. package/template/old/postcss.config.mjs +8 -0
  41. package/template/{prisma-advanced → old}/src/app/(app)/layout.tsx +11 -3
  42. package/template/{prisma-advanced → old}/src/app/(auth)/login/page.tsx +2 -2
  43. package/template/{prisma → old}/src/app/(marketing)/page.tsx +8 -7
  44. package/template/old/src/app/layout.tsx +31 -0
  45. package/template/old/src/components/ui/sonner.tsx +31 -0
  46. package/template/old/src/db/index.ts +14 -0
  47. package/template/old/src/db/schema.ts +287 -0
  48. package/template/old/src/lib/auth.ts +89 -0
  49. package/template/old/src/lib/safe-action.ts +19 -0
  50. package/template/{prisma-advanced → old}/tsconfig.json +3 -2
  51. package/template/new/.env.example +0 -13
  52. package/template/new/components.json +0 -22
  53. package/template/new/drizzle.config.ts +0 -10
  54. package/template/new/package.json +0 -81
  55. package/template/new/postcss.config.mjs +0 -5
  56. package/template/new/src/app/(auth)/login/page.tsx +0 -72
  57. package/template/new/src/app/globals.css +0 -128
  58. package/template/new/src/app/layout.tsx +0 -50
  59. package/template/new/src/app/page.tsx +0 -3
  60. package/template/new/src/components/ui/button.tsx +0 -60
  61. package/template/new/src/components/ui/card.tsx +0 -92
  62. package/template/new/src/components/ui/form.tsx +0 -167
  63. package/template/new/src/components/ui/input.tsx +0 -21
  64. package/template/new/src/components/ui/label.tsx +0 -24
  65. package/template/new/src/components/ui/separator.tsx +0 -28
  66. package/template/new/src/components/ui/sonner.tsx +0 -40
  67. package/template/new/src/db/index.ts +0 -7
  68. package/template/new/src/db/schema.ts +0 -74
  69. package/template/new/src/lib/auth.ts +0 -67
  70. package/template/new/src/lib/safe-action.ts +0 -15
  71. package/template/new/tsconfig.json +0 -49
  72. package/template/prisma/.env.example +0 -16
  73. package/template/prisma/.eslintrc.cjs +0 -24
  74. package/template/prisma/next.config.mjs +0 -15
  75. package/template/prisma/package.json +0 -80
  76. package/template/prisma/postcss.config.cjs +0 -6
  77. package/template/prisma/prettier.config.ts +0 -11
  78. package/template/prisma/prisma/schema.prisma +0 -115
  79. package/template/prisma/public/next.svg +0 -1
  80. package/template/prisma/src/app/(app)/dashboard/page.tsx +0 -19
  81. package/template/prisma/src/app/(app)/layout.tsx +0 -90
  82. package/template/prisma/src/app/(app)/settings/actions.ts +0 -18
  83. package/template/prisma/src/app/(app)/settings/loading.tsx +0 -28
  84. package/template/prisma/src/app/(app)/settings/page.tsx +0 -28
  85. package/template/prisma/src/app/(app)/settings/render.tsx +0 -113
  86. package/template/prisma/src/app/(app)/tasks/[id]/actions.ts +0 -147
  87. package/template/prisma/src/app/(app)/tasks/[id]/page.tsx +0 -25
  88. package/template/prisma/src/app/(app)/tasks/[id]/render.tsx +0 -413
  89. package/template/prisma/src/app/(app)/tasks/actions.ts +0 -69
  90. package/template/prisma/src/app/(app)/tasks/page.tsx +0 -53
  91. package/template/prisma/src/app/(app)/tasks/render.tsx +0 -107
  92. package/template/prisma/src/app/(app)/users/[id]/actions.ts +0 -83
  93. package/template/prisma/src/app/(app)/users/[id]/page.tsx +0 -32
  94. package/template/prisma/src/app/(app)/users/[id]/render.tsx +0 -240
  95. package/template/prisma/src/app/(app)/users/actions.ts +0 -55
  96. package/template/prisma/src/app/(app)/users/page.tsx +0 -49
  97. package/template/prisma/src/app/(app)/users/render.tsx +0 -80
  98. package/template/prisma/src/app/(auth)/layout.tsx +0 -20
  99. package/template/prisma/src/app/(auth)/login/page.tsx +0 -49
  100. package/template/prisma/src/app/(auth)/login/user-auth-form.tsx +0 -152
  101. package/template/prisma/src/app/api/auth/[...nextauth]/route.ts +0 -7
  102. package/template/prisma/src/app/api/upload/route.ts +0 -36
  103. package/template/prisma/src/app/favicon.ico +0 -0
  104. package/template/prisma/src/app/layout.tsx +0 -34
  105. package/template/prisma/src/components/app-nav-command.tsx +0 -160
  106. package/template/prisma/src/components/dark-mode-toggle.tsx +0 -43
  107. package/template/prisma/src/components/data-table/data-table-column-header.tsx +0 -91
  108. package/template/prisma/src/components/data-table/data-table-faceted-filter.tsx +0 -149
  109. package/template/prisma/src/components/data-table/data-table-loading.tsx +0 -77
  110. package/template/prisma/src/components/data-table/data-table-pagination.tsx +0 -94
  111. package/template/prisma/src/components/data-table/data-table-toolbar.tsx +0 -78
  112. package/template/prisma/src/components/data-table/data-table-types.ts +0 -17
  113. package/template/prisma/src/components/data-table/data-table-view-options.tsx +0 -59
  114. package/template/prisma/src/components/data-table/data-table.tsx +0 -301
  115. package/template/prisma/src/components/data-table/simple-data-table.tsx +0 -109
  116. package/template/prisma/src/components/empty-placeholder.tsx +0 -78
  117. package/template/prisma/src/components/heading.tsx +0 -17
  118. package/template/prisma/src/components/icons.tsx +0 -85
  119. package/template/prisma/src/components/main-nav.tsx +0 -64
  120. package/template/prisma/src/components/mobile-nav.tsx +0 -50
  121. package/template/prisma/src/components/shell.tsx +0 -13
  122. package/template/prisma/src/components/side-nav.tsx +0 -51
  123. package/template/prisma/src/components/site-footer.tsx +0 -31
  124. package/template/prisma/src/components/system-info.tsx +0 -36
  125. package/template/prisma/src/components/theme-provider.tsx +0 -13
  126. package/template/prisma/src/components/ui/alert-dialog.tsx +0 -141
  127. package/template/prisma/src/components/ui/avatar.tsx +0 -50
  128. package/template/prisma/src/components/ui/badge.tsx +0 -36
  129. package/template/prisma/src/components/ui/button.tsx +0 -56
  130. package/template/prisma/src/components/ui/card.tsx +0 -79
  131. package/template/prisma/src/components/ui/checkbox.tsx +0 -30
  132. package/template/prisma/src/components/ui/command.tsx +0 -155
  133. package/template/prisma/src/components/ui/dialog.tsx +0 -122
  134. package/template/prisma/src/components/ui/dropdown-menu.tsx +0 -200
  135. package/template/prisma/src/components/ui/form.tsx +0 -176
  136. package/template/prisma/src/components/ui/input.tsx +0 -25
  137. package/template/prisma/src/components/ui/label.tsx +0 -26
  138. package/template/prisma/src/components/ui/popover.tsx +0 -31
  139. package/template/prisma/src/components/ui/select.tsx +0 -160
  140. package/template/prisma/src/components/ui/separator.tsx +0 -31
  141. package/template/prisma/src/components/ui/skeleton.tsx +0 -15
  142. package/template/prisma/src/components/ui/table.tsx +0 -117
  143. package/template/prisma/src/components/ui/textarea.tsx +0 -24
  144. package/template/prisma/src/components/ui/toast.tsx +0 -127
  145. package/template/prisma/src/components/ui/toaster.tsx +0 -35
  146. package/template/prisma/src/components/ui/use-toast.ts +0 -189
  147. package/template/prisma/src/components/user-account-nav.tsx +0 -60
  148. package/template/prisma/src/components/user-avatar.tsx +0 -25
  149. package/template/prisma/src/env.mjs +0 -78
  150. package/template/prisma/src/hooks/use-debounce.ts +0 -17
  151. package/template/prisma/src/hooks/use-lock-body.tsx +0 -12
  152. package/template/prisma/src/lib/auth.ts +0 -80
  153. package/template/prisma/src/lib/cn.ts +0 -4
  154. package/template/prisma/src/lib/db.ts +0 -20
  155. package/template/prisma/src/lib/delay.ts +0 -2
  156. package/template/prisma/src/lib/formatDate.ts +0 -11
  157. package/template/prisma/src/lib/generateLabel.ts +0 -5
  158. package/template/prisma/src/lib/siteConfig.ts +0 -4
  159. package/template/prisma/src/lib/storageClient.ts +0 -11
  160. package/template/prisma/src/styles/editor.css +0 -61
  161. package/template/prisma/src/styles/globals.css +0 -76
  162. package/template/prisma/src/types/UnwrapPromise.ts +0 -1
  163. package/template/prisma/tailwind.config.ts +0 -80
  164. package/template/prisma/tsconfig.json +0 -46
  165. package/template/prisma-advanced/.eslintrc.cjs +0 -24
  166. package/template/prisma-advanced/components.json +0 -17
  167. package/template/prisma-advanced/next.config.mjs +0 -15
  168. package/template/prisma-advanced/package.json +0 -80
  169. package/template/prisma-advanced/postcss.config.cjs +0 -6
  170. package/template/prisma-advanced/prettier.config.ts +0 -11
  171. package/template/prisma-advanced/prisma/schema.prisma +0 -154
  172. package/template/prisma-advanced/public/next.svg +0 -1
  173. package/template/prisma-advanced/src/app/(app)/dashboard/page.tsx +0 -19
  174. package/template/prisma-advanced/src/app/(app)/roles/[id]/actions.ts +0 -100
  175. package/template/prisma-advanced/src/app/(app)/roles/[id]/page.tsx +0 -36
  176. package/template/prisma-advanced/src/app/(app)/roles/[id]/render.tsx +0 -266
  177. package/template/prisma-advanced/src/app/(app)/roles/actions.ts +0 -67
  178. package/template/prisma-advanced/src/app/(app)/roles/page.tsx +0 -51
  179. package/template/prisma-advanced/src/app/(app)/roles/render.tsx +0 -70
  180. package/template/prisma-advanced/src/app/(app)/settings/actions.ts +0 -18
  181. package/template/prisma-advanced/src/app/(app)/settings/loading.tsx +0 -28
  182. package/template/prisma-advanced/src/app/(app)/settings/page.tsx +0 -28
  183. package/template/prisma-advanced/src/app/(app)/settings/render.tsx +0 -113
  184. package/template/prisma-advanced/src/app/(app)/tasks/[id]/actions.ts +0 -147
  185. package/template/prisma-advanced/src/app/(app)/tasks/[id]/page.tsx +0 -55
  186. package/template/prisma-advanced/src/app/(app)/tasks/[id]/render.tsx +0 -418
  187. package/template/prisma-advanced/src/app/(app)/tasks/actions.ts +0 -69
  188. package/template/prisma-advanced/src/app/(app)/tasks/page.tsx +0 -63
  189. package/template/prisma-advanced/src/app/(app)/tasks/render.tsx +0 -114
  190. package/template/prisma-advanced/src/app/(app)/users/[id]/actions.ts +0 -104
  191. package/template/prisma-advanced/src/app/(app)/users/[id]/page.tsx +0 -39
  192. package/template/prisma-advanced/src/app/(app)/users/[id]/render.tsx +0 -320
  193. package/template/prisma-advanced/src/app/(app)/users/actions.ts +0 -67
  194. package/template/prisma-advanced/src/app/(app)/users/page.tsx +0 -61
  195. package/template/prisma-advanced/src/app/(app)/users/render.tsx +0 -108
  196. package/template/prisma-advanced/src/app/(auth)/layout.tsx +0 -20
  197. package/template/prisma-advanced/src/app/(auth)/login/user-auth-form.tsx +0 -152
  198. package/template/prisma-advanced/src/app/(marketing)/layout.tsx +0 -42
  199. package/template/prisma-advanced/src/app/(marketing)/page.tsx +0 -96
  200. package/template/prisma-advanced/src/app/api/auth/[...nextauth]/route.ts +0 -7
  201. package/template/prisma-advanced/src/app/api/upload/route.ts +0 -36
  202. package/template/prisma-advanced/src/app/favicon.ico +0 -0
  203. package/template/prisma-advanced/src/app/layout.tsx +0 -34
  204. package/template/prisma-advanced/src/components/app-nav-command.tsx +0 -160
  205. package/template/prisma-advanced/src/components/dark-mode-toggle.tsx +0 -43
  206. package/template/prisma-advanced/src/components/data-table/data-table-column-header.tsx +0 -91
  207. package/template/prisma-advanced/src/components/data-table/data-table-faceted-filter.tsx +0 -149
  208. package/template/prisma-advanced/src/components/data-table/data-table-loading.tsx +0 -77
  209. package/template/prisma-advanced/src/components/data-table/data-table-pagination.tsx +0 -94
  210. package/template/prisma-advanced/src/components/data-table/data-table-toolbar.tsx +0 -78
  211. package/template/prisma-advanced/src/components/data-table/data-table-types.ts +0 -17
  212. package/template/prisma-advanced/src/components/data-table/data-table-view-options.tsx +0 -59
  213. package/template/prisma-advanced/src/components/data-table/data-table.tsx +0 -301
  214. package/template/prisma-advanced/src/components/data-table/simple-data-table.tsx +0 -109
  215. package/template/prisma-advanced/src/components/empty-placeholder.tsx +0 -78
  216. package/template/prisma-advanced/src/components/heading.tsx +0 -17
  217. package/template/prisma-advanced/src/components/icons.tsx +0 -85
  218. package/template/prisma-advanced/src/components/main-nav.tsx +0 -64
  219. package/template/prisma-advanced/src/components/shell.tsx +0 -13
  220. package/template/prisma-advanced/src/components/side-nav.tsx +0 -51
  221. package/template/prisma-advanced/src/components/system-info.tsx +0 -36
  222. package/template/prisma-advanced/src/components/theme-provider.tsx +0 -13
  223. package/template/prisma-advanced/src/components/ui/alert-dialog.tsx +0 -141
  224. package/template/prisma-advanced/src/components/ui/avatar.tsx +0 -50
  225. package/template/prisma-advanced/src/components/ui/badge.tsx +0 -36
  226. package/template/prisma-advanced/src/components/ui/checkbox.tsx +0 -30
  227. package/template/prisma-advanced/src/components/ui/command.tsx +0 -155
  228. package/template/prisma-advanced/src/components/ui/dialog.tsx +0 -122
  229. package/template/prisma-advanced/src/components/ui/dropdown-menu.tsx +0 -200
  230. package/template/prisma-advanced/src/components/ui/popover.tsx +0 -31
  231. package/template/prisma-advanced/src/components/ui/select.tsx +0 -160
  232. package/template/prisma-advanced/src/components/ui/skeleton.tsx +0 -15
  233. package/template/prisma-advanced/src/components/ui/table.tsx +0 -117
  234. package/template/prisma-advanced/src/components/ui/textarea.tsx +0 -24
  235. package/template/prisma-advanced/src/components/ui/toast.tsx +0 -127
  236. package/template/prisma-advanced/src/components/ui/toaster.tsx +0 -35
  237. package/template/prisma-advanced/src/components/ui/use-toast.ts +0 -189
  238. package/template/prisma-advanced/src/components/user-account-nav.tsx +0 -60
  239. package/template/prisma-advanced/src/components/user-avatar.tsx +0 -25
  240. package/template/prisma-advanced/src/env.mjs +0 -78
  241. package/template/prisma-advanced/src/hooks/use-debounce.ts +0 -17
  242. package/template/prisma-advanced/src/hooks/use-lock-body.tsx +0 -12
  243. package/template/prisma-advanced/src/lib/auth.ts +0 -180
  244. package/template/prisma-advanced/src/lib/cn.ts +0 -4
  245. package/template/prisma-advanced/src/lib/db.ts +0 -20
  246. package/template/prisma-advanced/src/lib/delay.ts +0 -2
  247. package/template/prisma-advanced/src/lib/formatDate.ts +0 -11
  248. package/template/prisma-advanced/src/lib/generateLabel.ts +0 -5
  249. package/template/prisma-advanced/src/lib/siteConfig.ts +0 -4
  250. package/template/prisma-advanced/src/lib/storageClient.ts +0 -11
  251. package/template/prisma-advanced/src/styles/editor.css +0 -61
  252. package/template/prisma-advanced/src/types/UnwrapPromise.ts +0 -1
  253. package/template/prisma-advanced/tailwind.config.ts +0 -80
  254. package/template/{new → base}/next.config.ts +0 -0
  255. package/template/{new → base}/public/placeholder.svg +0 -0
  256. package/template/{new → base}/src/app/(auth)/login/email-login-form.tsx +0 -0
  257. package/template/{new → base}/src/app/(auth)/login/social-login-buttons.tsx +0 -0
  258. package/template/{new → base}/src/app/api/auth/[...all]/route.ts +0 -0
  259. package/template/{new → base}/src/components/loader.tsx +0 -0
  260. package/template/{new → base}/src/components/react-query-provider.tsx +0 -0
  261. package/template/{new → base}/src/components/screen-size.tsx +0 -0
  262. package/template/{new → base}/src/components/theme-toggle.tsx +0 -0
  263. package/template/{new → base}/src/lib/toast-message.ts +0 -0
  264. package/template/{base → old}/.eslintrc.cjs +0 -0
  265. package/template/{base → old}/next.config.mjs +0 -0
  266. package/template/{new → old}/prettier.config.mjs +0 -0
  267. package/template/{base → old}/public/next.svg +0 -0
  268. package/template/{base → old}/public/vercel.svg +0 -0
  269. package/template/{base → old}/src/app/(app)/dashboard/layout.tsx +0 -0
  270. package/template/{base → old}/src/app/(app)/dashboard/page.tsx +0 -0
  271. package/template/{base → old}/src/app/(app)/roles/[id]/actions.ts +0 -0
  272. package/template/{base → old}/src/app/(app)/roles/[id]/page.tsx +0 -0
  273. package/template/{base → old}/src/app/(app)/roles/[id]/render.tsx +0 -0
  274. package/template/{base → old}/src/app/(app)/roles/[id]/validation.ts +0 -0
  275. package/template/{base → old}/src/app/(app)/roles/actions.ts +0 -0
  276. package/template/{base → old}/src/app/(app)/roles/page.tsx +0 -0
  277. package/template/{base → old}/src/app/(app)/roles/render.tsx +0 -0
  278. package/template/{base → old}/src/app/(app)/settings/actions.ts +0 -0
  279. package/template/{base → old}/src/app/(app)/settings/layout.tsx +0 -0
  280. package/template/{base → old}/src/app/(app)/settings/loading.tsx +0 -0
  281. package/template/{base → old}/src/app/(app)/settings/page.tsx +0 -0
  282. package/template/{base → old}/src/app/(app)/settings/render.tsx +0 -0
  283. package/template/{base → old}/src/app/(app)/settings/validation.ts +0 -0
  284. package/template/{base → old}/src/app/(app)/tasks/[id]/actions.ts +0 -0
  285. package/template/{base → old}/src/app/(app)/tasks/[id]/page.tsx +0 -0
  286. package/template/{base → old}/src/app/(app)/tasks/[id]/render.tsx +0 -0
  287. package/template/{base → old}/src/app/(app)/tasks/[id]/validation.ts +0 -0
  288. package/template/{base → old}/src/app/(app)/tasks/actions.ts +0 -0
  289. package/template/{base → old}/src/app/(app)/tasks/page.tsx +0 -0
  290. package/template/{base → old}/src/app/(app)/tasks/render.tsx +0 -0
  291. package/template/{base → old}/src/app/(app)/tasks/statusEnum.ts +0 -0
  292. package/template/{base → old}/src/app/(app)/users/[id]/actions.ts +0 -0
  293. package/template/{base → old}/src/app/(app)/users/[id]/page.tsx +0 -0
  294. package/template/{base → old}/src/app/(app)/users/[id]/render.tsx +0 -0
  295. package/template/{base → old}/src/app/(app)/users/[id]/validation.ts +0 -0
  296. package/template/{base → old}/src/app/(app)/users/actions.ts +0 -0
  297. package/template/{base → old}/src/app/(app)/users/page.tsx +0 -0
  298. package/template/{base → old}/src/app/(app)/users/render.tsx +0 -0
  299. package/template/{base → old}/src/app/(auth)/layout.tsx +0 -0
  300. package/template/{base → old}/src/app/(auth)/login/render.tsx +0 -0
  301. package/template/{prisma → old}/src/app/(marketing)/layout.tsx +1 -1
  302. /package/template/{base → old}/src/app/api/auth/[...nextauth]/route.ts +0 -0
  303. /package/template/{new → old}/src/app/favicon.ico +0 -0
  304. /package/template/{prisma-advanced/src/styles → old/src/app}/globals.css +0 -0
  305. /package/template/{base → old}/src/components/app-nav-command.tsx +0 -0
  306. /package/template/{base → old}/src/components/dark-mode-toggle.tsx +0 -0
  307. /package/template/{base → old}/src/components/data-table/data-table-column-header.tsx +0 -0
  308. /package/template/{base → old}/src/components/data-table/data-table-faceted-filter.tsx +0 -0
  309. /package/template/{base → old}/src/components/data-table/data-table-loading.tsx +0 -0
  310. /package/template/{base → old}/src/components/data-table/data-table-pagination.tsx +0 -0
  311. /package/template/{base → old}/src/components/data-table/data-table-toolbar.tsx +0 -0
  312. /package/template/{base → old}/src/components/data-table/data-table-types.ts +0 -0
  313. /package/template/{base → old}/src/components/data-table/data-table-view-options.tsx +0 -0
  314. /package/template/{base → old}/src/components/data-table/data-table.tsx +0 -0
  315. /package/template/{base → old}/src/components/data-table/simple-data-table.tsx +0 -0
  316. /package/template/{base → old}/src/components/empty-placeholder.tsx +0 -0
  317. /package/template/{base → old}/src/components/heading.tsx +0 -0
  318. /package/template/{base → old}/src/components/icons.tsx +0 -0
  319. /package/template/{base → old}/src/components/main-nav.tsx +0 -0
  320. /package/template/{base → old}/src/components/mobile-nav.tsx +0 -0
  321. /package/template/{base → old}/src/components/shell.tsx +0 -0
  322. /package/template/{base → old}/src/components/side-nav.tsx +0 -0
  323. /package/template/{prisma-advanced → old}/src/components/site-footer.tsx +0 -0
  324. /package/template/{base → old}/src/components/system-info.tsx +0 -0
  325. /package/template/{base → old}/src/components/ui/alert-dialog.tsx +0 -0
  326. /package/template/{base → old}/src/components/ui/avatar.tsx +0 -0
  327. /package/template/{base → old}/src/components/ui/badge.tsx +0 -0
  328. /package/template/{prisma-advanced → old}/src/components/ui/button.tsx +0 -0
  329. /package/template/{prisma-advanced → old}/src/components/ui/card.tsx +0 -0
  330. /package/template/{base → old}/src/components/ui/checkbox.tsx +0 -0
  331. /package/template/{base → old}/src/components/ui/command.tsx +0 -0
  332. /package/template/{base → old}/src/components/ui/dialog.tsx +0 -0
  333. /package/template/{base → old}/src/components/ui/dropdown-menu.tsx +0 -0
  334. /package/template/{prisma-advanced → old}/src/components/ui/form.tsx +0 -0
  335. /package/template/{prisma-advanced → old}/src/components/ui/input.tsx +0 -0
  336. /package/template/{prisma-advanced → old}/src/components/ui/label.tsx +0 -0
  337. /package/template/{base → old}/src/components/ui/popover.tsx +0 -0
  338. /package/template/{base → old}/src/components/ui/select.tsx +0 -0
  339. /package/template/{prisma-advanced → old}/src/components/ui/separator.tsx +0 -0
  340. /package/template/{base → old}/src/components/ui/skeleton.tsx +0 -0
  341. /package/template/{base → old}/src/components/ui/table.tsx +0 -0
  342. /package/template/{base → old}/src/components/user-account-nav.tsx +0 -0
  343. /package/template/{base → old}/src/components/user-avatar.tsx +0 -0
  344. /package/template/{base → old}/src/data-access/resource.ts +0 -0
  345. /package/template/{base → old}/src/data-access/role-permission.ts +0 -0
  346. /package/template/{base → old}/src/data-access/role.ts +0 -0
  347. /package/template/{base → old}/src/data-access/task.ts +0 -0
  348. /package/template/{base → old}/src/data-access/user.ts +0 -0
  349. /package/template/{base → old}/src/env.mjs +0 -0
  350. /package/template/{base → old}/src/hooks/use-debounce.tsx +0 -0
  351. /package/template/{base → old}/src/hooks/use-lock-body.tsx +0 -0
  352. /package/template/{new → old}/src/lib/cn.ts +0 -0
  353. /package/template/{base → old}/src/lib/currentUser.ts +0 -0
  354. /package/template/{new → old}/src/lib/delay.ts +0 -0
  355. /package/template/{base → old}/src/lib/formatDate.ts +0 -0
  356. /package/template/{base → old}/src/lib/generateLabel.ts +0 -0
  357. /package/template/{base → old}/src/lib/s3Client.ts +0 -0
  358. /package/template/{new → old}/src/lib/siteConfig.ts +0 -0
  359. /package/template/{base → old}/src/lib/sortOrderEnum.ts +0 -0
  360. /package/template/{base → old}/src/use-case/role-permission.ts +0 -0
  361. /package/template/{base → old}/src/use-case/role.ts +0 -0
  362. /package/template/{base → old}/src/use-case/task.ts +0 -0
  363. /package/template/{base → old}/src/use-case/user.ts +0 -0
  364. /package/template/{base → old}/tailwind.config.ts +0 -0
@@ -1,35 +0,0 @@
1
- 'use client'
2
-
3
- import {
4
- Toast,
5
- ToastClose,
6
- ToastDescription,
7
- ToastProvider,
8
- ToastTitle,
9
- ToastViewport
10
- } from '@/components/ui/toast'
11
- import { useToast } from '@/components/ui/use-toast'
12
-
13
- export function Toaster() {
14
- const { toasts } = useToast()
15
-
16
- return (
17
- <ToastProvider>
18
- {toasts.map(function ({ id, title, description, action, ...props }) {
19
- return (
20
- <Toast key={id} {...props}>
21
- <div className="grid gap-1">
22
- {title && <ToastTitle>{title}</ToastTitle>}
23
- {description && (
24
- <ToastDescription>{description}</ToastDescription>
25
- )}
26
- </div>
27
- {action}
28
- <ToastClose />
29
- </Toast>
30
- )
31
- })}
32
- <ToastViewport />
33
- </ToastProvider>
34
- )
35
- }
@@ -1,189 +0,0 @@
1
- // Inspired by react-hot-toast library
2
- import * as React from 'react'
3
-
4
- import type { ToastActionElement, ToastProps } from '@/components/ui/toast'
5
-
6
- const TOAST_LIMIT = 1
7
- const TOAST_REMOVE_DELAY = 1000000
8
-
9
- type ToasterToast = ToastProps & {
10
- id: string
11
- title?: React.ReactNode
12
- description?: React.ReactNode
13
- action?: ToastActionElement
14
- }
15
-
16
- const actionTypes = {
17
- ADD_TOAST: 'ADD_TOAST',
18
- UPDATE_TOAST: 'UPDATE_TOAST',
19
- DISMISS_TOAST: 'DISMISS_TOAST',
20
- REMOVE_TOAST: 'REMOVE_TOAST'
21
- } as const
22
-
23
- let count = 0
24
-
25
- function genId() {
26
- count = (count + 1) % Number.MAX_VALUE
27
- return count.toString()
28
- }
29
-
30
- type ActionType = typeof actionTypes
31
-
32
- type Action =
33
- | {
34
- type: ActionType['ADD_TOAST']
35
- toast: ToasterToast
36
- }
37
- | {
38
- type: ActionType['UPDATE_TOAST']
39
- toast: Partial<ToasterToast>
40
- }
41
- | {
42
- type: ActionType['DISMISS_TOAST']
43
- toastId?: ToasterToast['id']
44
- }
45
- | {
46
- type: ActionType['REMOVE_TOAST']
47
- toastId?: ToasterToast['id']
48
- }
49
-
50
- interface State {
51
- toasts: ToasterToast[]
52
- }
53
-
54
- const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()
55
-
56
- const addToRemoveQueue = (toastId: string) => {
57
- if (toastTimeouts.has(toastId)) {
58
- return
59
- }
60
-
61
- const timeout = setTimeout(() => {
62
- toastTimeouts.delete(toastId)
63
- dispatch({
64
- type: 'REMOVE_TOAST',
65
- toastId: toastId
66
- })
67
- }, TOAST_REMOVE_DELAY)
68
-
69
- toastTimeouts.set(toastId, timeout)
70
- }
71
-
72
- export const reducer = (state: State, action: Action): State => {
73
- switch (action.type) {
74
- case 'ADD_TOAST':
75
- return {
76
- ...state,
77
- toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT)
78
- }
79
-
80
- case 'UPDATE_TOAST':
81
- return {
82
- ...state,
83
- toasts: state.toasts.map(t =>
84
- t.id === action.toast.id ? { ...t, ...action.toast } : t
85
- )
86
- }
87
-
88
- case 'DISMISS_TOAST': {
89
- const { toastId } = action
90
-
91
- // ! Side effects ! - This could be extracted into a dismissToast() action,
92
- // but I'll keep it here for simplicity
93
- if (toastId) {
94
- addToRemoveQueue(toastId)
95
- } else {
96
- state.toasts.forEach(toast => {
97
- addToRemoveQueue(toast.id)
98
- })
99
- }
100
-
101
- return {
102
- ...state,
103
- toasts: state.toasts.map(t =>
104
- t.id === toastId || toastId === undefined
105
- ? {
106
- ...t,
107
- open: false
108
- }
109
- : t
110
- )
111
- }
112
- }
113
- case 'REMOVE_TOAST':
114
- if (action.toastId === undefined) {
115
- return {
116
- ...state,
117
- toasts: []
118
- }
119
- }
120
- return {
121
- ...state,
122
- toasts: state.toasts.filter(t => t.id !== action.toastId)
123
- }
124
- }
125
- }
126
-
127
- const listeners: Array<(state: State) => void> = []
128
-
129
- let memoryState: State = { toasts: [] }
130
-
131
- function dispatch(action: Action) {
132
- memoryState = reducer(memoryState, action)
133
- listeners.forEach(listener => {
134
- listener(memoryState)
135
- })
136
- }
137
-
138
- type Toast = Omit<ToasterToast, 'id'>
139
-
140
- function toast({ ...props }: Toast) {
141
- const id = genId()
142
-
143
- const update = (props: ToasterToast) =>
144
- dispatch({
145
- type: 'UPDATE_TOAST',
146
- toast: { ...props, id }
147
- })
148
- const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })
149
-
150
- dispatch({
151
- type: 'ADD_TOAST',
152
- toast: {
153
- ...props,
154
- id,
155
- open: true,
156
- onOpenChange: open => {
157
- if (!open) dismiss()
158
- }
159
- }
160
- })
161
-
162
- return {
163
- id: id,
164
- dismiss,
165
- update
166
- }
167
- }
168
-
169
- function useToast() {
170
- const [state, setState] = React.useState<State>(memoryState)
171
-
172
- React.useEffect(() => {
173
- listeners.push(setState)
174
- return () => {
175
- const index = listeners.indexOf(setState)
176
- if (index > -1) {
177
- listeners.splice(index, 1)
178
- }
179
- }
180
- }, [state])
181
-
182
- return {
183
- ...state,
184
- toast,
185
- dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId })
186
- }
187
- }
188
-
189
- export { toast, useToast }
@@ -1,60 +0,0 @@
1
- 'use client'
2
-
3
- import { User } from 'next-auth'
4
- import { signOut } from 'next-auth/react'
5
- import Link from 'next/link'
6
- import { FC, HTMLAttributes } from 'react'
7
-
8
- import {
9
- DropdownMenu,
10
- DropdownMenuContent,
11
- DropdownMenuItem,
12
- DropdownMenuSeparator,
13
- DropdownMenuTrigger
14
- } from '@/components/ui/dropdown-menu'
15
- import { UserAvatar } from '@/components/user-avatar'
16
-
17
- interface UserAccountNavProps extends HTMLAttributes<HTMLDivElement> {
18
- user: Pick<User, 'name' | 'image' | 'email'>
19
- }
20
-
21
- export const UserAccountNav: FC<UserAccountNavProps> = ({ user }) => {
22
- return (
23
- <DropdownMenu>
24
- <DropdownMenuTrigger>
25
- <UserAvatar
26
- user={{ name: user.name || null, image: user.image || null }}
27
- className="h-8 w-8"
28
- />
29
- </DropdownMenuTrigger>
30
- <DropdownMenuContent align="end">
31
- <div className="flex items-center justify-start gap-2 p-2">
32
- <div className="flex flex-col space-y-1 leading-none">
33
- {user.name && <p className="font-medium">{user.name}</p>}
34
- {user.email && (
35
- <p className="w-[200px] truncate text-sm text-muted-foreground">
36
- {user.email}
37
- </p>
38
- )}
39
- </div>
40
- </div>
41
- <DropdownMenuSeparator />
42
- <DropdownMenuItem asChild>
43
- <Link href="/settings">Settings</Link>
44
- </DropdownMenuItem>
45
- <DropdownMenuSeparator />
46
- <DropdownMenuItem
47
- className="cursor-pointer"
48
- onSelect={event => {
49
- event.preventDefault()
50
- signOut({
51
- callbackUrl: `${window.location.origin}/login`
52
- })
53
- }}
54
- >
55
- Sign out
56
- </DropdownMenuItem>
57
- </DropdownMenuContent>
58
- </DropdownMenu>
59
- )
60
- }
@@ -1,25 +0,0 @@
1
- import { User } from '@prisma/client'
2
- import { AvatarProps } from '@radix-ui/react-avatar'
3
- import { FC } from 'react'
4
-
5
- import { Icons } from '@/components/icons'
6
- import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
7
-
8
- interface UserAvatarProps extends AvatarProps {
9
- user: Pick<User, 'image' | 'name'>
10
- }
11
-
12
- export const UserAvatar: FC<UserAvatarProps> = ({ user, ...props }) => {
13
- return (
14
- <Avatar {...props}>
15
- {user.image ? (
16
- <AvatarImage alt="Picture" src={user.image} />
17
- ) : (
18
- <AvatarFallback>
19
- <span className="sr-only">{user.name}</span>
20
- <Icons.user className="h-4 w-4" />
21
- </AvatarFallback>
22
- )}
23
- </Avatar>
24
- )
25
- }
@@ -1,78 +0,0 @@
1
- import { createEnv } from '@t3-oss/env-nextjs'
2
- import { z } from 'zod'
3
-
4
- export const env = createEnv({
5
- /**
6
- * Specify your server-side environment variables schema here. This way you can ensure the app
7
- * isn't built with invalid env vars.
8
- */
9
- server: {
10
- NODE_ENV: z.enum(['development', 'test', 'production']),
11
- DATABASE_URL: z.string().url(),
12
- NEXTAUTH_SECRET:
13
- process.env.NODE_ENV === 'production'
14
- ? z.string().min(1)
15
- : z.string().min(1).optional(),
16
- NEXTAUTH_URL: z.preprocess(
17
- // This makes Vercel deployments not fail if you don't set NEXTAUTH_URL
18
- // Since NextAuth.js automatically uses the VERCEL_URL if present.
19
- str => process.env.VERCEL_URL ?? str,
20
- // VERCEL_URL doesn't include `https` so it cant be validated as a URL
21
- process.env.VERCEL ? z.string().min(1) : z.string().url()
22
- ),
23
- EMAIL_SERVER_HOST: z.string().min(1),
24
- EMAIL_SERVER_PORT: z.number(),
25
- EMAIL_SERVER_USER: z.string().min(1),
26
- EMAIL_SERVER_PASSWORD: z.string().min(1),
27
- EMAIL_FROM: z.string().email(),
28
- GOOGLE_ID: z.string().min(1),
29
- GOOGLE_SECRET: z.string().min(1),
30
- GITHUB_ID: z.string().min(1),
31
- GITHUB_SECRET: z.string().min(1),
32
- FIREBASE_PROJECT_ID: z.string().min(1),
33
- FIREBASE_PRIVATE_KEY: z.string().min(1),
34
- FIREBASE_CLIENT_EMAIL: z.string().min(1),
35
- FIREBASE_STORAGE_BUCKET: z.string().min(1)
36
- },
37
-
38
- /**
39
- * Specify your client-side environment variables schema here. This way you can ensure the app
40
- * isn't built with invalid env vars. To expose them to the client, prefix them with
41
- * `NEXT_PUBLIC_`.
42
- */
43
- client: {
44
- // NEXT_PUBLIC_CLIENTVAR: z.string().min(1),
45
- },
46
-
47
- /**
48
- * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g.
49
- * middlewares) or client-side so we need to destruct manually.
50
- */
51
- runtimeEnv: {
52
- NODE_ENV: process.env.NODE_ENV,
53
- DATABASE_URL: process.env.DATABASE_URL,
54
- NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET,
55
- NEXTAUTH_URL: process.env.NEXTAUTH_URL,
56
- EMAIL_SERVER_HOST: process.env.EMAIL_SERVER_HOST,
57
- EMAIL_SERVER_PORT: parseInt(process.env.EMAIL_SERVER_PORT || ''),
58
- EMAIL_SERVER_USER: process.env.EMAIL_SERVER_USER,
59
- EMAIL_SERVER_PASSWORD: process.env.EMAIL_SERVER_PASSWORD,
60
- EMAIL_FROM: process.env.EMAIL_FROM,
61
- GOOGLE_ID: process.env.GOOGLE_ID,
62
- GOOGLE_SECRET: process.env.GOOGLE_SECRET,
63
- GITHUB_ID: process.env.GITHUB_ID,
64
- GITHUB_SECRET: process.env.GITHUB_SECRET,
65
- FIREBASE_PROJECT_ID: process.env.FIREBASE_PROJECT_ID,
66
- FIREBASE_PRIVATE_KEY: process.env.FIREBASE_PRIVATE_KEY,
67
- FIREBASE_CLIENT_EMAIL: process.env.FIREBASE_CLIENT_EMAIL,
68
- FIREBASE_STORAGE_BUCKET: process.env.FIREBASE_STORAGE_BUCKET
69
- },
70
- /**
71
- * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation.
72
- * This is especially useful for Docker builds.
73
- */
74
- skipValidation: !!process.env.SKIP_ENV_VALIDATION,
75
-
76
- // This makes empty strings be treated as undefined
77
- emptyStringAsUndefined: true
78
- })
@@ -1,17 +0,0 @@
1
- 'use client'
2
-
3
- import { useEffect, useState } from 'react'
4
-
5
- export function useDebounce<T>(value: T, delay?: number): T {
6
- const [debouncedValue, setDebouncedValue] = useState<T>(value)
7
-
8
- useEffect(() => {
9
- const timer = setTimeout(() => setDebouncedValue(value), delay || 500)
10
-
11
- return () => {
12
- clearTimeout(timer)
13
- }
14
- }, [value, delay])
15
-
16
- return debouncedValue
17
- }
@@ -1,12 +0,0 @@
1
- import { useLayoutEffect } from 'react'
2
-
3
- // @see https://usehooks.com/useLockBodyScroll.
4
- export function useLockBody() {
5
- useLayoutEffect((): (() => void) => {
6
- const originalStyle: string = window.getComputedStyle(
7
- document.body
8
- ).overflow
9
- document.body.style.overflow = 'hidden'
10
- return () => (document.body.style.overflow = originalStyle)
11
- }, [])
12
- }
@@ -1,180 +0,0 @@
1
- import { PrismaAdapter } from '@next-auth/prisma-adapter'
2
- import { Permissions, User as PrismaUser, UserType } from '@prisma/client'
3
- import {
4
- Session,
5
- getServerSession,
6
- type DefaultSession,
7
- type NextAuthOptions
8
- } from 'next-auth'
9
- import EmailProvider from 'next-auth/providers/email'
10
- import GitHubProvider from 'next-auth/providers/github'
11
- import GoogleProvider from 'next-auth/providers/google'
12
-
13
- import { env } from '@/env.mjs'
14
- import { prisma } from '@/lib/db'
15
-
16
- /**
17
- * Module augmentation for `next-auth` types. Allows us to add custom properties to the `session`
18
- * object and keep type safety.
19
- *
20
- * @see https://next-auth.js.org/getting-started/typescript#module-augmentation
21
- */
22
- declare module 'next-auth' {
23
- interface Session extends DefaultSession {
24
- user: {
25
- id: string
26
- type: UserType
27
- roleId?: string | null
28
- } & DefaultSession['user']
29
- }
30
-
31
- interface User extends PrismaUser {}
32
- }
33
-
34
- /**
35
- * Options for NextAuth.js used to configure adapters, providers, callbacks, etc.
36
- *
37
- * @see https://next-auth.js.org/configuration/options
38
- */
39
- export const authOptions: NextAuthOptions = {
40
- pages: {
41
- signIn: '/login'
42
- },
43
- callbacks: {
44
- session({ session, user }) {
45
- return {
46
- ...session,
47
- user: {
48
- ...session.user,
49
- id: user.id,
50
- type: user.type,
51
- roleId: user.roleId
52
- }
53
- }
54
- }
55
- },
56
- adapter: PrismaAdapter(prisma),
57
- providers: [
58
- EmailProvider({
59
- server: {
60
- host: env.EMAIL_SERVER_HOST,
61
- port: env.EMAIL_SERVER_PORT,
62
- auth: {
63
- user: env.EMAIL_SERVER_USER,
64
- pass: env.EMAIL_SERVER_PASSWORD
65
- }
66
- },
67
- from: env.EMAIL_FROM
68
- }),
69
- GoogleProvider({
70
- clientId: env.GOOGLE_ID,
71
- clientSecret: env.GOOGLE_SECRET
72
- }),
73
- GitHubProvider({
74
- clientId: env.GITHUB_ID,
75
- clientSecret: env.GITHUB_SECRET
76
- })
77
- ]
78
- }
79
-
80
- /**
81
- * Wrapper for `getServerSession` so that you don't need to import the `authOptions` in every file.
82
- *
83
- * @see https://next-auth.js.org/configuration/nextjs
84
- */
85
- export const getAuthSession = () => getServerSession(authOptions)
86
-
87
- export const authGuard = async (
88
- types?: UserType | UserType[],
89
- permission?: Permissions,
90
- session?: Session
91
- ) => {
92
- if (!session) {
93
- const tempSession = await getAuthSession()
94
- if (!tempSession) return false
95
- session = tempSession
96
- }
97
-
98
- if (session.user.type === 'Root') return session
99
-
100
- if (types) {
101
- if (Array.isArray(types)) {
102
- if (!types.includes(session.user.type)) return false
103
- } else {
104
- if (types !== session.user.type) return false
105
- }
106
- }
107
-
108
- if (!session.user.roleId || !permission) return false
109
-
110
- const c = await prisma.rolePermission.count({
111
- where: {
112
- roleId: session.user.roleId,
113
- permission
114
- }
115
- })
116
- if (!c) return false
117
-
118
- return session
119
- }
120
-
121
- export const checkForPermission = async (
122
- permission: Permissions,
123
- session?: Session
124
- ) => {
125
- if (!session) {
126
- const tempSession = await getAuthSession()
127
- if (!tempSession) return false
128
- session = tempSession
129
- }
130
-
131
- if (session.user.type === 'Root') return true
132
- if (!session.user.roleId) return false
133
-
134
- const c = await prisma.rolePermission.count({
135
- where: {
136
- roleId: session.user.roleId,
137
- permission
138
- }
139
- })
140
-
141
- return !!c
142
- }
143
-
144
- export const getAuthSessionWithPermissions = async () => {
145
- const session = await getAuthSession()
146
-
147
- if (session && session.user) {
148
- if (session.user.type === 'Root') {
149
- return {
150
- session,
151
- permissions: ['*']
152
- }
153
- } else if (session.user.roleId) {
154
- const permissions = await prisma.rolePermission.findMany({
155
- where: {
156
- roleId: session.user.roleId
157
- },
158
- select: {
159
- permission: true
160
- },
161
- orderBy: {
162
- permission: 'asc'
163
- }
164
- })
165
- return {
166
- session,
167
- permissions: permissions.map(p => p.permission)
168
- }
169
- } else {
170
- return {
171
- session,
172
- permissions: []
173
- }
174
- }
175
- }
176
-
177
- return {
178
- session
179
- }
180
- }
@@ -1,4 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx'
2
- import { twMerge } from 'tailwind-merge'
3
-
4
- export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs))
@@ -1,20 +0,0 @@
1
- import { PrismaClient } from '@prisma/client'
2
-
3
- import { env } from '@/env.mjs'
4
-
5
- const globalForPrisma = globalThis as unknown as {
6
- prisma: PrismaClient | undefined
7
- }
8
-
9
- export const prisma =
10
- globalForPrisma.prisma ||
11
- new PrismaClient({
12
- log:
13
- env.NODE_ENV === 'development'
14
- ? [
15
- // 'info', 'query', 'error', 'warn'
16
- ]
17
- : ['error']
18
- })
19
-
20
- if (env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
@@ -1,2 +0,0 @@
1
- export const delay = (ms: number) =>
2
- new Promise(resolve => setTimeout(resolve, ms))
@@ -1,11 +0,0 @@
1
- import dayjs from 'dayjs'
2
- import relativeTime from 'dayjs/plugin/relativeTime'
3
-
4
- dayjs.extend(relativeTime)
5
-
6
- export const formatDate = (date: Date) => dayjs(date).format('DD/MM/YYYY')
7
-
8
- export const formatDateTime = (date: Date) =>
9
- dayjs(date).format('DD/MM/YYYY hh:mm:ss A')
10
-
11
- export const timesAgo = (date: Date) => dayjs(date).fromNow()
@@ -1,5 +0,0 @@
1
- export const generateLabel = (str: string) =>
2
- str
3
- .replaceAll('_', ' ')
4
- .replaceAll(/([A-Z])/g, ' $1')
5
- .trim()
@@ -1,4 +0,0 @@
1
- export const siteConfig = {
2
- name: 'Project Name',
3
- description: 'Project Description'
4
- }
@@ -1,11 +0,0 @@
1
- import { GCPStorageClient } from '@ejekanshjain/cloud-storage'
2
-
3
- import { env } from '@/env.mjs'
4
-
5
- export const storageClient = GCPStorageClient({
6
- projectId: env.FIREBASE_PROJECT_ID!,
7
- privateKey: env.FIREBASE_PRIVATE_KEY!,
8
- clientEmail: env.FIREBASE_CLIENT_EMAIL!,
9
- bucket: env.FIREBASE_STORAGE_BUCKET!,
10
- defaultMediaPublic: true
11
- })