create-nexwire 4.3.0 → 4.4.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 (326) hide show
  1. package/README.md +10 -5
  2. package/express/src/framework/facade.ts +1 -0
  3. package/express/src/framework/http/logger.ts +13 -4
  4. package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
  5. package/express/src/framework/notification/channels/mail.ts +8 -6
  6. package/express/src/middlewares/auth-middleware.ts +1 -2
  7. package/express/src/middlewares/role-middleware.ts +3 -13
  8. package/express/src/modules/auth/routes/index.ts +1 -2
  9. package/express/src/providers/notification.ts +2 -2
  10. package/express/src/resources/src/components/Switch.vue +60 -65
  11. package/express/src/resources/src/pages/auth/forgetPassword.vue +23 -30
  12. package/express/src/resources/src/pages/auth/login.vue +25 -28
  13. package/express/src/resources/src/pages/auth/register.vue +35 -39
  14. package/express/src/resources/src/pages/auth/resetPassword.vue +29 -37
  15. package/express/src/resources/src/pages/auth/verifyEmail.vue +15 -19
  16. package/express/src/resources/src/plugins/gum.ts +519 -203
  17. package/express/src/resources/src/stores/auth.ts +9 -6
  18. package/express/src/storage/database/nexwire.sqlite +0 -0
  19. package/fastify/.dockerignore +14 -0
  20. package/fastify/.env +44 -0
  21. package/fastify/.env.example +42 -0
  22. package/fastify/.vscode/extensions.json +6 -0
  23. package/fastify/.vscode/settings.json +37 -0
  24. package/fastify/LICENSE +21 -0
  25. package/fastify/README.md +232 -0
  26. package/fastify/biome.json +99 -0
  27. package/fastify/drizzle.config.ts +25 -0
  28. package/fastify/gitignore-stub +31 -0
  29. package/fastify/package.json +130 -0
  30. package/fastify/public/.gitkeep +0 -0
  31. package/fastify/src/config/app.ts +41 -0
  32. package/fastify/src/config/auth.ts +12 -0
  33. package/fastify/src/config/cache.ts +16 -0
  34. package/fastify/src/config/cookie.ts +15 -0
  35. package/fastify/src/config/cors.ts +12 -0
  36. package/fastify/src/config/database.ts +48 -0
  37. package/fastify/src/config/index.ts +83 -0
  38. package/fastify/src/config/jwt.ts +19 -0
  39. package/fastify/src/config/logging.ts +13 -0
  40. package/fastify/src/config/mail.ts +24 -0
  41. package/fastify/src/config/openapi.ts +36 -0
  42. package/fastify/src/config/queue.ts +30 -0
  43. package/fastify/src/config/rateLimit.ts +17 -0
  44. package/fastify/src/config/realtime.ts +15 -0
  45. package/fastify/src/config/redis.ts +18 -0
  46. package/fastify/src/config/security.ts +44 -0
  47. package/fastify/src/config/session.ts +17 -0
  48. package/fastify/src/config/storage.ts +22 -0
  49. package/fastify/src/config/validate.ts +50 -0
  50. package/fastify/src/database/migrations/sqlite/0000_init.sql +48 -0
  51. package/fastify/src/database/migrations/sqlite/meta/0000_snapshot.json +324 -0
  52. package/fastify/src/database/migrations/sqlite/meta/_journal.json +13 -0
  53. package/fastify/src/database/schema.ts +2 -0
  54. package/fastify/src/env.ts +76 -0
  55. package/fastify/src/framework/cache/cache.ts +114 -0
  56. package/fastify/src/framework/circuit-breaker/cb.ts +88 -0
  57. package/fastify/src/framework/database/app-schema.ts +37 -0
  58. package/fastify/src/framework/database/connection.ts +223 -0
  59. package/fastify/src/framework/database/migrate-hooks.ts +87 -0
  60. package/fastify/src/framework/database/paginate.ts +226 -0
  61. package/fastify/src/framework/database/schema.ts +20 -0
  62. package/fastify/src/framework/database/seed.ts +152 -0
  63. package/fastify/src/framework/events/dispatcher.ts +61 -0
  64. package/fastify/src/framework/facade.ts +96 -0
  65. package/fastify/src/framework/http/app.ts +176 -0
  66. package/fastify/src/framework/http/cors.ts +13 -0
  67. package/fastify/src/framework/http/fastify.d.ts +13 -0
  68. package/fastify/src/framework/http/logger.ts +110 -0
  69. package/fastify/src/framework/http/metrics.ts +22 -0
  70. package/fastify/src/framework/http/openapi.ts +48 -0
  71. package/fastify/src/framework/http/ratelimiter.ts +47 -0
  72. package/fastify/src/framework/http/security.ts +25 -0
  73. package/fastify/src/framework/http/static.ts +83 -0
  74. package/fastify/src/framework/http/validation.ts +49 -0
  75. package/fastify/src/framework/kernel.ts +43 -0
  76. package/fastify/src/framework/maker-cli/db/core.mjs +291 -0
  77. package/fastify/src/framework/maker-cli/db/index.mjs +204 -0
  78. package/fastify/src/framework/maker-cli/deploy/core.mjs +1046 -0
  79. package/fastify/src/framework/maker-cli/deploy/index.mjs +91 -0
  80. package/fastify/src/framework/maker-cli/index.mjs +65 -0
  81. package/fastify/src/framework/maker-cli/middleware/core.mjs +41 -0
  82. package/fastify/src/framework/maker-cli/middleware/index.mjs +17 -0
  83. package/fastify/src/framework/maker-cli/module/core.mjs +1066 -0
  84. package/fastify/src/framework/maker-cli/module/index.mjs +211 -0
  85. package/fastify/src/framework/maker-cli/provider/core.mjs +49 -0
  86. package/fastify/src/framework/maker-cli/provider/index.mjs +12 -0
  87. package/fastify/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
  88. package/fastify/src/framework/maker-cli/runtime/core.mjs +560 -0
  89. package/fastify/src/framework/maker-cli/runtime/index.mjs +120 -0
  90. package/fastify/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  91. package/fastify/src/framework/maker-cli/stubs/controller/openapi.ts.stub +74 -0
  92. package/fastify/src/framework/maker-cli/stubs/controller/plain.ts.stub +77 -0
  93. package/fastify/src/framework/maker-cli/stubs/controller/standalone.ts.stub +51 -0
  94. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  95. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  96. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  97. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  98. package/fastify/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  99. package/fastify/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  100. package/fastify/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  101. package/fastify/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  102. package/fastify/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  103. package/fastify/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  104. package/fastify/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  105. package/fastify/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  106. package/fastify/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  107. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  108. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  109. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  110. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  111. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  112. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  113. package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  114. package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  115. package/fastify/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  116. package/fastify/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  117. package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  118. package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  119. package/fastify/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  120. package/fastify/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  121. package/fastify/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
  122. package/fastify/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
  123. package/fastify/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  124. package/fastify/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
  125. package/fastify/src/framework/maker-cli/stubs/middleware/name.ts.stub +15 -0
  126. package/fastify/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +10 -0
  127. package/fastify/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +10 -0
  128. package/fastify/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +10 -0
  129. package/fastify/src/framework/maker-cli/stubs/notification/controller.ts.stub +79 -0
  130. package/fastify/src/framework/maker-cli/stubs/notification/job.ts.stub +11 -0
  131. package/fastify/src/framework/maker-cli/stubs/notification/model.ts.stub +29 -0
  132. package/fastify/src/framework/maker-cli/stubs/notification/provider.ts.stub +174 -0
  133. package/fastify/src/framework/maker-cli/stubs/notification/route.api.ts.stub +71 -0
  134. package/fastify/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +15 -0
  135. package/fastify/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  136. package/fastify/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  137. package/fastify/src/framework/maker-cli/stubs/provider/module-barrel.ts.stub +19 -0
  138. package/fastify/src/framework/maker-cli/stubs/provider/module.ts.stub +21 -0
  139. package/fastify/src/framework/maker-cli/stubs/provider/name.ts.stub +21 -0
  140. package/fastify/src/framework/maker-cli/stubs/route/api.ts.stub +101 -0
  141. package/fastify/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -0
  142. package/fastify/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +120 -0
  143. package/fastify/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +50 -0
  144. package/fastify/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  145. package/fastify/src/framework/maker-cli/stubs/schema/name.plain.ts.stub +14 -0
  146. package/fastify/src/framework/maker-cli/stubs/schema/name.ts.stub +33 -0
  147. package/fastify/src/framework/maker-cli/stubs/seeder/name.ts.stub +18 -0
  148. package/fastify/src/framework/maker-cli/stubs/seeder/standalone.ts.stub +22 -0
  149. package/fastify/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
  150. package/fastify/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
  151. package/fastify/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  152. package/fastify/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
  153. package/fastify/src/framework/maker-cli/utils/env-config.mjs +44 -0
  154. package/fastify/src/framework/maker-cli/utils/env-db.mjs +61 -0
  155. package/fastify/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  156. package/fastify/src/framework/maker-cli/utils/flags.mjs +14 -0
  157. package/fastify/src/framework/maker-cli/utils/help.mjs +379 -0
  158. package/fastify/src/framework/maker-cli/utils/naming.mjs +119 -0
  159. package/fastify/src/framework/maker-cli/utils/process.mjs +52 -0
  160. package/fastify/src/framework/maker-cli/utils/project-commands.mjs +201 -0
  161. package/fastify/src/framework/modules/discover.ts +57 -0
  162. package/fastify/src/framework/modules/routes.ts +31 -0
  163. package/fastify/src/framework/notification/channels/broadcast.ts +15 -0
  164. package/fastify/src/framework/notification/channels/mail.ts +42 -0
  165. package/fastify/src/framework/notification/contracts.ts +29 -0
  166. package/fastify/src/framework/notification/index.ts +59 -0
  167. package/fastify/src/framework/notification/registry.ts +15 -0
  168. package/fastify/src/framework/providers/adapter.ts +149 -0
  169. package/fastify/src/framework/providers/contracts.ts +126 -0
  170. package/fastify/src/framework/providers/loader.ts +105 -0
  171. package/fastify/src/framework/providers/registry.ts +88 -0
  172. package/fastify/src/framework/queue/clear.ts +22 -0
  173. package/fastify/src/framework/queue/queue.ts +401 -0
  174. package/fastify/src/framework/queue/ui.ts +194 -0
  175. package/fastify/src/framework/queue/worker.ts +61 -0
  176. package/fastify/src/framework/realtime/broadcast.ts +70 -0
  177. package/fastify/src/framework/realtime/index.ts +2 -0
  178. package/fastify/src/framework/realtime/socket-cookie.ts +72 -0
  179. package/fastify/src/framework/realtime/socket.ts +149 -0
  180. package/fastify/src/framework/realtime/types.ts +6 -0
  181. package/fastify/src/framework/realtime/ui.ts +16 -0
  182. package/fastify/src/framework/redis/client.ts +148 -0
  183. package/fastify/src/framework/runtime/runtime.ts +23 -0
  184. package/fastify/src/framework/runtime/server-adapter.ts +33 -0
  185. package/fastify/src/framework/scheduler/lock.ts +128 -0
  186. package/fastify/src/framework/scheduler/run.ts +48 -0
  187. package/fastify/src/framework/scheduler/scheduler.ts +155 -0
  188. package/fastify/src/framework/server.ts +162 -0
  189. package/fastify/src/framework/session/session.ts +160 -0
  190. package/fastify/src/framework/storage/storage.ts +744 -0
  191. package/fastify/src/framework/support/cookie.ts +71 -0
  192. package/fastify/src/framework/support/jwt.ts +33 -0
  193. package/fastify/src/framework/support/lifecycle.ts +35 -0
  194. package/fastify/src/framework/support/logger.ts +148 -0
  195. package/fastify/src/framework/support/mail.ts +56 -0
  196. package/fastify/src/framework/support/password.ts +23 -0
  197. package/fastify/src/framework/support/status-codes.ts +75 -0
  198. package/fastify/src/framework/support/upload.ts +181 -0
  199. package/fastify/src/framework/support/url.ts +41 -0
  200. package/fastify/src/middlewares/auth-middleware.ts +134 -0
  201. package/fastify/src/middlewares/role-middleware.ts +19 -0
  202. package/fastify/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
  203. package/fastify/src/modules/auth/__tests__/login.test.ts +171 -0
  204. package/fastify/src/modules/auth/__tests__/logout.test.ts +60 -0
  205. package/fastify/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
  206. package/fastify/src/modules/auth/__tests__/me.test.ts +91 -0
  207. package/fastify/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
  208. package/fastify/src/modules/auth/__tests__/register.test.ts +291 -0
  209. package/fastify/src/modules/auth/__tests__/resetpass.test.ts +206 -0
  210. package/fastify/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
  211. package/fastify/src/modules/auth/controllers/auth.ts +252 -0
  212. package/fastify/src/modules/auth/controllers/role.ts +35 -0
  213. package/fastify/src/modules/auth/database/models/role.ts +14 -0
  214. package/fastify/src/modules/auth/database/models/user.ts +46 -0
  215. package/fastify/src/modules/auth/database/seeders/role.ts +18 -0
  216. package/fastify/src/modules/auth/database/seeders/user.ts +35 -0
  217. package/fastify/src/modules/auth/facade.ts +12 -0
  218. package/fastify/src/modules/auth/helpers/auth.ts +115 -0
  219. package/fastify/src/modules/auth/jobs/forgetpass.ts +20 -0
  220. package/fastify/src/modules/auth/jobs/registeruser.ts +23 -0
  221. package/fastify/src/modules/auth/jobs/verifyemail.ts +18 -0
  222. package/fastify/src/modules/auth/routes/index.ts +185 -0
  223. package/fastify/src/modules/auth/routes/role.ts +56 -0
  224. package/fastify/src/modules/auth/schemas/auth.ts +116 -0
  225. package/fastify/src/modules/auth/services/forgetpassword.ts +66 -0
  226. package/fastify/src/modules/auth/services/login.ts +63 -0
  227. package/fastify/src/modules/auth/services/logout.ts +25 -0
  228. package/fastify/src/modules/auth/services/logoutalldevices.ts +19 -0
  229. package/fastify/src/modules/auth/services/me.ts +31 -0
  230. package/fastify/src/modules/auth/services/refreshtoken.ts +110 -0
  231. package/fastify/src/modules/auth/services/register.ts +141 -0
  232. package/fastify/src/modules/auth/services/resetpassword.ts +69 -0
  233. package/fastify/src/modules/auth/services/verifyemail.ts +77 -0
  234. package/fastify/src/modules/auth/types/auth.ts +31 -0
  235. package/fastify/src/providers/README.md +107 -0
  236. package/fastify/src/providers/notification.ts +4 -0
  237. package/fastify/src/resources/index.html +17 -0
  238. package/fastify/src/resources/src/App.vue +5 -0
  239. package/fastify/src/resources/src/assets/css/styles.css +14761 -0
  240. package/fastify/src/resources/src/assets/css/styles.css.map +1 -0
  241. package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  242. package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  243. package/fastify/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  244. package/fastify/src/resources/src/assets/images/logo.png +0 -0
  245. package/fastify/src/resources/src/assets/scss/custom.css +217 -0
  246. package/fastify/src/resources/src/assets/scss/custom.css.map +1 -0
  247. package/fastify/src/resources/src/assets/scss/custom.scss +1346 -0
  248. package/fastify/src/resources/src/components/Button.vue +32 -0
  249. package/fastify/src/resources/src/components/Checkbox.vue +32 -0
  250. package/fastify/src/resources/src/components/Datepicker.vue +106 -0
  251. package/fastify/src/resources/src/components/FeatureButton.vue +53 -0
  252. package/fastify/src/resources/src/components/FloatButton.vue +33 -0
  253. package/fastify/src/resources/src/components/Href.vue +32 -0
  254. package/fastify/src/resources/src/components/Input.vue +243 -0
  255. package/fastify/src/resources/src/components/InputGroup.vue +147 -0
  256. package/fastify/src/resources/src/components/InputPasswordToggle.vue +229 -0
  257. package/fastify/src/resources/src/components/Modal.vue +71 -0
  258. package/fastify/src/resources/src/components/Pagebar.vue +26 -0
  259. package/fastify/src/resources/src/components/Refresh.vue +19 -0
  260. package/fastify/src/resources/src/components/Select.vue +384 -0
  261. package/fastify/src/resources/src/components/Spinner.vue +42 -0
  262. package/fastify/src/resources/src/components/Switch.vue +60 -0
  263. package/fastify/src/resources/src/components/TextArea.vue +117 -0
  264. package/fastify/src/resources/src/components/Toast.vue +56 -0
  265. package/fastify/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  266. package/fastify/src/resources/src/components/datatable/Pagination.vue +147 -0
  267. package/fastify/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  268. package/fastify/src/resources/src/components/datatable/index.vue +199 -0
  269. package/fastify/src/resources/src/composables/useAuth.ts +52 -0
  270. package/fastify/src/resources/src/helpers/assets.ts +51 -0
  271. package/fastify/src/resources/src/helpers/nformatter.ts +10 -0
  272. package/fastify/src/resources/src/helpers/utils.ts +75 -0
  273. package/fastify/src/resources/src/layouts/AuthLayout.vue +20 -0
  274. package/fastify/src/resources/src/layouts/Layout/Footer.vue +23 -0
  275. package/fastify/src/resources/src/layouts/Layout/Header.vue +124 -0
  276. package/fastify/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  277. package/fastify/src/resources/src/layouts/Layout/index.vue +87 -0
  278. package/fastify/src/resources/src/main.ts +28 -0
  279. package/fastify/src/resources/src/pages/auth/forgetPassword.vue +76 -0
  280. package/fastify/src/resources/src/pages/auth/login.vue +96 -0
  281. package/fastify/src/resources/src/pages/auth/register.vue +129 -0
  282. package/fastify/src/resources/src/pages/auth/resetPassword.vue +110 -0
  283. package/fastify/src/resources/src/pages/auth/verifyEmail.vue +64 -0
  284. package/fastify/src/resources/src/pages/dashboard/index.vue +66 -0
  285. package/fastify/src/resources/src/plugins/axios.ts +31 -0
  286. package/fastify/src/resources/src/plugins/browserDetect.ts +55 -0
  287. package/fastify/src/resources/src/plugins/dialog.ts +216 -0
  288. package/fastify/src/resources/src/plugins/gum.ts +683 -0
  289. package/fastify/src/resources/src/plugins/pulse.ts +157 -0
  290. package/fastify/src/resources/src/plugins/routeProgress.ts +87 -0
  291. package/fastify/src/resources/src/router/index.ts +85 -0
  292. package/fastify/src/resources/src/stores/admin-ui.ts +148 -0
  293. package/fastify/src/resources/src/stores/auth.ts +187 -0
  294. package/fastify/src/resources/tsconfig.json +19 -0
  295. package/fastify/src/resources/vite.config.ts +64 -0
  296. package/fastify/src/storage/app/private/.gitkeep +0 -0
  297. package/fastify/src/storage/app/public/.gitkeep +0 -0
  298. package/fastify/src/storage/app/tmp/generated/.gitkeep +0 -0
  299. package/fastify/src/storage/database/nexwire.sqlite +0 -0
  300. package/fastify/src/storage/logs/.gitkeep +0 -0
  301. package/fastify/src/storage/logs/app.log +0 -0
  302. package/fastify/src/storage/logs/fatal.log +0 -0
  303. package/fastify/src/storage/tmp/.gitkeep +0 -0
  304. package/fastify/src/storage/trash/modules/.gitkeep +0 -0
  305. package/fastify/src/types/global.d.ts +32 -0
  306. package/fastify/tsconfig.json +19 -0
  307. package/fastify/vitest.config.ts +38 -0
  308. package/hono/src/framework/facade.ts +1 -0
  309. package/hono/src/framework/http/logger.ts +86 -81
  310. package/hono/src/framework/maker-cli/runtime/core.mjs +1 -2
  311. package/hono/src/framework/notification/channels/mail.ts +8 -6
  312. package/hono/src/middlewares/auth-middleware.ts +1 -2
  313. package/hono/src/middlewares/role-middleware.ts +3 -13
  314. package/hono/src/modules/auth/routes/index.ts +1 -2
  315. package/hono/src/providers/notification.ts +2 -2
  316. package/hono/src/resources/src/components/Switch.vue +60 -65
  317. package/hono/src/resources/src/pages/auth/forgetPassword.vue +23 -29
  318. package/hono/src/resources/src/pages/auth/login.vue +26 -29
  319. package/hono/src/resources/src/pages/auth/register.vue +36 -40
  320. package/hono/src/resources/src/pages/auth/resetPassword.vue +29 -37
  321. package/hono/src/resources/src/pages/auth/verifyEmail.vue +15 -19
  322. package/hono/src/resources/src/plugins/gum.ts +519 -203
  323. package/hono/src/resources/src/stores/auth.ts +9 -6
  324. package/hono/src/storage/database/nexwire.sqlite +0 -0
  325. package/package.json +3 -2
  326. package/src/index.js +11 -8
@@ -0,0 +1,50 @@
1
+ import { databaseConfig } from "./database.js";
2
+ import { mailConfig } from "./mail.js";
3
+ import { redisConfig } from "./redis.js";
4
+ import { storageConfig } from "./storage.js";
5
+
6
+ /**
7
+ * Why: Validates that resolved configs are internally consistent at startup.
8
+ * When: Called before any framework subsystem initializes.
9
+ * Where: kernel.ts, before storage.init() and initRedis().
10
+ * How: Checks cross-config dependencies and throws clear errors for inconsistencies.
11
+ */
12
+ export function validateConfig(): void {
13
+ if (!databaseConfig.url) {
14
+ throw new Error("DATABASE_URL is required but is empty");
15
+ }
16
+
17
+ if (storageConfig.driver === "s3") {
18
+ if (!storageConfig.bucket) {
19
+ throw new Error("STORAGE_BUCKET is required when storage driver is s3");
20
+ }
21
+ if (!storageConfig.accessKeyId || !storageConfig.secretAccessKey) {
22
+ throw new Error("STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY are required when storage driver is s3");
23
+ }
24
+ }
25
+
26
+ if (redisConfig.enabled) {
27
+ try {
28
+ const url = new URL(redisConfig.url);
29
+
30
+ // Ensure it starts with redis:// or rediss://
31
+ if (url.protocol !== "redis:" && url.protocol !== "rediss:") {
32
+ throw new Error("URL must start with redis:// or rediss://");
33
+ }
34
+
35
+ // Hostname is mandatory (e.g., localhost, 127.0.0.1, redis-container)
36
+ if (!url.hostname) {
37
+ throw new Error("URL must include a valid hostname");
38
+ }
39
+
40
+ // Note: We do NOT check if the port is empty.
41
+ // ioredis automatically defaults to 6379 if no port is provided.
42
+ } catch (error) {
43
+ throw new Error(`REDIS_URL is invalid: "${redisConfig.url}" — ${error instanceof Error ? error.message : error}`);
44
+ }
45
+ }
46
+
47
+ if (!mailConfig.failSilent && !mailConfig.username) {
48
+ throw new Error("MAIL_USERNAME is required when MAIL_FAIL_SILENT is false");
49
+ }
50
+ }
@@ -0,0 +1,48 @@
1
+ CREATE TABLE `roles` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `name` text NOT NULL,
4
+ `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
5
+ `updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL
6
+ );
7
+ --> statement-breakpoint
8
+ CREATE UNIQUE INDEX `roles_name_unique` ON `roles` (`name`);--> statement-breakpoint
9
+ CREATE TABLE `email_verification_tokens` (
10
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
11
+ `email` text NOT NULL,
12
+ `token` text NOT NULL,
13
+ `expires_at` integer NOT NULL,
14
+ `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE TABLE `password_reset_tokens` (
18
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
19
+ `email` text NOT NULL,
20
+ `token` text NOT NULL,
21
+ `expires_at` integer NOT NULL,
22
+ `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL
23
+ );
24
+ --> statement-breakpoint
25
+ CREATE TABLE `refresh_tokens` (
26
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
27
+ `user_id` integer,
28
+ `jti` text NOT NULL,
29
+ `revoked` integer DEFAULT false,
30
+ `expires_at` integer NOT NULL,
31
+ `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
32
+ FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE cascade ON DELETE set null
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE UNIQUE INDEX `refresh_tokens_jti_unique` ON `refresh_tokens` (`jti`);--> statement-breakpoint
36
+ CREATE TABLE `users` (
37
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
38
+ `name` text NOT NULL,
39
+ `email` text NOT NULL,
40
+ `password` text NOT NULL,
41
+ `role_id` integer,
42
+ `email_verified_at` integer,
43
+ `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
44
+ `updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL,
45
+ FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON UPDATE cascade ON DELETE set null
46
+ );
47
+ --> statement-breakpoint
48
+ CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);
@@ -0,0 +1,324 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "af502348-be37-45c6-84e4-df4db9f31bfb",
5
+ "prevId": "00000000-0000-0000-0000-000000000000",
6
+ "tables": {
7
+ "roles": {
8
+ "name": "roles",
9
+ "columns": {
10
+ "id": {
11
+ "name": "id",
12
+ "type": "integer",
13
+ "primaryKey": true,
14
+ "notNull": true,
15
+ "autoincrement": true
16
+ },
17
+ "name": {
18
+ "name": "name",
19
+ "type": "text",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "created_at": {
25
+ "name": "created_at",
26
+ "type": "integer",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false,
30
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
31
+ },
32
+ "updated_at": {
33
+ "name": "updated_at",
34
+ "type": "integer",
35
+ "primaryKey": false,
36
+ "notNull": true,
37
+ "autoincrement": false,
38
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
39
+ }
40
+ },
41
+ "indexes": {
42
+ "roles_name_unique": {
43
+ "name": "roles_name_unique",
44
+ "columns": [
45
+ "name"
46
+ ],
47
+ "isUnique": true
48
+ }
49
+ },
50
+ "foreignKeys": {},
51
+ "compositePrimaryKeys": {},
52
+ "uniqueConstraints": {},
53
+ "checkConstraints": {}
54
+ },
55
+ "email_verification_tokens": {
56
+ "name": "email_verification_tokens",
57
+ "columns": {
58
+ "id": {
59
+ "name": "id",
60
+ "type": "integer",
61
+ "primaryKey": true,
62
+ "notNull": true,
63
+ "autoincrement": true
64
+ },
65
+ "email": {
66
+ "name": "email",
67
+ "type": "text",
68
+ "primaryKey": false,
69
+ "notNull": true,
70
+ "autoincrement": false
71
+ },
72
+ "token": {
73
+ "name": "token",
74
+ "type": "text",
75
+ "primaryKey": false,
76
+ "notNull": true,
77
+ "autoincrement": false
78
+ },
79
+ "expires_at": {
80
+ "name": "expires_at",
81
+ "type": "integer",
82
+ "primaryKey": false,
83
+ "notNull": true,
84
+ "autoincrement": false
85
+ },
86
+ "created_at": {
87
+ "name": "created_at",
88
+ "type": "integer",
89
+ "primaryKey": false,
90
+ "notNull": true,
91
+ "autoincrement": false,
92
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
93
+ }
94
+ },
95
+ "indexes": {},
96
+ "foreignKeys": {},
97
+ "compositePrimaryKeys": {},
98
+ "uniqueConstraints": {},
99
+ "checkConstraints": {}
100
+ },
101
+ "password_reset_tokens": {
102
+ "name": "password_reset_tokens",
103
+ "columns": {
104
+ "id": {
105
+ "name": "id",
106
+ "type": "integer",
107
+ "primaryKey": true,
108
+ "notNull": true,
109
+ "autoincrement": true
110
+ },
111
+ "email": {
112
+ "name": "email",
113
+ "type": "text",
114
+ "primaryKey": false,
115
+ "notNull": true,
116
+ "autoincrement": false
117
+ },
118
+ "token": {
119
+ "name": "token",
120
+ "type": "text",
121
+ "primaryKey": false,
122
+ "notNull": true,
123
+ "autoincrement": false
124
+ },
125
+ "expires_at": {
126
+ "name": "expires_at",
127
+ "type": "integer",
128
+ "primaryKey": false,
129
+ "notNull": true,
130
+ "autoincrement": false
131
+ },
132
+ "created_at": {
133
+ "name": "created_at",
134
+ "type": "integer",
135
+ "primaryKey": false,
136
+ "notNull": true,
137
+ "autoincrement": false,
138
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
139
+ }
140
+ },
141
+ "indexes": {},
142
+ "foreignKeys": {},
143
+ "compositePrimaryKeys": {},
144
+ "uniqueConstraints": {},
145
+ "checkConstraints": {}
146
+ },
147
+ "refresh_tokens": {
148
+ "name": "refresh_tokens",
149
+ "columns": {
150
+ "id": {
151
+ "name": "id",
152
+ "type": "integer",
153
+ "primaryKey": true,
154
+ "notNull": true,
155
+ "autoincrement": true
156
+ },
157
+ "user_id": {
158
+ "name": "user_id",
159
+ "type": "integer",
160
+ "primaryKey": false,
161
+ "notNull": false,
162
+ "autoincrement": false
163
+ },
164
+ "jti": {
165
+ "name": "jti",
166
+ "type": "text",
167
+ "primaryKey": false,
168
+ "notNull": true,
169
+ "autoincrement": false
170
+ },
171
+ "revoked": {
172
+ "name": "revoked",
173
+ "type": "integer",
174
+ "primaryKey": false,
175
+ "notNull": false,
176
+ "autoincrement": false,
177
+ "default": false
178
+ },
179
+ "expires_at": {
180
+ "name": "expires_at",
181
+ "type": "integer",
182
+ "primaryKey": false,
183
+ "notNull": true,
184
+ "autoincrement": false
185
+ },
186
+ "created_at": {
187
+ "name": "created_at",
188
+ "type": "integer",
189
+ "primaryKey": false,
190
+ "notNull": true,
191
+ "autoincrement": false,
192
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
193
+ }
194
+ },
195
+ "indexes": {
196
+ "refresh_tokens_jti_unique": {
197
+ "name": "refresh_tokens_jti_unique",
198
+ "columns": [
199
+ "jti"
200
+ ],
201
+ "isUnique": true
202
+ }
203
+ },
204
+ "foreignKeys": {
205
+ "refresh_tokens_user_id_users_id_fk": {
206
+ "name": "refresh_tokens_user_id_users_id_fk",
207
+ "tableFrom": "refresh_tokens",
208
+ "tableTo": "users",
209
+ "columnsFrom": [
210
+ "user_id"
211
+ ],
212
+ "columnsTo": [
213
+ "id"
214
+ ],
215
+ "onDelete": "set null",
216
+ "onUpdate": "cascade"
217
+ }
218
+ },
219
+ "compositePrimaryKeys": {},
220
+ "uniqueConstraints": {},
221
+ "checkConstraints": {}
222
+ },
223
+ "users": {
224
+ "name": "users",
225
+ "columns": {
226
+ "id": {
227
+ "name": "id",
228
+ "type": "integer",
229
+ "primaryKey": true,
230
+ "notNull": true,
231
+ "autoincrement": true
232
+ },
233
+ "name": {
234
+ "name": "name",
235
+ "type": "text",
236
+ "primaryKey": false,
237
+ "notNull": true,
238
+ "autoincrement": false
239
+ },
240
+ "email": {
241
+ "name": "email",
242
+ "type": "text",
243
+ "primaryKey": false,
244
+ "notNull": true,
245
+ "autoincrement": false
246
+ },
247
+ "password": {
248
+ "name": "password",
249
+ "type": "text",
250
+ "primaryKey": false,
251
+ "notNull": true,
252
+ "autoincrement": false
253
+ },
254
+ "role_id": {
255
+ "name": "role_id",
256
+ "type": "integer",
257
+ "primaryKey": false,
258
+ "notNull": false,
259
+ "autoincrement": false
260
+ },
261
+ "email_verified_at": {
262
+ "name": "email_verified_at",
263
+ "type": "integer",
264
+ "primaryKey": false,
265
+ "notNull": false,
266
+ "autoincrement": false
267
+ },
268
+ "created_at": {
269
+ "name": "created_at",
270
+ "type": "integer",
271
+ "primaryKey": false,
272
+ "notNull": true,
273
+ "autoincrement": false,
274
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
275
+ },
276
+ "updated_at": {
277
+ "name": "updated_at",
278
+ "type": "integer",
279
+ "primaryKey": false,
280
+ "notNull": true,
281
+ "autoincrement": false,
282
+ "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))"
283
+ }
284
+ },
285
+ "indexes": {
286
+ "users_email_unique": {
287
+ "name": "users_email_unique",
288
+ "columns": [
289
+ "email"
290
+ ],
291
+ "isUnique": true
292
+ }
293
+ },
294
+ "foreignKeys": {
295
+ "users_role_id_roles_id_fk": {
296
+ "name": "users_role_id_roles_id_fk",
297
+ "tableFrom": "users",
298
+ "tableTo": "roles",
299
+ "columnsFrom": [
300
+ "role_id"
301
+ ],
302
+ "columnsTo": [
303
+ "id"
304
+ ],
305
+ "onDelete": "set null",
306
+ "onUpdate": "cascade"
307
+ }
308
+ },
309
+ "compositePrimaryKeys": {},
310
+ "uniqueConstraints": {},
311
+ "checkConstraints": {}
312
+ }
313
+ },
314
+ "views": {},
315
+ "enums": {},
316
+ "_meta": {
317
+ "schemas": {},
318
+ "tables": {},
319
+ "columns": {}
320
+ },
321
+ "internal": {
322
+ "indexes": {}
323
+ }
324
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "sqlite",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "6",
8
+ "when": 1793719238470,
9
+ "tag": "0000_init",
10
+ "breakpoints": true
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,2 @@
1
+ export * from "../modules/auth/database/models/role.js";
2
+ export * from "../modules/auth/database/models/user.js";
@@ -0,0 +1,76 @@
1
+ import { config } from "dotenv";
2
+ import { expand } from "dotenv-expand";
3
+ import { z } from "zod";
4
+
5
+ expand(config({ override: true }));
6
+
7
+ const envSchema = z
8
+ .object({
9
+ APP_NAME: z.string().default("nexwire"),
10
+ APP_ENV: z.enum(["development", "production", "test"]).default("development"),
11
+ APP_PORT: z.coerce.number().default(3000),
12
+ APP_URL: z.string().trim().min(1, "APP_URL is required in .env"),
13
+ UI: z
14
+ .string()
15
+ .default("true")
16
+ .transform((value) => value.trim().toLowerCase() !== "false" && value.trim() !== "0"),
17
+ FRONTEND_URL: z
18
+ .string()
19
+ .optional()
20
+ .transform((value) => value?.trim() || undefined),
21
+ DATABASE_URL: z.string().default("sqlite:./src/storage/database/nexwire.sqlite"),
22
+ REDIS: z
23
+ .string()
24
+ .default("false")
25
+ .transform((value) => value.trim().toLowerCase() !== "false" && value.trim() !== "0"),
26
+ REDIS_URL: z.string().default("redis://127.0.0.1:6379"),
27
+ REDIS_PREFIX: z
28
+ .string()
29
+ .default("nexwire")
30
+ .transform((value) => value.trim()),
31
+ JWT_ACCESS_SECRET: z.string(),
32
+ JWT_REFRESH_SECRET: z.string(),
33
+ COOKIE_SECRET: z.string(),
34
+ STORAGE_ACCESS_KEY_ID: z
35
+ .string()
36
+ .optional()
37
+ .transform((value) => value?.trim() || undefined),
38
+ STORAGE_SECRET_ACCESS_KEY: z
39
+ .string()
40
+ .optional()
41
+ .transform((value) => value?.trim() || undefined),
42
+ MAIL_USERNAME: z.string().default(""),
43
+ MAIL_PASSWORD: z.string().default(""),
44
+ OPEN_API: z
45
+ .string()
46
+ .default("true")
47
+ .transform((value) => value.trim().toLowerCase() !== "false" && value.trim() !== "0"),
48
+ SOCKET: z
49
+ .string()
50
+ .default("false")
51
+ .transform((value) => value.trim().toLowerCase() !== "false" && value.trim() !== "0"),
52
+ SECURITY_HEADERS: z
53
+ .string()
54
+ .default("true")
55
+ .transform((value) => value.trim().toLowerCase() !== "false" && value.trim() !== "0")
56
+ })
57
+ .superRefine((data, ctx) => {
58
+ for (const key of ["JWT_ACCESS_SECRET", "JWT_REFRESH_SECRET", "COOKIE_SECRET"] as const) {
59
+ if (!data[key]) {
60
+ ctx.addIssue({
61
+ code: "custom",
62
+ path: [key],
63
+ message: `${key} is required`
64
+ });
65
+ }
66
+ }
67
+ });
68
+
69
+ const parsedEnv = envSchema.parse(process.env);
70
+
71
+ export const env = {
72
+ ...parsedEnv,
73
+ FRONTEND_URL: parsedEnv.FRONTEND_URL
74
+ };
75
+
76
+ export type Env = typeof env;
@@ -0,0 +1,114 @@
1
+ import { cacheConfig, redisConfig } from "@/config/index.js";
2
+ import { createCircuitBreaker, isCircuitBreakerError } from "@/framework/circuit-breaker/cb.js";
3
+ import { redisClientIfReady } from "@/framework/redis/client.js";
4
+
5
+ function cacheKey(key: string) {
6
+ return `${cacheConfig.keyPrefix}:${key}`;
7
+ }
8
+
9
+ // Initialize the circuit breaker specifically for Cache operations
10
+ const cacheBreaker = createCircuitBreaker({
11
+ name: "Redis Cache",
12
+ failureThreshold: 3,
13
+ resetTimeout: 30000
14
+ });
15
+
16
+ /**
17
+ * Why: Provides Redis-backed cache helpers with graceful fallback behavior.
18
+ * When: Controllers/jobs need temporary computed data caching.
19
+ * Where: Application module code via facade.
20
+ * How: Uses namespaced Redis keys and JSON serialization.
21
+ */
22
+ export const cache = {
23
+ /**
24
+ * Why: Reads cached JSON value by key.
25
+ * When: A feature wants fast lookup before recomputing.
26
+ * Where: Controllers/jobs/services using shared cache.
27
+ * How: Fetches namespaced Redis key and parses JSON.
28
+ */
29
+ async get<T>(key: string, fallback: T | null = null) {
30
+ const client = redisClientIfReady();
31
+ // If the client isn't connected at all, fail fast to fallback
32
+ if (!client) return fallback;
33
+
34
+ try {
35
+ return await cacheBreaker.exec(async () => {
36
+ const value = await client.get(cacheKey(key));
37
+ return value ? (JSON.parse(value) as T) : fallback;
38
+ });
39
+ } catch (error) {
40
+ // If the circuit is open, or a Redis error occurs, return the fallback safely
41
+ if (isCircuitBreakerError(error)) return fallback;
42
+ return fallback;
43
+ }
44
+ },
45
+
46
+ async set(key: string, value: unknown, ttl = cacheConfig.ttlSeconds) {
47
+ const client = redisClientIfReady();
48
+ if (!client) return false;
49
+
50
+ try {
51
+ return await cacheBreaker.exec(async () => {
52
+ await client.set(cacheKey(key), JSON.stringify(value), "EX", ttl);
53
+ return true;
54
+ });
55
+ } catch (error) {
56
+ // If the circuit is open, or a Redis error occurs, silently fail
57
+ if (isCircuitBreakerError(error)) return false;
58
+ return false;
59
+ }
60
+ },
61
+
62
+ /**
63
+ * @deprecated Use set() instead.
64
+ */
65
+ async put(key: string, value: unknown, ttl = cacheConfig.ttlSeconds) {
66
+ return this.set(key, value, ttl);
67
+ },
68
+
69
+ /**
70
+ * Why: Deletes a cached value by key.
71
+ * When: Cached data becomes stale or must be invalidated.
72
+ * Where: Write/update flows that change source data.
73
+ * How: Removes namespaced Redis cache key.
74
+ */
75
+ async forget(key: string) {
76
+ const client = redisClientIfReady();
77
+ if (!client) return false;
78
+
79
+ try {
80
+ return await cacheBreaker.exec(async () => {
81
+ await client.del(cacheKey(key));
82
+ return true;
83
+ });
84
+ } catch (error) {
85
+ if (isCircuitBreakerError(error)) return false;
86
+ return false;
87
+ }
88
+ },
89
+
90
+ /**
91
+ * Why: Returns cached value or computes/stores a fresh one.
92
+ * When: A feature needs cache-aside behavior.
93
+ * Where: Read paths with potentially expensive callbacks.
94
+ * How: Attempts get first, then executes callback and put.
95
+ */
96
+ async remember<T>(key: string, ttl: number, callback: () => Promise<T>) {
97
+ const cached = await cache.get<T>(key);
98
+ if (cached !== null) return cached;
99
+
100
+ const fresh = await callback();
101
+ await this.set(key, fresh, ttl);
102
+ return fresh;
103
+ },
104
+
105
+ /**
106
+ * Why: Indicates whether Redis cache backend is currently usable.
107
+ * When: Runtime checks need to branch on cache availability.
108
+ * Where: Health/status endpoints and conditional flows.
109
+ * How: Confirms REDIS flag and ready Redis client instance.
110
+ */
111
+ isAvailable() {
112
+ return redisConfig.enabled && redisClientIfReady() !== null && cacheBreaker.getState() !== "open";
113
+ }
114
+ };