create-nexwire 4.2.5 → 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 (399) hide show
  1. package/README.md +29 -12
  2. package/express/.env +1 -1
  3. package/express/package.json +1 -1
  4. package/express/src/config/database.ts +48 -29
  5. package/express/src/config/index.ts +83 -83
  6. package/express/src/config/openapi.ts +6 -24
  7. package/express/src/config/queue.ts +30 -30
  8. package/express/src/config/validate.ts +50 -40
  9. package/express/src/database/migrations/sqlite/0000_init.sql +47 -47
  10. package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
  11. package/express/src/database/migrations/sqlite/meta/_journal.json +1 -1
  12. package/express/src/framework/cache/cache.ts +40 -8
  13. package/express/src/framework/circuit-breaker/cb.ts +88 -60
  14. package/express/src/framework/database/connection.ts +52 -27
  15. package/express/src/framework/events/dispatcher.ts +61 -49
  16. package/express/src/framework/facade.ts +47 -3
  17. package/express/src/framework/http/app.ts +28 -22
  18. package/express/src/framework/http/logger.ts +37 -17
  19. package/express/src/framework/http/openapi.ts +9 -11
  20. package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
  21. package/express/src/framework/modules/routes.ts +26 -21
  22. package/express/src/framework/notification/channels/broadcast.ts +15 -0
  23. package/express/src/framework/notification/channels/mail.ts +42 -0
  24. package/express/src/framework/notification/contracts.ts +29 -0
  25. package/express/src/framework/notification/index.ts +19 -94
  26. package/express/src/framework/notification/registry.ts +15 -0
  27. package/express/src/framework/providers/adapter.ts +27 -17
  28. package/express/src/framework/queue/queue.ts +43 -44
  29. package/express/src/framework/realtime/broadcast.ts +29 -5
  30. package/express/src/framework/realtime/socket.ts +149 -119
  31. package/express/src/framework/redis/client.ts +148 -151
  32. package/express/src/framework/runtime/server-adapter.ts +39 -34
  33. package/express/src/framework/scheduler/lock.ts +128 -116
  34. package/express/src/framework/server.ts +33 -49
  35. package/express/src/framework/session/session.ts +69 -14
  36. package/express/src/framework/storage/storage.ts +744 -785
  37. package/express/src/framework/support/mail.ts +15 -7
  38. package/express/src/middlewares/auth-middleware.ts +1 -2
  39. package/express/src/middlewares/role-middleware.ts +3 -13
  40. package/express/src/modules/auth/routes/index.ts +1 -2
  41. package/express/src/providers/notification.ts +4 -0
  42. package/express/src/resources/src/components/Switch.vue +60 -65
  43. package/express/src/resources/src/layouts/Layout/Header.vue +124 -105
  44. package/express/src/resources/src/pages/auth/forgetPassword.vue +23 -30
  45. package/express/src/resources/src/pages/auth/login.vue +25 -28
  46. package/express/src/resources/src/pages/auth/register.vue +35 -39
  47. package/express/src/resources/src/pages/auth/resetPassword.vue +29 -37
  48. package/express/src/resources/src/pages/auth/verifyEmail.vue +15 -19
  49. package/express/src/resources/src/plugins/gum.ts +519 -203
  50. package/express/src/resources/src/plugins/pulse.ts +157 -147
  51. package/express/src/resources/src/stores/auth.ts +9 -6
  52. package/express/src/resources/vite.config.ts +54 -43
  53. package/express/src/storage/database/nexwire.sqlite +0 -0
  54. package/express/src/storage/logs/app.log +0 -0
  55. package/express/src/storage/logs/fatal.log +0 -0
  56. package/express/src/types/global.d.ts +32 -26
  57. package/fastify/.dockerignore +14 -0
  58. package/fastify/.env +44 -0
  59. package/fastify/.env.example +42 -0
  60. package/fastify/.vscode/extensions.json +6 -0
  61. package/fastify/.vscode/settings.json +37 -0
  62. package/fastify/LICENSE +21 -0
  63. package/fastify/README.md +232 -0
  64. package/fastify/biome.json +99 -0
  65. package/fastify/drizzle.config.ts +25 -0
  66. package/fastify/gitignore-stub +31 -0
  67. package/fastify/package.json +130 -0
  68. package/fastify/public/.gitkeep +0 -0
  69. package/fastify/src/config/app.ts +41 -0
  70. package/fastify/src/config/auth.ts +12 -0
  71. package/fastify/src/config/cache.ts +16 -0
  72. package/fastify/src/config/cookie.ts +15 -0
  73. package/fastify/src/config/cors.ts +12 -0
  74. package/fastify/src/config/database.ts +48 -0
  75. package/fastify/src/config/index.ts +83 -0
  76. package/fastify/src/config/jwt.ts +19 -0
  77. package/fastify/src/config/logging.ts +13 -0
  78. package/fastify/src/config/mail.ts +24 -0
  79. package/fastify/src/config/openapi.ts +36 -0
  80. package/fastify/src/config/queue.ts +30 -0
  81. package/fastify/src/config/rateLimit.ts +17 -0
  82. package/fastify/src/config/realtime.ts +15 -0
  83. package/fastify/src/config/redis.ts +18 -0
  84. package/fastify/src/config/security.ts +44 -0
  85. package/fastify/src/config/session.ts +17 -0
  86. package/fastify/src/config/storage.ts +22 -0
  87. package/fastify/src/config/validate.ts +50 -0
  88. package/fastify/src/database/migrations/sqlite/0000_init.sql +48 -0
  89. package/fastify/src/database/migrations/sqlite/meta/0000_snapshot.json +324 -0
  90. package/fastify/src/database/migrations/sqlite/meta/_journal.json +13 -0
  91. package/fastify/src/database/schema.ts +2 -0
  92. package/fastify/src/env.ts +76 -0
  93. package/fastify/src/framework/cache/cache.ts +114 -0
  94. package/fastify/src/framework/circuit-breaker/cb.ts +88 -0
  95. package/fastify/src/framework/database/app-schema.ts +37 -0
  96. package/fastify/src/framework/database/connection.ts +223 -0
  97. package/fastify/src/framework/database/migrate-hooks.ts +87 -0
  98. package/fastify/src/framework/database/paginate.ts +226 -0
  99. package/fastify/src/framework/database/schema.ts +20 -0
  100. package/fastify/src/framework/database/seed.ts +152 -0
  101. package/fastify/src/framework/events/dispatcher.ts +61 -0
  102. package/fastify/src/framework/facade.ts +96 -0
  103. package/fastify/src/framework/http/app.ts +176 -0
  104. package/fastify/src/framework/http/cors.ts +13 -0
  105. package/fastify/src/framework/http/fastify.d.ts +13 -0
  106. package/fastify/src/framework/http/logger.ts +110 -0
  107. package/fastify/src/framework/http/metrics.ts +22 -0
  108. package/fastify/src/framework/http/openapi.ts +48 -0
  109. package/fastify/src/framework/http/ratelimiter.ts +47 -0
  110. package/fastify/src/framework/http/security.ts +25 -0
  111. package/fastify/src/framework/http/static.ts +83 -0
  112. package/fastify/src/framework/http/validation.ts +49 -0
  113. package/fastify/src/framework/kernel.ts +43 -0
  114. package/fastify/src/framework/maker-cli/db/core.mjs +291 -0
  115. package/fastify/src/framework/maker-cli/db/index.mjs +204 -0
  116. package/fastify/src/framework/maker-cli/deploy/core.mjs +1046 -0
  117. package/fastify/src/framework/maker-cli/deploy/index.mjs +91 -0
  118. package/fastify/src/framework/maker-cli/index.mjs +65 -0
  119. package/fastify/src/framework/maker-cli/middleware/core.mjs +41 -0
  120. package/fastify/src/framework/maker-cli/middleware/index.mjs +17 -0
  121. package/fastify/src/framework/maker-cli/module/core.mjs +1066 -0
  122. package/fastify/src/framework/maker-cli/module/index.mjs +211 -0
  123. package/fastify/src/framework/maker-cli/provider/core.mjs +49 -0
  124. package/fastify/src/framework/maker-cli/provider/index.mjs +12 -0
  125. package/fastify/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
  126. package/fastify/src/framework/maker-cli/runtime/core.mjs +560 -0
  127. package/fastify/src/framework/maker-cli/runtime/index.mjs +120 -0
  128. package/fastify/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  129. package/fastify/src/framework/maker-cli/stubs/controller/openapi.ts.stub +74 -0
  130. package/fastify/src/framework/maker-cli/stubs/controller/plain.ts.stub +77 -0
  131. package/fastify/src/framework/maker-cli/stubs/controller/standalone.ts.stub +51 -0
  132. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  133. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  134. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  135. package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  136. package/fastify/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  137. package/fastify/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  138. package/fastify/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  139. package/fastify/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  140. package/fastify/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  141. package/fastify/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  142. package/fastify/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  143. package/fastify/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  144. package/fastify/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  145. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  146. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  147. package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  148. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  149. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  150. package/fastify/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  151. package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  152. package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  153. package/fastify/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  154. package/fastify/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  155. package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  156. package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  157. package/fastify/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  158. package/fastify/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  159. package/fastify/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
  160. package/fastify/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
  161. package/fastify/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  162. package/fastify/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
  163. package/fastify/src/framework/maker-cli/stubs/middleware/name.ts.stub +15 -0
  164. package/fastify/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +10 -0
  165. package/fastify/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +10 -0
  166. package/fastify/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +10 -0
  167. package/fastify/src/framework/maker-cli/stubs/notification/controller.ts.stub +79 -0
  168. package/fastify/src/framework/maker-cli/stubs/notification/job.ts.stub +11 -0
  169. package/fastify/src/framework/maker-cli/stubs/notification/model.ts.stub +29 -0
  170. package/fastify/src/framework/maker-cli/stubs/notification/provider.ts.stub +174 -0
  171. package/fastify/src/framework/maker-cli/stubs/notification/route.api.ts.stub +71 -0
  172. package/fastify/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +15 -0
  173. package/fastify/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  174. package/fastify/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  175. package/fastify/src/framework/maker-cli/stubs/provider/module-barrel.ts.stub +19 -0
  176. package/fastify/src/framework/maker-cli/stubs/provider/module.ts.stub +21 -0
  177. package/fastify/src/framework/maker-cli/stubs/provider/name.ts.stub +21 -0
  178. package/fastify/src/framework/maker-cli/stubs/route/api.ts.stub +101 -0
  179. package/fastify/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -0
  180. package/fastify/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +120 -0
  181. package/fastify/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +50 -0
  182. package/fastify/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  183. package/fastify/src/framework/maker-cli/stubs/schema/name.plain.ts.stub +14 -0
  184. package/fastify/src/framework/maker-cli/stubs/schema/name.ts.stub +33 -0
  185. package/fastify/src/framework/maker-cli/stubs/seeder/name.ts.stub +18 -0
  186. package/fastify/src/framework/maker-cli/stubs/seeder/standalone.ts.stub +22 -0
  187. package/fastify/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
  188. package/fastify/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
  189. package/fastify/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  190. package/fastify/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
  191. package/fastify/src/framework/maker-cli/utils/env-config.mjs +44 -0
  192. package/fastify/src/framework/maker-cli/utils/env-db.mjs +61 -0
  193. package/fastify/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  194. package/fastify/src/framework/maker-cli/utils/flags.mjs +14 -0
  195. package/fastify/src/framework/maker-cli/utils/help.mjs +379 -0
  196. package/fastify/src/framework/maker-cli/utils/naming.mjs +119 -0
  197. package/fastify/src/framework/maker-cli/utils/process.mjs +52 -0
  198. package/fastify/src/framework/maker-cli/utils/project-commands.mjs +201 -0
  199. package/fastify/src/framework/modules/discover.ts +57 -0
  200. package/fastify/src/framework/modules/routes.ts +31 -0
  201. package/fastify/src/framework/notification/channels/broadcast.ts +15 -0
  202. package/fastify/src/framework/notification/channels/mail.ts +42 -0
  203. package/fastify/src/framework/notification/contracts.ts +29 -0
  204. package/fastify/src/framework/notification/index.ts +59 -0
  205. package/fastify/src/framework/notification/registry.ts +15 -0
  206. package/fastify/src/framework/providers/adapter.ts +149 -0
  207. package/fastify/src/framework/providers/contracts.ts +126 -0
  208. package/fastify/src/framework/providers/loader.ts +105 -0
  209. package/fastify/src/framework/providers/registry.ts +88 -0
  210. package/fastify/src/framework/queue/clear.ts +22 -0
  211. package/fastify/src/framework/queue/queue.ts +401 -0
  212. package/fastify/src/framework/queue/ui.ts +194 -0
  213. package/fastify/src/framework/queue/worker.ts +61 -0
  214. package/fastify/src/framework/realtime/broadcast.ts +70 -0
  215. package/fastify/src/framework/realtime/index.ts +2 -0
  216. package/fastify/src/framework/realtime/socket-cookie.ts +72 -0
  217. package/fastify/src/framework/realtime/socket.ts +149 -0
  218. package/fastify/src/framework/realtime/types.ts +6 -0
  219. package/fastify/src/framework/realtime/ui.ts +16 -0
  220. package/fastify/src/framework/redis/client.ts +148 -0
  221. package/fastify/src/framework/runtime/runtime.ts +23 -0
  222. package/fastify/src/framework/runtime/server-adapter.ts +33 -0
  223. package/fastify/src/framework/scheduler/lock.ts +128 -0
  224. package/fastify/src/framework/scheduler/run.ts +48 -0
  225. package/fastify/src/framework/scheduler/scheduler.ts +155 -0
  226. package/fastify/src/framework/server.ts +162 -0
  227. package/fastify/src/framework/session/session.ts +160 -0
  228. package/fastify/src/framework/storage/storage.ts +744 -0
  229. package/fastify/src/framework/support/cookie.ts +71 -0
  230. package/fastify/src/framework/support/jwt.ts +33 -0
  231. package/fastify/src/framework/support/lifecycle.ts +35 -0
  232. package/fastify/src/framework/support/logger.ts +148 -0
  233. package/fastify/src/framework/support/mail.ts +56 -0
  234. package/fastify/src/framework/support/password.ts +23 -0
  235. package/fastify/src/framework/support/status-codes.ts +75 -0
  236. package/fastify/src/framework/support/upload.ts +181 -0
  237. package/fastify/src/framework/support/url.ts +41 -0
  238. package/fastify/src/middlewares/auth-middleware.ts +134 -0
  239. package/fastify/src/middlewares/role-middleware.ts +19 -0
  240. package/fastify/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
  241. package/fastify/src/modules/auth/__tests__/login.test.ts +171 -0
  242. package/fastify/src/modules/auth/__tests__/logout.test.ts +60 -0
  243. package/fastify/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
  244. package/fastify/src/modules/auth/__tests__/me.test.ts +91 -0
  245. package/fastify/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
  246. package/fastify/src/modules/auth/__tests__/register.test.ts +291 -0
  247. package/fastify/src/modules/auth/__tests__/resetpass.test.ts +206 -0
  248. package/fastify/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
  249. package/fastify/src/modules/auth/controllers/auth.ts +252 -0
  250. package/fastify/src/modules/auth/controllers/role.ts +35 -0
  251. package/fastify/src/modules/auth/database/models/role.ts +14 -0
  252. package/fastify/src/modules/auth/database/models/user.ts +46 -0
  253. package/fastify/src/modules/auth/database/seeders/role.ts +18 -0
  254. package/fastify/src/modules/auth/database/seeders/user.ts +35 -0
  255. package/fastify/src/modules/auth/facade.ts +12 -0
  256. package/fastify/src/modules/auth/helpers/auth.ts +115 -0
  257. package/fastify/src/modules/auth/jobs/forgetpass.ts +20 -0
  258. package/fastify/src/modules/auth/jobs/registeruser.ts +23 -0
  259. package/fastify/src/modules/auth/jobs/verifyemail.ts +18 -0
  260. package/fastify/src/modules/auth/routes/index.ts +185 -0
  261. package/fastify/src/modules/auth/routes/role.ts +56 -0
  262. package/fastify/src/modules/auth/schemas/auth.ts +116 -0
  263. package/fastify/src/modules/auth/services/forgetpassword.ts +66 -0
  264. package/fastify/src/modules/auth/services/login.ts +63 -0
  265. package/fastify/src/modules/auth/services/logout.ts +25 -0
  266. package/fastify/src/modules/auth/services/logoutalldevices.ts +19 -0
  267. package/fastify/src/modules/auth/services/me.ts +31 -0
  268. package/fastify/src/modules/auth/services/refreshtoken.ts +110 -0
  269. package/fastify/src/modules/auth/services/register.ts +141 -0
  270. package/fastify/src/modules/auth/services/resetpassword.ts +69 -0
  271. package/fastify/src/modules/auth/services/verifyemail.ts +77 -0
  272. package/fastify/src/modules/auth/types/auth.ts +31 -0
  273. package/fastify/src/providers/README.md +107 -0
  274. package/fastify/src/providers/notification.ts +4 -0
  275. package/fastify/src/resources/index.html +17 -0
  276. package/fastify/src/resources/src/App.vue +5 -0
  277. package/fastify/src/resources/src/assets/css/styles.css +14761 -0
  278. package/fastify/src/resources/src/assets/css/styles.css.map +1 -0
  279. package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  280. package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  281. package/fastify/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  282. package/fastify/src/resources/src/assets/images/logo.png +0 -0
  283. package/fastify/src/resources/src/assets/scss/custom.css +217 -0
  284. package/fastify/src/resources/src/assets/scss/custom.css.map +1 -0
  285. package/fastify/src/resources/src/assets/scss/custom.scss +1346 -0
  286. package/fastify/src/resources/src/components/Button.vue +32 -0
  287. package/fastify/src/resources/src/components/Checkbox.vue +32 -0
  288. package/fastify/src/resources/src/components/Datepicker.vue +106 -0
  289. package/fastify/src/resources/src/components/FeatureButton.vue +53 -0
  290. package/fastify/src/resources/src/components/FloatButton.vue +33 -0
  291. package/fastify/src/resources/src/components/Href.vue +32 -0
  292. package/fastify/src/resources/src/components/Input.vue +243 -0
  293. package/fastify/src/resources/src/components/InputGroup.vue +147 -0
  294. package/fastify/src/resources/src/components/InputPasswordToggle.vue +229 -0
  295. package/fastify/src/resources/src/components/Modal.vue +71 -0
  296. package/fastify/src/resources/src/components/Pagebar.vue +26 -0
  297. package/fastify/src/resources/src/components/Refresh.vue +19 -0
  298. package/fastify/src/resources/src/components/Select.vue +384 -0
  299. package/fastify/src/resources/src/components/Spinner.vue +42 -0
  300. package/fastify/src/resources/src/components/Switch.vue +60 -0
  301. package/fastify/src/resources/src/components/TextArea.vue +117 -0
  302. package/fastify/src/resources/src/components/Toast.vue +56 -0
  303. package/fastify/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  304. package/fastify/src/resources/src/components/datatable/Pagination.vue +147 -0
  305. package/fastify/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  306. package/fastify/src/resources/src/components/datatable/index.vue +199 -0
  307. package/fastify/src/resources/src/composables/useAuth.ts +52 -0
  308. package/fastify/src/resources/src/helpers/assets.ts +51 -0
  309. package/fastify/src/resources/src/helpers/nformatter.ts +10 -0
  310. package/fastify/src/resources/src/helpers/utils.ts +75 -0
  311. package/fastify/src/resources/src/layouts/AuthLayout.vue +20 -0
  312. package/fastify/src/resources/src/layouts/Layout/Footer.vue +23 -0
  313. package/fastify/src/resources/src/layouts/Layout/Header.vue +124 -0
  314. package/fastify/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  315. package/fastify/src/resources/src/layouts/Layout/index.vue +87 -0
  316. package/fastify/src/resources/src/main.ts +28 -0
  317. package/fastify/src/resources/src/pages/auth/forgetPassword.vue +76 -0
  318. package/fastify/src/resources/src/pages/auth/login.vue +96 -0
  319. package/fastify/src/resources/src/pages/auth/register.vue +129 -0
  320. package/fastify/src/resources/src/pages/auth/resetPassword.vue +110 -0
  321. package/fastify/src/resources/src/pages/auth/verifyEmail.vue +64 -0
  322. package/fastify/src/resources/src/pages/dashboard/index.vue +66 -0
  323. package/fastify/src/resources/src/plugins/axios.ts +31 -0
  324. package/fastify/src/resources/src/plugins/browserDetect.ts +55 -0
  325. package/fastify/src/resources/src/plugins/dialog.ts +216 -0
  326. package/fastify/src/resources/src/plugins/gum.ts +683 -0
  327. package/fastify/src/resources/src/plugins/pulse.ts +157 -0
  328. package/fastify/src/resources/src/plugins/routeProgress.ts +87 -0
  329. package/fastify/src/resources/src/router/index.ts +85 -0
  330. package/fastify/src/resources/src/stores/admin-ui.ts +148 -0
  331. package/fastify/src/resources/src/stores/auth.ts +187 -0
  332. package/fastify/src/resources/tsconfig.json +19 -0
  333. package/fastify/src/resources/vite.config.ts +64 -0
  334. package/fastify/src/storage/app/private/.gitkeep +0 -0
  335. package/fastify/src/storage/app/public/.gitkeep +0 -0
  336. package/fastify/src/storage/app/tmp/generated/.gitkeep +0 -0
  337. package/fastify/src/storage/database/nexwire.sqlite +0 -0
  338. package/fastify/src/storage/logs/.gitkeep +0 -0
  339. package/fastify/src/storage/logs/app.log +0 -0
  340. package/fastify/src/storage/logs/fatal.log +0 -0
  341. package/fastify/src/storage/tmp/.gitkeep +0 -0
  342. package/fastify/src/storage/trash/modules/.gitkeep +0 -0
  343. package/fastify/src/types/global.d.ts +32 -0
  344. package/fastify/tsconfig.json +19 -0
  345. package/fastify/vitest.config.ts +38 -0
  346. package/hono/.env +1 -1
  347. package/hono/package.json +1 -1
  348. package/hono/src/config/database.ts +48 -29
  349. package/hono/src/config/index.ts +83 -83
  350. package/hono/src/config/openapi.ts +6 -24
  351. package/hono/src/config/queue.ts +30 -30
  352. package/hono/src/config/validate.ts +50 -40
  353. package/hono/src/database/migrations/sqlite/0000_init.sql +47 -47
  354. package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
  355. package/hono/src/database/migrations/sqlite/meta/_journal.json +1 -1
  356. package/hono/src/framework/cache/cache.ts +40 -8
  357. package/hono/src/framework/circuit-breaker/cb.ts +88 -60
  358. package/hono/src/framework/database/connection.ts +52 -27
  359. package/hono/src/framework/events/dispatcher.ts +61 -49
  360. package/hono/src/framework/facade.ts +39 -1
  361. package/hono/src/framework/http/logger.ts +86 -81
  362. package/hono/src/framework/http/openapi.ts +7 -9
  363. package/hono/src/framework/maker-cli/runtime/core.mjs +1 -2
  364. package/hono/src/framework/notification/channels/broadcast.ts +15 -0
  365. package/hono/src/framework/notification/channels/mail.ts +42 -0
  366. package/hono/src/framework/notification/contracts.ts +29 -0
  367. package/hono/src/framework/notification/index.ts +19 -94
  368. package/hono/src/framework/notification/registry.ts +15 -0
  369. package/hono/src/framework/providers/adapter.ts +27 -17
  370. package/hono/src/framework/queue/queue.ts +43 -44
  371. package/hono/src/framework/realtime/broadcast.ts +29 -5
  372. package/hono/src/framework/realtime/socket.ts +217 -196
  373. package/hono/src/framework/redis/client.ts +148 -151
  374. package/hono/src/framework/scheduler/lock.ts +128 -116
  375. package/hono/src/framework/server.ts +27 -29
  376. package/hono/src/framework/session/session.ts +62 -14
  377. package/hono/src/framework/storage/storage.ts +744 -785
  378. package/hono/src/framework/support/mail.ts +56 -48
  379. package/hono/src/middlewares/auth-middleware.ts +1 -2
  380. package/hono/src/middlewares/role-middleware.ts +3 -13
  381. package/hono/src/modules/auth/routes/index.ts +1 -2
  382. package/hono/src/providers/notification.ts +4 -0
  383. package/hono/src/resources/src/components/Switch.vue +60 -65
  384. package/hono/src/resources/src/layouts/Layout/Header.vue +124 -105
  385. package/hono/src/resources/src/pages/auth/forgetPassword.vue +23 -29
  386. package/hono/src/resources/src/pages/auth/login.vue +26 -29
  387. package/hono/src/resources/src/pages/auth/register.vue +36 -40
  388. package/hono/src/resources/src/pages/auth/resetPassword.vue +29 -37
  389. package/hono/src/resources/src/pages/auth/verifyEmail.vue +15 -19
  390. package/hono/src/resources/src/plugins/gum.ts +519 -203
  391. package/hono/src/resources/src/plugins/pulse.ts +157 -147
  392. package/hono/src/resources/src/stores/auth.ts +9 -6
  393. package/hono/src/resources/vite.config.ts +54 -43
  394. package/hono/src/storage/database/nexwire.sqlite +0 -0
  395. package/hono/src/storage/logs/app.log +0 -0
  396. package/hono/src/storage/logs/fatal.log +0 -0
  397. package/hono/src/types/global.d.ts +32 -26
  398. package/package.json +4 -3
  399. package/src/index.js +143 -15
@@ -1,147 +1,157 @@
1
- import { io, type Socket } from "socket.io-client";
2
- import type { App } from "vue";
3
-
4
- declare const __SOCKET_ENABLED__: boolean;
5
-
6
- type EventCallback<T = unknown> = (payload: T) => void;
7
-
8
- type ChannelBinding = {
9
- event: string;
10
- callback: EventCallback;
11
- wrapped: EventCallback;
12
- };
13
-
14
- type PulseChannel = {
15
- listen: <T = unknown>(event: string, callback: EventCallback<T>) => PulseChannel;
16
- stopListening: (event: string, callback?: EventCallback) => PulseChannel;
17
- };
18
-
19
- export type PulseClient = {
20
- connect: () => PulseClient;
21
- disconnect: () => PulseClient;
22
- channel: (name: string) => PulseChannel;
23
- private: (room: string) => PulseChannel;
24
- leave: (room: string) => PulseClient;
25
- };
26
-
27
- function createPulse(): PulseClient {
28
- if (!__SOCKET_ENABLED__) {
29
- const n = (): PulseChannel => ({ listen: () => n(), stopListening: () => n() });
30
- const c: PulseClient = {
31
- connect: () => c,
32
- disconnect: () => c,
33
- channel: n,
34
- private: n,
35
- leave: () => c
36
- };
37
- return c;
38
- }
39
- let socket: Socket | null = null;
40
- const channels = new Map<string, ChannelBinding[]>();
41
- const joinedRooms = new Set<string>();
42
-
43
- const socketUrl = () => {
44
- const explicit = import.meta.env.VITE_SOCKET_URL || import.meta.env.VITE_API_URL;
45
- if (explicit) return explicit;
46
- return window.location.origin;
47
- };
48
-
49
- const ensureConnected = () => {
50
- if (socket) return socket;
51
-
52
- socket = io(socketUrl(), {
53
- withCredentials: true,
54
- transports: ["websocket", "polling"]
55
- });
56
-
57
- socket.on("connect", () => {
58
- for (const room of joinedRooms) {
59
- socket?.emit("join", room);
60
- }
61
- });
62
-
63
- return socket;
64
- };
65
-
66
- const channel = (name: string): PulseChannel => {
67
- const room = String(name).trim();
68
- if (!room) throw new Error("Channel name is required");
69
-
70
- const currentSocket = ensureConnected();
71
- joinedRooms.add(room);
72
- currentSocket.emit("join", room);
73
-
74
- const api: PulseChannel = {
75
- listen: <T = unknown>(event: string, callback: EventCallback<T>) => {
76
- const wrapped = (payload: unknown) => callback(payload as T);
77
- const bindings = channels.get(room) || [];
78
- bindings.push({ event, callback: callback as EventCallback, wrapped });
79
- channels.set(room, bindings);
80
- currentSocket.on(event, wrapped);
81
- return api;
82
- },
83
- stopListening: (event: string, callback?: EventCallback) => {
84
- const bindings = channels.get(room) || [];
85
- const kept: ChannelBinding[] = [];
86
-
87
- for (const binding of bindings) {
88
- const matchesEvent = binding.event === event;
89
- const matchesCallback = !callback || binding.callback === callback;
90
- if (matchesEvent && matchesCallback) {
91
- currentSocket.off(binding.event, binding.wrapped);
92
- } else {
93
- kept.push(binding);
94
- }
95
- }
96
-
97
- if (kept.length > 0) channels.set(room, kept);
98
- else channels.delete(room);
99
- return api;
100
- }
101
- };
102
-
103
- return api;
104
- };
105
-
106
- const pulse: PulseClient = {
107
- connect: () => {
108
- ensureConnected();
109
- return pulse;
110
- },
111
- disconnect: () => {
112
- socket?.disconnect();
113
- socket = null;
114
- return pulse;
115
- },
116
- channel,
117
- private: (room: string) => channel(`private:${room}`),
118
- leave: (room: string) => {
119
- if (!socket) return pulse;
120
-
121
- const bindings = channels.get(room) || [];
122
- for (const binding of bindings) {
123
- socket.off(binding.event, binding.wrapped);
124
- }
125
-
126
- channels.delete(room);
127
- joinedRooms.delete(room);
128
- return pulse;
129
- }
130
- };
131
-
132
- return pulse;
133
- }
134
-
135
- export const pulse = createPulse();
136
-
137
- export const PulsePlugin = {
138
- install(app: App) {
139
- app.config.globalProperties.$pulse = pulse;
140
- }
141
- };
142
-
143
- declare module "vue" {
144
- interface ComponentCustomProperties {
145
- $pulse: PulseClient;
146
- }
147
- }
1
+ import { io, type Socket } from "socket.io-client";
2
+ import type { App } from "vue";
3
+
4
+ // 1. Read the value Vite inlines into this module. Do not use a bare `define`
5
+ // global here: in dev it is a window global and can survive a server
6
+ // restart or browser cache, leaving Pulse enabled after SOCKET=false.
7
+ const isSocketEnabled = import.meta.env.VITE_SOCKET_ENABLED === true;
8
+
9
+ type EventCallback<T = unknown> = (payload: T) => void;
10
+
11
+ type ChannelBinding = {
12
+ event: string;
13
+ callback: EventCallback;
14
+ wrapped: EventCallback;
15
+ };
16
+
17
+ type PulseChannel = {
18
+ listen: <T = unknown>(event: string, callback: EventCallback<T>) => PulseChannel;
19
+ stopListening: (event: string, callback?: EventCallback) => PulseChannel;
20
+ };
21
+
22
+ export type PulseClient = {
23
+ connect: () => PulseClient;
24
+ disconnect: () => PulseClient;
25
+ channel: (name: string) => PulseChannel;
26
+ private: (room: string) => PulseChannel;
27
+ leave: (room: string) => PulseClient;
28
+ };
29
+
30
+ function createPulse(): PulseClient {
31
+ // 2. If disabled, return the no-op dummy client immediately
32
+ if (!isSocketEnabled) {
33
+ const dummyChannel = (): PulseChannel => ({
34
+ listen: () => dummyChannel(),
35
+ stopListening: () => dummyChannel()
36
+ });
37
+
38
+ const dummyClient: PulseClient = {
39
+ connect: () => dummyClient,
40
+ disconnect: () => dummyClient,
41
+ channel: dummyChannel,
42
+ private: dummyChannel,
43
+ leave: () => dummyClient
44
+ };
45
+
46
+ return dummyClient;
47
+ }
48
+
49
+ let socket: Socket | null = null;
50
+ const channels = new Map<string, ChannelBinding[]>();
51
+ const joinedRooms = new Set<string>();
52
+
53
+ const socketUrl = () => {
54
+ const explicit = import.meta.env.VITE_SOCKET_URL || import.meta.env.VITE_API_URL;
55
+ if (explicit) return explicit;
56
+ return window.location.origin;
57
+ };
58
+
59
+ const ensureConnected = () => {
60
+ if (socket) return socket;
61
+
62
+ socket = io(socketUrl(), {
63
+ withCredentials: true,
64
+ transports: ["websocket", "polling"]
65
+ });
66
+
67
+ socket.on("connect", () => {
68
+ for (const room of joinedRooms) {
69
+ socket?.emit("join", room);
70
+ }
71
+ });
72
+
73
+ return socket;
74
+ };
75
+
76
+ const channel = (name: string): PulseChannel => {
77
+ const room = String(name).trim();
78
+ if (!room) throw new Error("Channel name is required");
79
+
80
+ const currentSocket = ensureConnected();
81
+ joinedRooms.add(room);
82
+ currentSocket.emit("join", room);
83
+
84
+ const api: PulseChannel = {
85
+ listen: <T = unknown>(event: string, callback: EventCallback<T>) => {
86
+ const wrapped = (payload: unknown) => callback(payload as T);
87
+ const bindings = channels.get(room) || [];
88
+ bindings.push({ event, callback: callback as EventCallback, wrapped });
89
+ channels.set(room, bindings);
90
+ currentSocket.on(event, wrapped);
91
+ return api;
92
+ },
93
+ stopListening: (event: string, callback?: EventCallback) => {
94
+ const bindings = channels.get(room) || [];
95
+ const kept: ChannelBinding[] = [];
96
+
97
+ for (const binding of bindings) {
98
+ const matchesEvent = binding.event === event;
99
+ const matchesCallback = !callback || binding.callback === callback;
100
+ if (matchesEvent && matchesCallback) {
101
+ currentSocket.off(binding.event, binding.wrapped);
102
+ } else {
103
+ kept.push(binding);
104
+ }
105
+ }
106
+
107
+ if (kept.length > 0) channels.set(room, kept);
108
+ else channels.delete(room);
109
+ return api;
110
+ }
111
+ };
112
+
113
+ return api;
114
+ };
115
+
116
+ const pulse: PulseClient = {
117
+ connect: () => {
118
+ ensureConnected();
119
+ return pulse;
120
+ },
121
+ disconnect: () => {
122
+ socket?.disconnect();
123
+ socket = null;
124
+ return pulse;
125
+ },
126
+ channel,
127
+ private: (room: string) => channel(`private:${room}`),
128
+ leave: (room: string) => {
129
+ if (!socket) return pulse;
130
+
131
+ const bindings = channels.get(room) || [];
132
+ for (const binding of bindings) {
133
+ socket.off(binding.event, binding.wrapped);
134
+ }
135
+
136
+ channels.delete(room);
137
+ joinedRooms.delete(room);
138
+ return pulse;
139
+ }
140
+ };
141
+
142
+ return pulse;
143
+ }
144
+
145
+ export const pulse = createPulse();
146
+
147
+ export const PulsePlugin = {
148
+ install(app: App) {
149
+ app.config.globalProperties.$pulse = pulse;
150
+ }
151
+ };
152
+
153
+ declare module "vue" {
154
+ interface ComponentCustomProperties {
155
+ $pulse: PulseClient;
156
+ }
157
+ }
@@ -3,11 +3,11 @@ import { defineStore } from "pinia";
3
3
  import { ref } from "vue";
4
4
  import { type AuthUser, clearUser, setUser } from "@/composables/useAuth";
5
5
 
6
- type LoginPayload = { email?: string; phone?: string; password: string; remember?: boolean };
7
- type VerifyEmailPayload = { email: string; token: string };
8
- type ForgotPayload = { email: string };
6
+ export type LoginPayload = { email?: string; phone?: string; password: string; remember?: boolean };
7
+ export type VerifyEmailPayload = { email: string; token: string };
8
+ export type ForgotPayload = { email: string };
9
9
 
10
- type RegisterPayload = {
10
+ export type RegisterPayload = {
11
11
  name: string;
12
12
  email?: string;
13
13
  phone?: string;
@@ -15,7 +15,7 @@ type RegisterPayload = {
15
15
  password_confirmation: string;
16
16
  };
17
17
 
18
- type ResetPayload = {
18
+ export type ResetPayload = {
19
19
  email: string;
20
20
  token: string;
21
21
  password: string;
@@ -36,7 +36,10 @@ async function request<T>(method: "GET" | "POST", path: string, payload?: unknow
36
36
  return response.data;
37
37
  } catch (error: unknown) {
38
38
  if (axios.isAxiosError(error)) {
39
- throw new Error(String(error.response?.data?.message || error.message || "Request failed"));
39
+ // Keep the AxiosError so Gum can read `response.data` and populate
40
+ // form.errors, but show the API's message instead of axios's generic one.
41
+ error.message = String(error.response?.data?.message || error.message || "Request failed");
42
+ throw error;
40
43
  }
41
44
  throw new Error("Request failed");
42
45
  }
@@ -1,53 +1,64 @@
1
1
  import path from "node:path";
2
2
  import { fileURLToPath, URL } from "node:url";
3
3
  import vue from "@vitejs/plugin-vue";
4
- import { defineConfig } from "vite";
4
+ import { defineConfig, loadEnv } from "vite";
5
5
 
6
- const cacheBase = process.env.LOCALAPPDATA || process.env.TEMP || ".";
7
- const apiUrl = process.env.APP_URL || "http://localhost:3000";
8
- const socketEnabled = process.env.SOCKET !== "false";
6
+ const configDir = path.dirname(fileURLToPath(import.meta.url));
7
+ const projectRoot = path.resolve(configDir, "../..");
9
8
 
10
- const proxy: Record<string, any> = {
11
- "/api": { target: apiUrl, changeOrigin: true },
12
- "/health": { target: apiUrl, changeOrigin: true },
13
- "/storage": { target: apiUrl, changeOrigin: true }
14
- };
9
+ export default defineConfig(({ mode }) => {
10
+ // 1. Load the .env file just like the backend does. Resolve it from the
11
+ // config file so a different process cwd cannot point Vite at the wrong .env.
12
+ const env = loadEnv(mode, projectRoot, "");
15
13
 
16
- proxy["/socket.io"] = { target: apiUrl, changeOrigin: true, ws: true };
14
+ const cacheBase = process.env.LOCALAPPDATA || process.env.TEMP || ".";
15
+ const apiUrl = env.APP_URL || "http://localhost:3000";
17
16
 
18
- export default defineConfig({
19
- define: {
20
- __SOCKET_ENABLED__: socketEnabled,
21
- __API_URL__: JSON.stringify(apiUrl)
22
- },
23
- root: fileURLToPath(new URL(".", import.meta.url)),
24
- cacheDir: path.join(cacheBase, "nexwire", "vite-cache", "resources"),
25
- plugins: [vue()],
26
- css: {
27
- preprocessorOptions: {
28
- scss: {
29
- quietDeps: true,
30
- silenceDeprecations: [
31
- "import",
32
- "if-function",
33
- "global-builtin",
34
- "color-functions",
35
- "slash-div",
36
- ],
17
+ // Match the backend default: Socket.IO is off unless SOCKET=true
18
+ const socketEnabled = env.SOCKET === "true";
19
+
20
+ const proxy: Record<string, any> = {
21
+ "/api": { target: apiUrl, changeOrigin: true },
22
+ "/health": { target: apiUrl, changeOrigin: true },
23
+ "/storage": { target: apiUrl, changeOrigin: true }
24
+ };
25
+
26
+ if (socketEnabled) {
27
+ proxy["/socket.io"] = { target: apiUrl, changeOrigin: true, ws: true, timeout: 10000 };
28
+ }
29
+
30
+ return {
31
+ define: {
32
+ // 3. ALWAYS stringify the value when using Vite define
33
+ // `import.meta.env.*` is inlined into every module in dev as well as in
34
+ // the production bundle, so the UI never depends on a stale global.
35
+ "import.meta.env.VITE_SOCKET_ENABLED": JSON.stringify(socketEnabled),
36
+ __SOCKET_ENABLED__: JSON.stringify(socketEnabled),
37
+ __API_URL__: JSON.stringify(apiUrl)
38
+ },
39
+ root: fileURLToPath(new URL(".", import.meta.url)),
40
+ cacheDir: path.join(cacheBase, "nexwire", "vite-cache", "resources"),
41
+ plugins: [vue()],
42
+ css: {
43
+ preprocessorOptions: {
44
+ scss: {
45
+ quietDeps: true,
46
+ silenceDeprecations: ["import", "if-function", "global-builtin", "color-functions", "slash-div"]
47
+ }
37
48
  }
49
+ },
50
+ resolve: {
51
+ alias: {
52
+ "@": fileURLToPath(new URL("./src", import.meta.url))
53
+ }
54
+ },
55
+ build: {
56
+ outDir: "../../public",
57
+ emptyOutDir: true
58
+ },
59
+ server: {
60
+ port: 5173,
61
+ proxy // /socket.io is only proxied when SOCKET=true
38
62
  }
39
- },
40
- resolve: {
41
- alias: {
42
- "@": fileURLToPath(new URL("./src", import.meta.url))
43
- }
44
- },
45
- build: {
46
- outDir: "../../public",
47
- emptyOutDir: true
48
- },
49
- server: {
50
- port: 5173,
51
- proxy
52
- }
63
+ };
53
64
  });
File without changes
File without changes
@@ -1,26 +1,32 @@
1
- declare module "*.vue" {
2
- import type { DefineComponent } from "vue";
3
-
4
- const component: DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
5
- export default component;
6
- }
7
-
8
- declare module "bootstrap/js/dist/modal.js" {
9
- export default class Modal {
10
- constructor(element: Element, options?: { backdrop?: boolean | "static"; keyboard?: boolean });
11
- show(): void;
12
- hide(): void;
13
- dispose(): void;
14
- }
15
- }
16
-
17
- declare module "bootstrap/js/dist/toast.js" {
18
- export default class Toast {
19
- static getOrCreateInstance(element: Element): Toast;
20
- show(): void;
21
- }
22
- }
23
-
24
- declare module "luxon";
25
- declare module "nodemailer";
26
- declare module "vue-select";
1
+ declare module "*.vue" {
2
+ import type { DefineComponent } from "vue";
3
+
4
+ const component: DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>;
5
+ export default component;
6
+ }
7
+
8
+ declare module "bootstrap/js/dist/modal.js" {
9
+ export default class Modal {
10
+ constructor(element: Element, options?: { backdrop?: boolean | "static"; keyboard?: boolean });
11
+ show(): void;
12
+ hide(): void;
13
+ dispose(): void;
14
+ }
15
+ }
16
+
17
+ declare module "bootstrap/js/dist/toast.js" {
18
+ export default class Toast {
19
+ static getOrCreateInstance(element: Element): Toast;
20
+ show(): void;
21
+ }
22
+ }
23
+
24
+ declare module "luxon";
25
+ declare module "nodemailer";
26
+ declare module "vue-select";
27
+
28
+ interface ImportMetaEnv {
29
+ readonly VITE_API_URL?: string;
30
+ readonly VITE_SOCKET_URL?: string;
31
+ readonly VITE_SOCKET_ENABLED?: boolean;
32
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nexwire",
3
- "version": "4.2.5",
3
+ "version": "4.4.0",
4
4
  "type": "module",
5
5
  "description": "Scaffold a new nexwire project",
6
6
  "bin": {
@@ -10,7 +10,8 @@
10
10
  "files": [
11
11
  "src",
12
12
  "hono",
13
- "express"
13
+ "express",
14
+ "fastify"
14
15
  ],
15
16
  "scripts": {
16
17
  "prepublishOnly": "node ../../scripts/sync-template.mjs"
@@ -72,7 +73,7 @@
72
73
  "ioredis": "^5",
73
74
  "lodash-es": "^4",
74
75
  "luxon": "^3",
75
- "maildev": "^3",
76
+ "maildev": "^2.2.1",
76
77
  "mysql2": "^3",
77
78
  "nodemailer": "^10",
78
79
  "pinia": "^3",