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
+ }
@@ -0,0 +1,14 @@
1
+ node_modules
2
+ dist
3
+ .git
4
+ .gitignore
5
+
6
+ npm-debug.log*
7
+ yarn-debug.log*
8
+ yarn-error.log*
9
+ pnpm-debug.log*
10
+
11
+ coverage
12
+ *.log
13
+ tmp
14
+ temp
package/fastify/.env ADDED
@@ -0,0 +1,44 @@
1
+ # ── App ────────────────────────────────────────────
2
+ APP_NAME=nexwire
3
+ APP_ENV=development
4
+ APP_PORT=3000
5
+ APP_URL=http://localhost:3000
6
+
7
+ # Frontend origin when UI is on a different domain than the API.
8
+ # Leave empty if UI is served from the same APP_URL.
9
+ FRONTEND_URL=
10
+
11
+ # ── Database ───────────────────────────────────────
12
+ # Supported: sqlite:, mysql://, postgres://
13
+ # Default is SQLite so a fresh clone runs with zero setup (no server to install).
14
+ # The dev stack migrates + seeds automatically on first run.
15
+ # Switch later, e.g. mysql://root:@localhost:3306/nexwire
16
+ DATABASE_URL=sqlite:./src/storage/database/nexwire.sqlite
17
+
18
+ # ── Secrets ────────────────────────────────────────
19
+ JWT_ACCESS_SECRET=change-me-access
20
+ JWT_REFRESH_SECRET=change-me-refresh
21
+ COOKIE_SECRET=change-me-cookie
22
+ STORAGE_ACCESS_KEY_ID=
23
+ STORAGE_SECRET_ACCESS_KEY=
24
+ MAIL_USERNAME=
25
+ MAIL_PASSWORD=
26
+
27
+ # ── Redis ──────────────────────────────────────────
28
+ # Set true to enable cache, session, queue, events, and Queue Dashboard
29
+ REDIS=false
30
+ # Shared key prefix for cache, session, queue, events, and dashboards
31
+ REDIS_URL=redis://127.0.0.1:6379
32
+ REDIS_PREFIX=nexwire
33
+
34
+ # ── Feature Toggle ─────────────────────────────────
35
+ # Set false for API-only mode (no UI build/serve)
36
+ UI=true
37
+ # Set true to enable OpenAPI / Scalar docs at /api-docs
38
+ OPEN_API=true
39
+ # Set false to disable Socket.IO realtime server
40
+ SOCKET=false
41
+ # Set false to disable browser security headers (CSP, HSTS, X-Frame)
42
+ SECURITY_HEADERS=true
43
+
44
+
@@ -0,0 +1,42 @@
1
+ # ── App ────────────────────────────────────────────
2
+ APP_ENV=development
3
+ APP_NAME=nexwire
4
+ APP_PORT=3000
5
+ APP_URL=http://localhost:3000
6
+
7
+ # Frontend origin when UI is on a different domain than the API.
8
+ # Leave empty if UI is served from the same APP_URL.
9
+ FRONTEND_URL=
10
+
11
+ # ── Database ───────────────────────────────────────
12
+ # Supported: sqlite:, mysql://, postgres://
13
+ # Default is SQLite so a fresh clone runs with zero setup (no server to install).
14
+ # The dev stack migrates + seeds automatically on first run.
15
+ # Switch later, e.g. mysql://root:@localhost:3306/nexwire
16
+ DATABASE_URL=sqlite:./src/storage/database/nexwire.sqlite
17
+
18
+ # ── Secrets ────────────────────────────────────────
19
+ JWT_ACCESS_SECRET=change-me-access
20
+ JWT_REFRESH_SECRET=change-me-refresh
21
+ COOKIE_SECRET=change-me-cookie
22
+ STORAGE_ACCESS_KEY_ID=
23
+ STORAGE_SECRET_ACCESS_KEY=
24
+ MAIL_USERNAME=
25
+ MAIL_PASSWORD=
26
+
27
+ # ── Redis ──────────────────────────────────────────
28
+ # Set true to enable cache, session, queue, events, and Queue Dashboard
29
+ REDIS=false
30
+ # Shared key prefix for cache, session, queue, events, and dashboards
31
+ REDIS_URL=redis://127.0.0.1:6379
32
+ REDIS_PREFIX=nexwire
33
+
34
+ # ── Feature Toggle ─────────────────────────────────
35
+ # Set false for API-only mode (no UI build/serve)
36
+ UI=true
37
+ # Set true to enable OpenAPI / Scalar docs at /api-docs
38
+ OPEN_API=true
39
+ # Set false to disable Socket.IO realtime server
40
+ SOCKET=false
41
+ # Set false to disable browser security headers (CSP, HSTS, X-Frame)
42
+ SECURITY_HEADERS=true
@@ -0,0 +1,6 @@
1
+ {
2
+ "recommendations": [
3
+ "biomejs.biome",
4
+ "editorconfig.editorconfig"
5
+ ]
6
+ }