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
package/README.md CHANGED
@@ -39,9 +39,10 @@ npm create nexwire@latest my-app
39
39
  Choose a backend:
40
40
  ❯ Hono Hono-based HTTP layer and OpenAPI
41
41
  Express Express-based HTTP layer and OpenAPI
42
+ Fastify Fastify-based HTTP layer and OpenAPI
42
43
  ```
43
44
 
44
- Arrow keys to move, `1`/`2` to jump, Enter to confirm. Press Enter to accept the default (**Hono**). Point at a specific one and the prompt is skipped:
45
+ Arrow keys to move, `1`/`2`/`3` to jump, Enter to confirm. Press Enter to accept the default (**Hono**). Point at a specific one and the prompt is skipped:
45
46
 
46
47
  ```bash
47
48
  # Hono (default)
@@ -49,6 +50,9 @@ npm create nexwire@latest my-app
49
50
 
50
51
  # Express
51
52
  npm create nexwire@latest my-app -- --engine=express
53
+
54
+ # Fastify
55
+ npm create nexwire@latest my-app -- --engine=fastify
52
56
  ```
53
57
 
54
58
  For CI or scripts, `-y` / `--yes` skips every prompt and accepts the defaults (a project name is still required):
@@ -61,7 +65,7 @@ Your API is live at `http://localhost:3000`, Scalar docs at `/api-docs`, and the
61
65
 
62
66
  The scaffold already ships a pre-migrated, pre-seeded SQLite database, so there is no migration step before `maker dev`. If you point `DATABASE_URL` at MySQL or PostgreSQL, run `npm run maker db:migrate -- --seed` once to build and populate that database instead.
63
67
 
64
- Requires **Node.js >= 22** or **Bun >= 1.3**.
68
+ Requires **Node.js >= 22**. Hono and Express also support **Bun >= 1.3**; Fastify is Node-only.
65
69
 
66
70
  ### Current directory
67
71
 
@@ -70,6 +74,7 @@ Scaffold directly into the current directory:
70
74
  ```bash
71
75
  npm create nexwire@latest .
72
76
  npm create nexwire@latest . -- --engine=express
77
+ npm create nexwire@latest . -- --engine=fastify
73
78
  ```
74
79
 
75
80
  Works with any package manager: `pnpm`, `yarn`, or `bun`.
@@ -92,8 +97,8 @@ nexwire runs on **Node.js** or **Bun** — pick whichever fits your deployment:
92
97
 
93
98
  | Runtime | Minimum version | Notes |
94
99
  | ----------- | --------------- | --------------------------------------------------------------------- |
95
- | **Node.js** | `>= 22` | Default. Uses `node` in Dockerfile. |
96
- | **Bun** | `>= 1.3` | Pass `--runtime=bun` to `deploy:init`. Uses `oven/bun` in Dockerfile. |
100
+ | **Node.js** | `>= 22` | Default. Uses `node` in Dockerfile. Required by Fastify. |
101
+ | **Bun** | `>= 1.3` | Hono and Express only. Pass `--runtime=bun` to deploy:init. |
97
102
 
98
103
  ## Demo
99
104
 
@@ -115,7 +120,7 @@ Real recordings from a freshly scaffolded project — no mockups, no staging dat
115
120
 
116
121
  | Category | What you get |
117
122
  | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
118
- | **API** | Hono/Express HTTP server with Zod validation, OpenAPI/Scalar docs, CORS, rate limiting |
123
+ | **API** | Hono/Express/Fastify HTTP server with Zod validation, OpenAPI/Scalar docs, CORS, rate limiting |
119
124
  | **Database** | Drizzle ORM — SQLite by default, shipped pre-migrated and seeded; MySQL/PostgreSQL also supported, dialect auto-detected from `DATABASE_URL`. |
120
125
  | **Auth** | JWT access + refresh token rotation, signed httpOnly cookies, role middleware |
121
126
  | **Queue** | BullMQ background jobs with `shouldQueue` decorator and Bull Board dashboard |
@@ -28,6 +28,7 @@ export type { RouteConfig } from "@/framework/http/router.js";
28
28
  // ==========================================
29
29
  // 3. HTTP & Routing
30
30
  // ==========================================
31
+ export { loginLimiter } from "@/framework/http/ratelimiter.js";
31
32
  export { createRoute, createRouter, group, jsonContent } from "@/framework/http/router.js";
32
33
  export { validate } from "@/framework/http/validation.js";
33
34
  export { broadcastChannel } from "@/framework/notification/channels/broadcast.js";
@@ -1,17 +1,26 @@
1
1
  import type { ErrorRequestHandler, RequestHandler } from "express";
2
2
  import createError from "http-errors";
3
- import { logger } from "@/framework/support/logger.js";
4
3
  import { openApiConfig } from "@/config/index.js";
4
+ import { logger } from "@/framework/support/logger.js";
5
5
 
6
6
  function requestIp(req: Parameters<RequestHandler>[0]) {
7
7
  const forwarded = req.headers["x-forwarded-for"];
8
8
  return String(req.headers["cf-connecting-ip"] || forwarded || req.headers["x-real-ip"] || req.socket.remoteAddress || "");
9
9
  }
10
10
 
11
- // এই ফাংশনটি Express-এর জন্য তৈরি করা হয়েছে, তাই এটি কিছু অতিরিক্ত পাথও বাদ দেয় যা Hono-তে প্রযোজ্য নয়।
11
+ // Express has no "route registered before the logger" behaviour to lean on, so
12
+ // the skips are explicit: probes, the queue dashboard, favicon and OpenAPI
13
+ // assets.
14
+ const PROBE_PATHS = new Set(["/health", "/ready", "/live"]);
15
+
12
16
  function shouldSkipHttpLog(pathname: string) {
13
- // /queues, /queues/..., /favicon.ico বাদ দিন
14
- return pathname.startsWith("/queues") || pathname === "/favicon.ico" || pathname === openApiConfig.scalar.specUrl || pathname === openApiConfig.scalar.docsPath;
17
+ return (
18
+ PROBE_PATHS.has(pathname) ||
19
+ pathname.startsWith("/queues") ||
20
+ pathname === "/favicon.ico" ||
21
+ pathname === openApiConfig.scalar.specUrl ||
22
+ pathname === openApiConfig.scalar.docsPath
23
+ );
15
24
  }
16
25
 
17
26
  export const loggerMiddleware: RequestHandler = (req, res, next) => {
@@ -120,7 +120,7 @@ function serveRedisUnavailablePage(port, endpoint) {
120
120
  </html>
121
121
  `;
122
122
 
123
- return new Promise((resolve, reject) => {
123
+ return new Promise((_resolve, reject) => {
124
124
  const server = http.createServer((_req, res) => {
125
125
  res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
126
126
  res.end(body);
@@ -558,4 +558,3 @@ export async function clearViteCache() {
558
558
 
559
559
  console.log("Vite cache cleared.");
560
560
  }
561
-
@@ -1,8 +1,8 @@
1
- import { mail } from "@/framework/support/mail.js";
2
- import { resolveAuthProvider } from "@/framework/providers/adapter.js";
3
- import { redisClientIfReady } from "@/framework/redis/client.js";
4
1
  import { dispatchEvent } from "@/framework/events/dispatcher.js";
5
2
  import type { NotificationChannel } from "@/framework/notification/contracts.js";
3
+ import { resolveAuthProvider } from "@/framework/providers/adapter.js";
4
+ import { redisClientIfReady } from "@/framework/redis/client.js";
5
+ import { mail } from "@/framework/support/mail.js";
6
6
 
7
7
  function escapeHtml(str: string) {
8
8
  return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
@@ -21,13 +21,15 @@ export const mailChannel: NotificationChannel = {
21
21
  const contact = await provider.getUserContact(target.id);
22
22
  if (contact?.email) to = contact.email as string;
23
23
  }
24
- } catch { }
24
+ } catch {}
25
25
  }
26
26
 
27
27
  if (!to) return false;
28
28
 
29
29
  const subject = options.mail.subject || notification.title;
30
- const html = options.mail.html || `<h2>${escapeHtml(notification.title)}</h2>${notification.body ? `<p>${escapeHtml(notification.body)}</p>` : ""}`;
30
+ const html =
31
+ options.mail.html ||
32
+ `<h2>${escapeHtml(notification.title)}</h2>${notification.body ? `<p>${escapeHtml(notification.body)}</p>` : ""}`;
31
33
 
32
34
  if (redisClientIfReady()) {
33
35
  await dispatchEvent("notification:mail", { to, subject, html }, { queue: "mail" });
@@ -37,4 +39,4 @@ export const mailChannel: NotificationChannel = {
37
39
 
38
40
  return true;
39
41
  }
40
- };
42
+ };
@@ -1,6 +1,5 @@
1
1
  import { type NextFunction, type Request, type Response } from "express";
2
- import { cookie, HttpStatusCodes, jwt } from "@/framework/facade.js";
3
- import { resolveAuthProvider } from "@/framework/providers/adapter.js";
2
+ import { cookie, HttpStatusCodes, jwt, resolveAuthProvider } from "@/framework/facade.js";
4
3
 
5
4
  export async function authMiddleware(req: Request, res: Response, next: NextFunction) {
6
5
  const provider = await resolveAuthProvider();
@@ -1,22 +1,12 @@
1
1
  import type { NextFunction, Request, Response } from "express";
2
2
  import { HttpStatusCodes } from "@/framework/facade.js";
3
3
 
4
- type AuthPayload = {
5
- role?: string | null;
6
- };
7
-
8
4
  export function requireRole(...allowedRoles: string[]) {
9
- const roles = allowedRoles.map((role) => role.toLowerCase());
10
-
11
5
  return async (_req: Request, res: Response, next: NextFunction) => {
12
- const auth = res.locals.auth as AuthPayload | undefined;
13
-
14
- if (!auth) {
15
- return res.status(HttpStatusCodes.UNAUTHORIZED).json({ message: "Unauthorized" });
16
- }
6
+ const auth = res.locals.auth;
7
+ if (!auth) return res.status(HttpStatusCodes.UNAUTHORIZED).json({ message: "Unauthorized" });
17
8
 
18
- const userRole = String(auth.role ?? "").toLowerCase();
19
- if (!roles.includes(userRole)) {
9
+ if (!allowedRoles.includes(auth.role?.name)) {
20
10
  return res.status(HttpStatusCodes.FORBIDDEN).json({ message: "Forbidden: Insufficient permissions" });
21
11
  }
22
12
 
@@ -1,5 +1,4 @@
1
- import { createRoute, createRouter, HttpStatusCodes, jsonContent, z } from "@/framework/facade.js";
2
- import { loginLimiter } from "@/framework/http/ratelimiter.js";
1
+ import { createRoute, createRouter, HttpStatusCodes, jsonContent, loginLimiter, z } from "@/framework/facade.js";
3
2
  import { authMiddleware } from "@/middlewares/auth-middleware.js";
4
3
  import {
5
4
  forgotPassword,
@@ -1,4 +1,4 @@
1
- import { registerChannel, mailChannel, broadcastChannel } from "@/framework/facade.js";
1
+ import { broadcastChannel, mailChannel, registerChannel } from "@/framework/facade.js";
2
2
 
3
3
  registerChannel(mailChannel);
4
- registerChannel(broadcastChannel);
4
+ registerChannel(broadcastChannel);
@@ -1,65 +1,60 @@
1
- <template>
2
- <div :class="wrapperClass">
3
- <label :class="props.vertical ? 'form-check-label d-block' : 'd-none'">
4
- <span v-html="statusHtml"></span>
5
- </label>
6
- <div class="form-check form-switch d-inline-block">
7
- <input
8
- class="form-check-input shadow-none border-primary"
9
- type="checkbox"
10
- role="switch"
11
- :checked="isChecked"
12
- v-bind="$attrs" />
13
- <label :class="props.vertical ? 'd-none' : 'form-check-label'">
14
- <span v-html="statusHtml"></span>
15
- </label>
16
- </div>
17
- </div>
18
- </template>
19
-
20
- <script setup lang="ts">
21
- import { computed, useAttrs } from "vue";
22
-
23
- defineOptions({ name: "Switch", inheritAttrs: false });
24
-
25
- interface SwitchProps {
26
- modelValue?: string | number | boolean;
27
- value?: unknown[] | Record<string, unknown> | string | number | boolean;
28
- vertical?: boolean;
29
- checked?: boolean | number;
30
- }
31
-
32
- const $attrs = useAttrs();
33
- const props = defineProps<SwitchProps>();
34
-
35
- const textLabel = computed(() => ($attrs.text as string | undefined) || "");
36
- const blankLabel = computed(() => ($attrs.blank as string | undefined) || "");
37
- const topclass = computed(() => ($attrs.topclass as string | undefined) || "");
38
-
39
- const isChecked = computed(() => Boolean(props.checked));
40
-
41
- const wrapperClass = computed(() => (props.vertical ? `text-center ${topclass.value}`.trim() : ""));
42
-
43
- const statusHtml = computed(() => {
44
- if (isChecked.value) {
45
- return `<div class='d-flex justify-content-center'><span>${textLabel.value}</span><div class='rounded-circle bg-success indicator'></div></div>`;
46
- }
47
-
48
- return `<div class='d-flex justify-content-center'><span>${blankLabel.value}</span><div class='rounded-circle bg-danger indicator'></div></div>`;
49
- });
50
- </script>
51
-
52
- <style lang="scss">
53
- .indicator {
54
- width: 4px;
55
- height: 4px;
56
- margin-left: 2px;
57
- margin-top: 5px;
58
- }
59
- </style>
60
- <style lang="scss" scoped>
61
- label,
62
- input {
63
- cursor: pointer;
64
- }
65
- </style>
1
+ <template>
2
+ <div :class="wrapperClass">
3
+ <label :class="props.vertical ? 'form-check-label d-block' : 'd-none'">
4
+ <span v-html="statusHtml"></span>
5
+ </label>
6
+ <div class="form-check form-switch d-inline-block">
7
+ <input class="form-check-input shadow-none border-primary" type="checkbox" :checked="isChecked" v-bind="$attrs">
8
+ <label :class="props.vertical ? 'd-none' : 'form-check-label'">
9
+ <span v-html="statusHtml"></span>
10
+ </label>
11
+ </div>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup lang="ts">
16
+ import { computed, useAttrs } from "vue";
17
+
18
+ defineOptions({ name: "Switch", inheritAttrs: false });
19
+
20
+ interface SwitchProps {
21
+ modelValue?: string | number | boolean;
22
+ value?: unknown[] | Record<string, unknown> | string | number | boolean;
23
+ vertical?: boolean;
24
+ checked?: boolean | number;
25
+ }
26
+
27
+ const $attrs = useAttrs();
28
+ const props = defineProps<SwitchProps>();
29
+
30
+ const textLabel = computed(() => ($attrs.text as string | undefined) || "");
31
+ const blankLabel = computed(() => ($attrs.blank as string | undefined) || "");
32
+ const topclass = computed(() => ($attrs.topclass as string | undefined) || "");
33
+
34
+ const isChecked = computed(() => Boolean(props.checked));
35
+
36
+ const wrapperClass = computed(() => (props.vertical ? `text-center ${topclass.value}`.trim() : ""));
37
+
38
+ const statusHtml = computed(() => {
39
+ if (isChecked.value) {
40
+ return `<div class='d-flex justify-content-center'><span>${textLabel.value}</span><div class='rounded-circle bg-success indicator'></div></div>`;
41
+ }
42
+
43
+ return `<div class='d-flex justify-content-center'><span>${blankLabel.value}</span><div class='rounded-circle bg-danger indicator'></div></div>`;
44
+ });
45
+ </script>
46
+
47
+ <style lang="scss" scoped>
48
+ .indicator {
49
+ width: 4px;
50
+ height: 4px;
51
+ margin-left: 2px;
52
+ margin-top: 5px;
53
+ }
54
+ </style>
55
+ <style lang="scss" scoped>
56
+ label,
57
+ input {
58
+ cursor: pointer;
59
+ }
60
+ </style>
@@ -3,13 +3,10 @@
3
3
  <div class="auth col-12 col-sm-9 col-md-7 col-lg-5 col-xl-4 mx-auto py-5">
4
4
  <div class="card card-body border-0">
5
5
  <div class="d-block mb-2 text-center">
6
- <img src="@/assets/images/logo.png" alt="nexwire" style="max-height: 60px;" />
6
+ <img src="@/assets/images/logo.png" alt="nexwire" style="max-height: 60px;">
7
7
  </div>
8
8
  <h4 class="text-center">Forget Password</h4>
9
- <p
10
- v-if="message"
11
- class="text-center alert py-1 mt-2"
12
- :class="isError ? 'alert-danger text-danger' : 'alert-success text-success'">
9
+ <p v-if="message" class="text-center alert py-1 mt-2" :class="isError ? 'alert-danger text-danger' : 'alert-success text-success'">
13
10
  {{ message }}
14
11
  </p>
15
12
  <form id="formAuthentication" @submit.prevent="onSubmit">
@@ -22,14 +19,10 @@
22
19
  placeholder="Enter your email..."
23
20
  :err="form.errors.email"
24
21
  focus
25
- must />
22
+ must
23
+ />
26
24
  </div>
27
- <Button
28
- type="submit"
29
- label="Send Reset Link"
30
- class="btn btn-primary w-100"
31
- icon="bi bi-send ms-2"
32
- :disabled="processing" />
25
+ <Button type="submit" label="Send Reset Link" class="btn btn-primary w-100" icon="bi bi-send ms-2" :disabled="processing" />
33
26
  </form>
34
27
  <div class="text-center mt-2">
35
28
  <router-link to="/login">
@@ -47,11 +40,14 @@ import { useHead } from "@unhead/vue";
47
40
  import { ref } from "vue";
48
41
  import Button from "@/components/Button.vue";
49
42
  import Input from "@/components/Input.vue";
50
- import { useGumForm } from "@/plugins/gum";
43
+ import { useGum } from "@/plugins/gum";
44
+ import { type ForgotPayload, useAuthStore } from "@/stores/auth";
51
45
 
52
46
  useHead({ title: "Forget Password" });
53
47
 
54
- const form = useGumForm({ email: "" });
48
+ const auth = useAuthStore();
49
+ const gum = useGum({ email: "" });
50
+ const form = gum.form;
55
51
  const processing = form.processing;
56
52
  const message = ref("");
57
53
  const isError = ref(false);
@@ -59,24 +55,21 @@ const isError = ref(false);
59
55
  const onSubmit = async () => {
60
56
  message.value = "";
61
57
  isError.value = false;
62
- await form.post(
63
- "/api/auth/forgot-password",
64
- {
65
- email: String(form.data.email || "").trim()
58
+ await form.postWith({
59
+ fetcher: (body) => auth.forgotPassword(body as ForgotPayload),
60
+ transform: (data) => ({
61
+ email: String(data.email || "").trim()
62
+ }),
63
+ onSuccess: (res) => {
64
+ isError.value = false;
65
+ message.value = String(res.data || "If this email exists, a reset link has been sent");
66
+ form.reset();
66
67
  },
67
- {
68
- onSuccess: (res) => {
69
- console.log(res);
70
- isError.value = false;
71
- message.value = res.data.message;
72
- form.reset();
73
- },
74
- onError: (_errors, error) => {
75
- isError.value = true;
76
- message.value = error instanceof Error ? error.message : "Failed to process request";
77
- }
68
+ onError: (_errors, error) => {
69
+ isError.value = true;
70
+ message.value = error instanceof Error ? error.message : "Failed to process request";
78
71
  }
79
- );
72
+ });
80
73
  };
81
74
  </script>
82
75
 
@@ -3,7 +3,7 @@
3
3
  <div class="auth col-12 col-sm-9 col-md-7 col-lg-5 col-xl-4 mx-auto py-5">
4
4
  <div class="card card-body border-0">
5
5
  <div class="d-block mb-2 text-center">
6
- <img src="@/assets/images/logo.png" alt="nexwire" style="max-height: 60px;" />
6
+ <img src="@/assets/images/logo.png" alt="nexwire" style="max-height: 60px;">
7
7
  </div>
8
8
  <p v-if="errorMessage" class="text-center alert alert-danger text-danger py-1 mt-2">
9
9
  {{ errorMessage }}
@@ -18,7 +18,8 @@
18
18
  placeholder="Enter your email..."
19
19
  :err="form.errors.email"
20
20
  focus
21
- must />
21
+ must
22
+ />
22
23
  </div>
23
24
  <div class="mb-4">
24
25
  <input-password-toggle
@@ -27,15 +28,14 @@
27
28
  label="password"
28
29
  placeholder="Enter your password..."
29
30
  :err="form.errors.password"
30
- must />
31
+ must
32
+ />
31
33
  </div>
32
34
  <div class="mb-4 d-flex align-items-center justify-content-between">
33
35
  <Checkbox id="remember-me" v-model="form.data.remember" label="Remember me" />
34
- <router-link to="/forget-password" class="text-decoration-none mb-1">Forget
35
- Password?</router-link>
36
+ <router-link to="/forget-password" class="text-decoration-none mb-1">Forget Password?</router-link>
36
37
  </div>
37
- <Button type="submit" class="btn btn-primary w-100" label="Login"
38
- icon="bi bi-box-arrow-in-right" :disabled="processing" />
38
+ <Button type="submit" class="btn btn-primary w-100" label="Login" icon="bi bi-box-arrow-in-right" :disabled="processing" />
39
39
  <div class="text-center mt-3">
40
40
  <span class="text-muted">Don't have an account?</span>
41
41
  <router-link to="/register" class="ms-1 text-decoration-none">Register</router-link>
@@ -54,8 +54,8 @@ import Button from "@/components/Button.vue";
54
54
  import Checkbox from "@/components/Checkbox.vue";
55
55
  import Input from "@/components/Input.vue";
56
56
  import InputPasswordToggle from "@/components/InputPasswordToggle.vue";
57
- import { useGumForm } from "@/plugins/gum";
58
- import { useAuthStore } from "@/stores/auth";
57
+ import { useGum } from "@/plugins/gum";
58
+ import { type LoginPayload, useAuthStore } from "@/stores/auth";
59
59
 
60
60
  useHead({ title: "Login" });
61
61
 
@@ -63,36 +63,33 @@ const router = useRouter();
63
63
  const auth = useAuthStore();
64
64
  const errorMessage = ref("");
65
65
 
66
- const form = useGumForm({
66
+ const gum = useGum({
67
67
  email: "",
68
68
  password: "",
69
69
  remember: false
70
70
  });
71
71
 
72
+ const form = gum.form;
72
73
  const processing = form.processing;
73
74
 
74
75
  const onSubmit = async () => {
75
76
  errorMessage.value = "";
76
- await form.post(
77
- "/api/auth/login",
78
- {
79
- email: String(form.data.email || "").trim(),
80
- password: form.data.password,
81
- remember: !!form.data.remember
77
+ await form.postWith({
78
+ fetcher: (body) => auth.login(body as LoginPayload),
79
+ transform: (data) => ({
80
+ email: String(data.email || "").trim(),
81
+ password: data.password,
82
+ remember: !!data.remember
83
+ }),
84
+ onSuccess: async () => {
85
+ form.reset("password");
86
+ await router.push("/");
82
87
  },
83
- {
84
- onSuccess: async () => {
85
- auth.initialized = false;
86
- await auth.bootstrap();
87
- form.reset("password");
88
- await router.push("/");
89
- },
90
- onError: (_errors, error) => {
91
- errorMessage.value = error instanceof Error ? error.message : "Unable to login right now";
92
- form.reset("password");
93
- }
88
+ onError: (_errors, error) => {
89
+ errorMessage.value = error instanceof Error ? error.message : "Unable to login right now";
90
+ form.reset("password");
94
91
  }
95
- );
92
+ });
96
93
  };
97
94
  </script>
98
95