create-nexwire 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/README.md +233 -0
  2. package/express/.dockerignore +14 -0
  3. package/express/.env +44 -0
  4. package/express/.env.example +42 -0
  5. package/express/.vscode/settings.json +26 -0
  6. package/express/LICENSE +21 -0
  7. package/express/README.md +211 -0
  8. package/express/biome.json +66 -0
  9. package/express/drizzle.config.ts +25 -0
  10. package/express/gitignore-stub +24 -0
  11. package/express/package.json +108 -0
  12. package/express/public/.gitkeep +0 -0
  13. package/express/src/config/app.ts +41 -0
  14. package/express/src/config/auth.ts +12 -0
  15. package/express/src/config/cache.ts +16 -0
  16. package/express/src/config/cookie.ts +15 -0
  17. package/express/src/config/cors.ts +12 -0
  18. package/express/src/config/database.ts +29 -0
  19. package/express/src/config/index.ts +83 -0
  20. package/express/src/config/jwt.ts +19 -0
  21. package/express/src/config/logging.ts +13 -0
  22. package/express/src/config/mail.ts +24 -0
  23. package/express/src/config/openapi.ts +54 -0
  24. package/express/src/config/queue.ts +30 -0
  25. package/express/src/config/rateLimit.ts +17 -0
  26. package/express/src/config/realtime.ts +15 -0
  27. package/express/src/config/redis.ts +18 -0
  28. package/express/src/config/security.ts +44 -0
  29. package/express/src/config/session.ts +17 -0
  30. package/express/src/config/storage.ts +22 -0
  31. package/express/src/config/validate.ts +40 -0
  32. package/express/src/database/migrations/sqlite/0000_init.sql +61 -0
  33. package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +412 -0
  34. package/express/src/database/migrations/sqlite/meta/_journal.json +13 -0
  35. package/express/src/database/schema.ts +3 -0
  36. package/express/src/env.ts +76 -0
  37. package/express/src/framework/cache/cache.ts +81 -0
  38. package/express/src/framework/circuit-breaker/cb.ts +60 -0
  39. package/express/src/framework/database/connection.ts +196 -0
  40. package/express/src/framework/database/migrate-hooks.ts +87 -0
  41. package/express/src/framework/database/paginate.ts +227 -0
  42. package/express/src/framework/database/schema.ts +20 -0
  43. package/express/src/framework/database/seed.ts +139 -0
  44. package/express/src/framework/events/dispatcher.ts +49 -0
  45. package/express/src/framework/facade.ts +48 -0
  46. package/express/src/framework/http/app.ts +107 -0
  47. package/express/src/framework/http/cors.ts +7 -0
  48. package/express/src/framework/http/logger.ts +69 -0
  49. package/express/src/framework/http/metrics.ts +22 -0
  50. package/express/src/framework/http/openapi.ts +54 -0
  51. package/express/src/framework/http/ratelimiter.ts +16 -0
  52. package/express/src/framework/http/router.ts +178 -0
  53. package/express/src/framework/http/security.ts +23 -0
  54. package/express/src/framework/http/static.ts +23 -0
  55. package/express/src/framework/http/validation.ts +18 -0
  56. package/express/src/framework/kernel.ts +52 -0
  57. package/express/src/framework/maker-cli/db/core.mjs +288 -0
  58. package/express/src/framework/maker-cli/db/index.mjs +204 -0
  59. package/express/src/framework/maker-cli/deploy/core.mjs +1047 -0
  60. package/express/src/framework/maker-cli/deploy/index.mjs +91 -0
  61. package/express/src/framework/maker-cli/index.mjs +53 -0
  62. package/express/src/framework/maker-cli/middleware/core.mjs +47 -0
  63. package/express/src/framework/maker-cli/middleware/index.mjs +17 -0
  64. package/express/src/framework/maker-cli/module/core.mjs +684 -0
  65. package/express/src/framework/maker-cli/module/index.mjs +140 -0
  66. package/express/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
  67. package/express/src/framework/maker-cli/runtime/core.mjs +543 -0
  68. package/express/src/framework/maker-cli/runtime/index.mjs +104 -0
  69. package/express/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  70. package/express/src/framework/maker-cli/stubs/controller/openapi.ts.stub +47 -0
  71. package/express/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +48 -0
  72. package/express/src/framework/maker-cli/stubs/controller/plain.ts.stub +54 -0
  73. package/express/src/framework/maker-cli/stubs/controller/schema.plain.ts.stub +14 -0
  74. package/express/src/framework/maker-cli/stubs/controller/schema.ts.stub +33 -0
  75. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  76. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  77. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  78. package/express/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  79. package/express/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  80. package/express/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  81. package/express/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  82. package/express/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  83. package/express/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  84. package/express/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  85. package/express/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  86. package/express/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  87. package/express/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  88. package/express/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  89. package/express/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  90. package/express/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  91. package/express/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  92. package/express/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  93. package/express/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  94. package/express/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  95. package/express/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  96. package/express/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  97. package/express/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  98. package/express/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  99. package/express/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  100. package/express/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  101. package/express/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  102. package/express/src/framework/maker-cli/stubs/example/console.ts.stub +34 -0
  103. package/express/src/framework/maker-cli/stubs/example/controller.ts.stub +418 -0
  104. package/express/src/framework/maker-cli/stubs/example/job.ts.stub +75 -0
  105. package/express/src/framework/maker-cli/stubs/example/route.api.ts.stub +207 -0
  106. package/express/src/framework/maker-cli/stubs/example/route.plain.ts.stub +18 -0
  107. package/express/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +42 -0
  108. package/express/src/framework/maker-cli/stubs/example/schema.ts.stub +42 -0
  109. package/express/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  110. package/express/src/framework/maker-cli/stubs/middleware/name.ts.stub +14 -0
  111. package/express/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -0
  112. package/express/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -0
  113. package/express/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -0
  114. package/express/src/framework/maker-cli/stubs/notification/controller.ts.stub +77 -0
  115. package/express/src/framework/maker-cli/stubs/notification/job.ts.stub +13 -0
  116. package/express/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -0
  117. package/express/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +12 -0
  118. package/express/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  119. package/express/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  120. package/express/src/framework/maker-cli/stubs/route/api.ts.stub +80 -0
  121. package/express/src/framework/maker-cli/stubs/route/plain.ts.stub +11 -0
  122. package/express/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  123. package/express/src/framework/maker-cli/stubs/seeder/name.ts.stub +20 -0
  124. package/express/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  125. package/express/src/framework/maker-cli/utils/env-config.mjs +44 -0
  126. package/express/src/framework/maker-cli/utils/env-db.mjs +61 -0
  127. package/express/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  128. package/express/src/framework/maker-cli/utils/flags.mjs +14 -0
  129. package/express/src/framework/maker-cli/utils/help.mjs +50 -0
  130. package/express/src/framework/maker-cli/utils/naming.mjs +13 -0
  131. package/express/src/framework/maker-cli/utils/process.mjs +52 -0
  132. package/express/src/framework/modules/discover.ts +54 -0
  133. package/express/src/framework/modules/routes.ts +21 -0
  134. package/express/src/framework/notification/index.ts +116 -0
  135. package/express/src/framework/queue/clear.ts +22 -0
  136. package/express/src/framework/queue/queue.ts +342 -0
  137. package/express/src/framework/queue/ui.ts +187 -0
  138. package/express/src/framework/queue/worker.ts +61 -0
  139. package/express/src/framework/realtime/broadcast.ts +46 -0
  140. package/express/src/framework/realtime/index.ts +2 -0
  141. package/express/src/framework/realtime/socket-cookie.ts +71 -0
  142. package/express/src/framework/realtime/socket.ts +119 -0
  143. package/express/src/framework/realtime/types.ts +6 -0
  144. package/express/src/framework/realtime/ui.ts +16 -0
  145. package/express/src/framework/redis/client.ts +151 -0
  146. package/express/src/framework/runtime/runtime.ts +23 -0
  147. package/express/src/framework/runtime/server-adapter.ts +34 -0
  148. package/express/src/framework/scheduler/lock.ts +116 -0
  149. package/express/src/framework/scheduler/run.ts +48 -0
  150. package/express/src/framework/scheduler/scheduler.ts +155 -0
  151. package/express/src/framework/server.ts +177 -0
  152. package/express/src/framework/session/session.ts +98 -0
  153. package/express/src/framework/storage/storage.ts +785 -0
  154. package/express/src/framework/support/cookie.ts +62 -0
  155. package/express/src/framework/support/jwt.ts +33 -0
  156. package/express/src/framework/support/lifecycle.ts +35 -0
  157. package/express/src/framework/support/logger.ts +148 -0
  158. package/express/src/framework/support/mail.ts +48 -0
  159. package/express/src/framework/support/password.ts +23 -0
  160. package/express/src/framework/support/upload.ts +160 -0
  161. package/express/src/framework/support/url.ts +41 -0
  162. package/express/src/middlewares/auth-middleware.ts +98 -0
  163. package/express/src/middlewares/role-middleware.ts +25 -0
  164. package/express/src/modules/auth/controllers/auth.controller.ts +358 -0
  165. package/express/src/modules/auth/controllers/auth.helpers.ts +104 -0
  166. package/express/src/modules/auth/controllers/auth.schema.ts +102 -0
  167. package/express/src/modules/auth/controllers/role.controller.ts +15 -0
  168. package/express/src/modules/auth/database/models/notifications.ts +24 -0
  169. package/express/src/modules/auth/database/models/role.ts +14 -0
  170. package/express/src/modules/auth/database/models/user.ts +46 -0
  171. package/express/src/modules/auth/database/seeders/role.ts +18 -0
  172. package/express/src/modules/auth/database/seeders/user.ts +35 -0
  173. package/express/src/modules/auth/jobs/forgetpass.ts +20 -0
  174. package/express/src/modules/auth/jobs/registeruser.ts +23 -0
  175. package/express/src/modules/auth/jobs/verifyemail.ts +18 -0
  176. package/express/src/modules/auth/routes/api.ts +150 -0
  177. package/express/src/modules/auth/routes/role.ts +33 -0
  178. package/express/src/resources/index.html +17 -0
  179. package/express/src/resources/src/App.vue +5 -0
  180. package/express/src/resources/src/assets/css/styles.css +14761 -0
  181. package/express/src/resources/src/assets/css/styles.css.map +1 -0
  182. package/express/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  183. package/express/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  184. package/express/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  185. package/express/src/resources/src/assets/images/logo.png +0 -0
  186. package/express/src/resources/src/assets/scss/custom.css +217 -0
  187. package/express/src/resources/src/assets/scss/custom.css.map +1 -0
  188. package/express/src/resources/src/assets/scss/custom.scss +1346 -0
  189. package/express/src/resources/src/components/Button.vue +32 -0
  190. package/express/src/resources/src/components/Checkbox.vue +29 -0
  191. package/express/src/resources/src/components/Datepicker.vue +106 -0
  192. package/express/src/resources/src/components/FeatureButton.vue +53 -0
  193. package/express/src/resources/src/components/FloatButton.vue +33 -0
  194. package/express/src/resources/src/components/Href.vue +32 -0
  195. package/express/src/resources/src/components/Input.vue +223 -0
  196. package/express/src/resources/src/components/InputGroup.vue +145 -0
  197. package/express/src/resources/src/components/InputPasswordToggle.vue +213 -0
  198. package/express/src/resources/src/components/Modal.vue +55 -0
  199. package/express/src/resources/src/components/Pagebar.vue +26 -0
  200. package/express/src/resources/src/components/Select.vue +384 -0
  201. package/express/src/resources/src/components/Spinner.vue +42 -0
  202. package/express/src/resources/src/components/Switch.vue +65 -0
  203. package/express/src/resources/src/components/TextArea.vue +117 -0
  204. package/express/src/resources/src/components/Toast.vue +56 -0
  205. package/express/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  206. package/express/src/resources/src/components/datatable/Pagination.vue +147 -0
  207. package/express/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  208. package/express/src/resources/src/components/datatable/index.vue +199 -0
  209. package/express/src/resources/src/composables/useAuth.ts +52 -0
  210. package/express/src/resources/src/helpers/nformatter.ts +10 -0
  211. package/express/src/resources/src/helpers/utils.ts +75 -0
  212. package/express/src/resources/src/layouts/AuthLayout.vue +20 -0
  213. package/express/src/resources/src/layouts/Layout/Footer.vue +23 -0
  214. package/express/src/resources/src/layouts/Layout/Header.vue +105 -0
  215. package/express/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  216. package/express/src/resources/src/layouts/Layout/index.vue +87 -0
  217. package/express/src/resources/src/main.ts +26 -0
  218. package/express/src/resources/src/pages/auth/forgetPassword.vue +82 -0
  219. package/express/src/resources/src/pages/auth/login.vue +99 -0
  220. package/express/src/resources/src/pages/auth/register.vue +133 -0
  221. package/express/src/resources/src/pages/auth/resetPassword.vue +118 -0
  222. package/express/src/resources/src/pages/auth/verifyEmail.vue +68 -0
  223. package/express/src/resources/src/pages/dashboard/index.vue +66 -0
  224. package/express/src/resources/src/plugins/axios.ts +31 -0
  225. package/express/src/resources/src/plugins/browserDetect.ts +55 -0
  226. package/express/src/resources/src/plugins/dialog.ts +216 -0
  227. package/express/src/resources/src/plugins/gum.ts +367 -0
  228. package/express/src/resources/src/plugins/pulse.ts +147 -0
  229. package/express/src/resources/src/plugins/routeProgress.ts +87 -0
  230. package/express/src/resources/src/router/index.ts +85 -0
  231. package/express/src/resources/src/stores/admin-ui.ts +148 -0
  232. package/express/src/resources/src/stores/auth.ts +164 -0
  233. package/express/src/resources/tsconfig.json +19 -0
  234. package/express/src/resources/vite.config.ts +46 -0
  235. package/express/src/storage/app/private/.gitkeep +0 -0
  236. package/express/src/storage/app/public/.gitkeep +0 -0
  237. package/express/src/storage/app/tmp/generated/.gitkeep +0 -0
  238. package/express/src/storage/database/nexwire.sqlite +0 -0
  239. package/express/src/storage/logs/.gitkeep +0 -0
  240. package/express/src/storage/tmp/.gitkeep +0 -0
  241. package/express/src/storage/trash/modules/.gitkeep +0 -0
  242. package/express/src/types/global.d.ts +26 -0
  243. package/express/tsconfig.json +19 -0
  244. package/express/vitest.config.ts +23 -0
  245. package/hono/.dockerignore +14 -0
  246. package/hono/.env +44 -0
  247. package/hono/.env.example +42 -0
  248. package/hono/.vscode/settings.json +26 -0
  249. package/hono/LICENSE +21 -0
  250. package/hono/README.md +211 -0
  251. package/hono/biome.json +76 -0
  252. package/hono/drizzle.config.ts +25 -0
  253. package/hono/gitignore-stub +24 -0
  254. package/hono/package.json +99 -0
  255. package/hono/public/.gitkeep +0 -0
  256. package/hono/src/config/app.ts +41 -0
  257. package/hono/src/config/auth.ts +12 -0
  258. package/hono/src/config/cache.ts +16 -0
  259. package/hono/src/config/cookie.ts +15 -0
  260. package/hono/src/config/cors.ts +12 -0
  261. package/hono/src/config/database.ts +29 -0
  262. package/hono/src/config/index.ts +83 -0
  263. package/hono/src/config/jwt.ts +19 -0
  264. package/hono/src/config/logging.ts +13 -0
  265. package/hono/src/config/mail.ts +24 -0
  266. package/hono/src/config/openapi.ts +54 -0
  267. package/hono/src/config/queue.ts +30 -0
  268. package/hono/src/config/rateLimit.ts +17 -0
  269. package/hono/src/config/realtime.ts +15 -0
  270. package/hono/src/config/redis.ts +18 -0
  271. package/hono/src/config/security.ts +44 -0
  272. package/hono/src/config/session.ts +17 -0
  273. package/hono/src/config/storage.ts +22 -0
  274. package/hono/src/config/validate.ts +40 -0
  275. package/hono/src/database/migrations/sqlite/0000_init.sql +61 -0
  276. package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +412 -0
  277. package/hono/src/database/migrations/sqlite/meta/_journal.json +13 -0
  278. package/hono/src/database/schema.ts +3 -0
  279. package/hono/src/env.ts +76 -0
  280. package/hono/src/framework/cache/cache.ts +81 -0
  281. package/hono/src/framework/circuit-breaker/cb.ts +60 -0
  282. package/hono/src/framework/database/connection.ts +196 -0
  283. package/hono/src/framework/database/migrate-hooks.ts +87 -0
  284. package/hono/src/framework/database/paginate.ts +253 -0
  285. package/hono/src/framework/database/schema.ts +20 -0
  286. package/hono/src/framework/database/seed.ts +139 -0
  287. package/hono/src/framework/events/dispatcher.ts +49 -0
  288. package/hono/src/framework/facade.ts +29 -0
  289. package/hono/src/framework/http/app.ts +109 -0
  290. package/hono/src/framework/http/cors.ts +19 -0
  291. package/hono/src/framework/http/logger.ts +81 -0
  292. package/hono/src/framework/http/metrics.ts +22 -0
  293. package/hono/src/framework/http/openapi.ts +42 -0
  294. package/hono/src/framework/http/ratelimiter.ts +172 -0
  295. package/hono/src/framework/http/router.ts +76 -0
  296. package/hono/src/framework/http/security.ts +23 -0
  297. package/hono/src/framework/http/static.ts +70 -0
  298. package/hono/src/framework/http/validation.ts +21 -0
  299. package/hono/src/framework/kernel.ts +48 -0
  300. package/hono/src/framework/maker-cli/db/core.mjs +288 -0
  301. package/hono/src/framework/maker-cli/db/index.mjs +204 -0
  302. package/hono/src/framework/maker-cli/deploy/core.mjs +1038 -0
  303. package/hono/src/framework/maker-cli/deploy/index.mjs +91 -0
  304. package/hono/src/framework/maker-cli/index.mjs +53 -0
  305. package/hono/src/framework/maker-cli/middleware/core.mjs +47 -0
  306. package/hono/src/framework/maker-cli/middleware/index.mjs +12 -0
  307. package/hono/src/framework/maker-cli/module/core.mjs +684 -0
  308. package/hono/src/framework/maker-cli/module/index.mjs +140 -0
  309. package/hono/src/framework/maker-cli/runtime/build-ui.mjs +17 -0
  310. package/hono/src/framework/maker-cli/runtime/core.mjs +543 -0
  311. package/hono/src/framework/maker-cli/runtime/index.mjs +104 -0
  312. package/hono/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
  313. package/hono/src/framework/maker-cli/stubs/controller/openapi.ts.stub +57 -0
  314. package/hono/src/framework/maker-cli/stubs/controller/openapi.with-model.ts.stub +58 -0
  315. package/hono/src/framework/maker-cli/stubs/controller/plain.ts.stub +59 -0
  316. package/hono/src/framework/maker-cli/stubs/controller/schema.plain.ts.stub +14 -0
  317. package/hono/src/framework/maker-cli/stubs/controller/schema.ts.stub +33 -0
  318. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
  319. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
  320. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
  321. package/hono/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
  322. package/hono/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
  323. package/hono/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
  324. package/hono/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
  325. package/hono/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
  326. package/hono/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
  327. package/hono/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
  328. package/hono/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
  329. package/hono/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
  330. package/hono/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
  331. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
  332. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
  333. package/hono/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
  334. package/hono/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
  335. package/hono/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
  336. package/hono/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
  337. package/hono/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
  338. package/hono/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
  339. package/hono/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
  340. package/hono/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
  341. package/hono/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
  342. package/hono/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
  343. package/hono/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
  344. package/hono/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
  345. package/hono/src/framework/maker-cli/stubs/example/console.ts.stub +34 -0
  346. package/hono/src/framework/maker-cli/stubs/example/controller.ts.stub +505 -0
  347. package/hono/src/framework/maker-cli/stubs/example/job.ts.stub +75 -0
  348. package/hono/src/framework/maker-cli/stubs/example/route.api.ts.stub +207 -0
  349. package/hono/src/framework/maker-cli/stubs/example/route.plain.ts.stub +18 -0
  350. package/hono/src/framework/maker-cli/stubs/example/schema.plain.ts.stub +42 -0
  351. package/hono/src/framework/maker-cli/stubs/example/schema.ts.stub +42 -0
  352. package/hono/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
  353. package/hono/src/framework/maker-cli/stubs/middleware/name.ts.stub +14 -0
  354. package/hono/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +9 -0
  355. package/hono/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +9 -0
  356. package/hono/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +9 -0
  357. package/hono/src/framework/maker-cli/stubs/notification/controller.ts.stub +86 -0
  358. package/hono/src/framework/maker-cli/stubs/notification/job.ts.stub +13 -0
  359. package/hono/src/framework/maker-cli/stubs/notification/route.api.ts.stub +50 -0
  360. package/hono/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +12 -0
  361. package/hono/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
  362. package/hono/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
  363. package/hono/src/framework/maker-cli/stubs/route/api.ts.stub +80 -0
  364. package/hono/src/framework/maker-cli/stubs/route/plain.ts.stub +11 -0
  365. package/hono/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
  366. package/hono/src/framework/maker-cli/stubs/seeder/name.ts.stub +20 -0
  367. package/hono/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
  368. package/hono/src/framework/maker-cli/utils/env-config.mjs +44 -0
  369. package/hono/src/framework/maker-cli/utils/env-db.mjs +61 -0
  370. package/hono/src/framework/maker-cli/utils/file-ops.mjs +30 -0
  371. package/hono/src/framework/maker-cli/utils/flags.mjs +14 -0
  372. package/hono/src/framework/maker-cli/utils/help.mjs +50 -0
  373. package/hono/src/framework/maker-cli/utils/naming.mjs +13 -0
  374. package/hono/src/framework/maker-cli/utils/process.mjs +52 -0
  375. package/hono/src/framework/modules/discover.ts +54 -0
  376. package/hono/src/framework/modules/routes.ts +24 -0
  377. package/hono/src/framework/notification/index.ts +116 -0
  378. package/hono/src/framework/queue/clear.ts +22 -0
  379. package/hono/src/framework/queue/queue.ts +342 -0
  380. package/hono/src/framework/queue/ui.ts +214 -0
  381. package/hono/src/framework/queue/worker.ts +61 -0
  382. package/hono/src/framework/realtime/broadcast.ts +46 -0
  383. package/hono/src/framework/realtime/index.ts +2 -0
  384. package/hono/src/framework/realtime/socket-cookie.ts +68 -0
  385. package/hono/src/framework/realtime/socket.ts +196 -0
  386. package/hono/src/framework/realtime/types.ts +6 -0
  387. package/hono/src/framework/realtime/ui.ts +16 -0
  388. package/hono/src/framework/redis/client.ts +151 -0
  389. package/hono/src/framework/runtime/runtime.ts +23 -0
  390. package/hono/src/framework/runtime/server-adapter.ts +94 -0
  391. package/hono/src/framework/scheduler/lock.ts +116 -0
  392. package/hono/src/framework/scheduler/run.ts +48 -0
  393. package/hono/src/framework/scheduler/scheduler.ts +155 -0
  394. package/hono/src/framework/server.ts +183 -0
  395. package/hono/src/framework/session/session.ts +116 -0
  396. package/hono/src/framework/storage/storage.ts +785 -0
  397. package/hono/src/framework/support/cookie.ts +99 -0
  398. package/hono/src/framework/support/jwt.ts +45 -0
  399. package/hono/src/framework/support/lifecycle.ts +35 -0
  400. package/hono/src/framework/support/logger.ts +148 -0
  401. package/hono/src/framework/support/mail.ts +48 -0
  402. package/hono/src/framework/support/password.ts +23 -0
  403. package/hono/src/framework/support/url.ts +41 -0
  404. package/hono/src/middlewares/auth-middleware.ts +98 -0
  405. package/hono/src/middlewares/role-middleware.ts +25 -0
  406. package/hono/src/modules/auth/controllers/auth.controller.ts +413 -0
  407. package/hono/src/modules/auth/controllers/auth.helpers.ts +128 -0
  408. package/hono/src/modules/auth/controllers/auth.schema.ts +102 -0
  409. package/hono/src/modules/auth/controllers/role.controller.ts +25 -0
  410. package/hono/src/modules/auth/database/models/notifications.ts +24 -0
  411. package/hono/src/modules/auth/database/models/role.ts +14 -0
  412. package/hono/src/modules/auth/database/models/user.ts +46 -0
  413. package/hono/src/modules/auth/database/seeders/role.ts +18 -0
  414. package/hono/src/modules/auth/database/seeders/user.ts +35 -0
  415. package/hono/src/modules/auth/jobs/forgetpass.ts +20 -0
  416. package/hono/src/modules/auth/jobs/registeruser.ts +23 -0
  417. package/hono/src/modules/auth/jobs/verifyemail.ts +18 -0
  418. package/hono/src/modules/auth/routes/api.ts +150 -0
  419. package/hono/src/modules/auth/routes/role.ts +33 -0
  420. package/hono/src/resources/index.html +17 -0
  421. package/hono/src/resources/src/App.vue +5 -0
  422. package/hono/src/resources/src/assets/css/styles.css +14913 -0
  423. package/hono/src/resources/src/assets/css/styles.css.map +1 -0
  424. package/hono/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
  425. package/hono/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
  426. package/hono/src/resources/src/assets/images/favicon/favicon.ico +0 -0
  427. package/hono/src/resources/src/assets/images/logo.png +0 -0
  428. package/hono/src/resources/src/assets/scss/custom.css +217 -0
  429. package/hono/src/resources/src/assets/scss/custom.css.map +1 -0
  430. package/hono/src/resources/src/assets/scss/custom.scss +1346 -0
  431. package/hono/src/resources/src/components/Button.vue +32 -0
  432. package/hono/src/resources/src/components/Checkbox.vue +29 -0
  433. package/hono/src/resources/src/components/Datepicker.vue +106 -0
  434. package/hono/src/resources/src/components/FeatureButton.vue +53 -0
  435. package/hono/src/resources/src/components/FloatButton.vue +33 -0
  436. package/hono/src/resources/src/components/Href.vue +32 -0
  437. package/hono/src/resources/src/components/Input.vue +234 -0
  438. package/hono/src/resources/src/components/InputGroup.vue +149 -0
  439. package/hono/src/resources/src/components/InputPasswordToggle.vue +222 -0
  440. package/hono/src/resources/src/components/Modal.vue +55 -0
  441. package/hono/src/resources/src/components/Pagebar.vue +26 -0
  442. package/hono/src/resources/src/components/Select.vue +415 -0
  443. package/hono/src/resources/src/components/Spinner.vue +42 -0
  444. package/hono/src/resources/src/components/Switch.vue +65 -0
  445. package/hono/src/resources/src/components/TextArea.vue +121 -0
  446. package/hono/src/resources/src/components/Toast.vue +56 -0
  447. package/hono/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
  448. package/hono/src/resources/src/components/datatable/Pagination.vue +147 -0
  449. package/hono/src/resources/src/components/datatable/SelectOpption.vue +64 -0
  450. package/hono/src/resources/src/components/datatable/index.vue +199 -0
  451. package/hono/src/resources/src/composables/useAuth.ts +52 -0
  452. package/hono/src/resources/src/helpers/nformatter.ts +10 -0
  453. package/hono/src/resources/src/helpers/utils.ts +75 -0
  454. package/hono/src/resources/src/layouts/AuthLayout.vue +20 -0
  455. package/hono/src/resources/src/layouts/Layout/Footer.vue +23 -0
  456. package/hono/src/resources/src/layouts/Layout/Header.vue +105 -0
  457. package/hono/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
  458. package/hono/src/resources/src/layouts/Layout/index.vue +87 -0
  459. package/hono/src/resources/src/main.ts +26 -0
  460. package/hono/src/resources/src/pages/auth/forgetPassword.vue +82 -0
  461. package/hono/src/resources/src/pages/auth/login.vue +99 -0
  462. package/hono/src/resources/src/pages/auth/register.vue +133 -0
  463. package/hono/src/resources/src/pages/auth/resetPassword.vue +118 -0
  464. package/hono/src/resources/src/pages/auth/verifyEmail.vue +68 -0
  465. package/hono/src/resources/src/pages/dashboard/index.vue +66 -0
  466. package/hono/src/resources/src/plugins/axios.ts +31 -0
  467. package/hono/src/resources/src/plugins/browserDetect.ts +55 -0
  468. package/hono/src/resources/src/plugins/dialog.ts +216 -0
  469. package/hono/src/resources/src/plugins/gum.ts +367 -0
  470. package/hono/src/resources/src/plugins/pulse.ts +147 -0
  471. package/hono/src/resources/src/plugins/routeProgress.ts +87 -0
  472. package/hono/src/resources/src/router/index.ts +85 -0
  473. package/hono/src/resources/src/stores/admin-ui.ts +148 -0
  474. package/hono/src/resources/src/stores/auth.ts +164 -0
  475. package/hono/src/resources/tsconfig.json +19 -0
  476. package/hono/src/resources/vite.config.ts +46 -0
  477. package/hono/src/storage/app/private/.gitkeep +0 -0
  478. package/hono/src/storage/app/public/.gitkeep +0 -0
  479. package/hono/src/storage/app/tmp/generated/.gitkeep +0 -0
  480. package/hono/src/storage/database/nexwire.sqlite +0 -0
  481. package/hono/src/storage/logs/.gitkeep +0 -0
  482. package/hono/src/storage/tmp/.gitkeep +0 -0
  483. package/hono/src/storage/trash/modules/.gitkeep +0 -0
  484. package/hono/src/types/global.d.ts +26 -0
  485. package/hono/tsconfig.json +20 -0
  486. package/hono/vitest.config.ts +23 -0
  487. package/package.json +238 -0
  488. package/src/index.js +204 -0
@@ -0,0 +1,25 @@
1
+ import { config } from "dotenv";
2
+ import { defineConfig } from "drizzle-kit";
3
+
4
+ config({ path: ".env" });
5
+
6
+ function sqlitePathFromUrl(url: string) {
7
+ if (url.startsWith("sqlite:///")) return url.replace("sqlite:///", "");
8
+ if (url.startsWith("sqlite://")) return url.replace("sqlite://", "");
9
+ if (url.startsWith("sqlite:")) return url.replace("sqlite:", "");
10
+ return url;
11
+ }
12
+
13
+ const databaseUrl = process.env.DATABASE_URL || "sqlite:./src/storage/database/nexwire.sqlite";
14
+ const dialect = databaseUrl.startsWith("mysql") ? "mysql" : databaseUrl.startsWith("postgres") ? "postgresql" : "sqlite";
15
+
16
+ export default defineConfig({
17
+ schema: process.env.DRIZZLE_SCHEMA || "./src/database/schema.ts",
18
+ out: `./src/database/migrations/${dialect}`,
19
+ dialect,
20
+ dbCredentials: databaseUrl.startsWith("mysql")
21
+ ? { url: databaseUrl }
22
+ : databaseUrl.startsWith("postgres")
23
+ ? { url: databaseUrl }
24
+ : { url: `file:${sqlitePathFromUrl(databaseUrl)}` }
25
+ });
@@ -0,0 +1,24 @@
1
+ .env
2
+ node_modules/
3
+ dist/
4
+
5
+ public/*
6
+ !public/.gitkeep
7
+
8
+ deploy/.env
9
+ deploy/server/.env
10
+
11
+ *.log
12
+ npm-debug.log*
13
+ yarn-debug.log*
14
+ yarn-error.log*
15
+ pnpm-debug.log*
16
+
17
+ .DS_Store
18
+ Thumbs.db
19
+
20
+ # Lock files — regenerated per developer's package manager
21
+ bun.lock
22
+ package-lock.json
23
+ pnpm-lock.yaml
24
+ yarn.lock
@@ -0,0 +1,108 @@
1
+ {
2
+ "name": "nexwire-express",
3
+ "private": true,
4
+ "type": "module",
5
+ "version": "1.0.0",
6
+ "bin": {
7
+ "maker": "./src/framework/maker-cli/index.mjs"
8
+ },
9
+ "scripts": {
10
+ "build": "npm run build:all",
11
+ "build:all": "npm run build:backend && npm run build:ui",
12
+ "build:backend": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
13
+ "build:ui": "node src/framework/maker-cli/runtime/build-ui.mjs",
14
+ "dev": "node src/framework/maker-cli/index.mjs dev",
15
+ "backend": "node src/framework/maker-cli/index.mjs serve --src",
16
+ "ui": "node src/framework/maker-cli/index.mjs ui:dev",
17
+ "maildev:view": "node src/framework/maker-cli/index.mjs maildev:view",
18
+ "redis:view": "node src/framework/maker-cli/index.mjs redis:view",
19
+ "db:studio": "node src/framework/maker-cli/index.mjs db:studio",
20
+ "maker": "node src/framework/maker-cli/index.mjs",
21
+ "lint": "biome check .",
22
+ "lint:fix": "biome check --write .",
23
+ "format": "biome format --write .",
24
+ "format:check": "biome format .",
25
+ "test": "vitest",
26
+ "test:run": "vitest run",
27
+ "test:ui": "vitest --ui",
28
+ "test:coverage": "vitest --coverage"
29
+ },
30
+ "dependencies": {
31
+ "@asteasolutions/zod-to-openapi": "^8.1.0",
32
+ "@aws-sdk/client-s3": "^3.1111.0",
33
+ "@aws-sdk/s3-request-presigner": "^3.1111.0",
34
+ "@bull-board/api": "^9.10.1",
35
+ "@bull-board/express": "^9.10.1",
36
+ "@libsql/client": "^0.17.4",
37
+ "@scalar/express-api-reference": "^0.10.19",
38
+ "@socket.io/admin-ui": "^0.5.1",
39
+ "@socket.io/redis-adapter": "^8.3.0",
40
+ "@types/multer": "^2.2.0",
41
+ "@vitejs/plugin-vue": "^6.0.8",
42
+ "@vuepic/vue-datepicker": "^14.0.0",
43
+ "@vueuse/core": "^14.4.0",
44
+ "@vueuse/head": "^2.0.0",
45
+ "axios": "^1.19.0",
46
+ "bcryptjs": "^3.0.3",
47
+ "bootstrap": "^5.3.8",
48
+ "bootstrap-icons": "^1.13.1",
49
+ "bullmq": "^5.81.3",
50
+ "bullmq-durable": "^0.2.0",
51
+ "chalk": "^5.6.2",
52
+ "commander": "^14.0.3",
53
+ "cookie-parser": "^1.4.7",
54
+ "cors": "^2.8.5",
55
+ "croner": "^10.0.1",
56
+ "dotenv": "^17.4.2",
57
+ "dotenv-expand": "^13.0.0",
58
+ "drizzle-orm": "^0.45.2",
59
+ "express": "^5.2.1",
60
+ "express-rate-limit": "^8.7.0",
61
+ "glob": "^13.0.6",
62
+ "http-errors": "^2.0.1",
63
+ "ioredis": "^5.11.1",
64
+ "jsonwebtoken": "^9.0.2",
65
+ "lodash-es": "^4.18.1",
66
+ "luxon": "^3.7.2",
67
+ "maildev": "^2.2.1",
68
+ "morgan": "^1.10.0",
69
+ "multer": "^2.4.0",
70
+ "mysql2": "^3.23.3",
71
+ "nodemailer": "^9.0.5",
72
+ "pinia": "^3.0.4",
73
+ "pino": "^10.3.1",
74
+ "postgres": "^3.4.9",
75
+ "redis-commander": "^0.9.0",
76
+ "sass-embedded": "^1.100.0",
77
+ "socket.io": "^4.8.3",
78
+ "socket.io-client": "^4.8.3",
79
+ "vite": "^8.2.1",
80
+ "vue": "^3.5.41",
81
+ "vue-router": "^5.2.0",
82
+ "vue-select": "^4.0.0-beta.6",
83
+ "zod": "^4.4.3"
84
+ },
85
+ "devDependencies": {
86
+ "@biomejs/biome": "^2.5.7",
87
+ "@types/bootstrap": "^5.2.11",
88
+ "@types/cookie-parser": "^1.4.7",
89
+ "@types/cors": "^2.8.17",
90
+ "@types/express": "^5.0.6",
91
+ "@types/jsonwebtoken": "^9.0.7",
92
+ "@types/lodash-es": "^4.17.12",
93
+ "@types/morgan": "^1.9.9",
94
+ "@types/node": "^25.9.5",
95
+ "@vitest/coverage-v8": "^4.1.10",
96
+ "drizzle-kit": "^0.31.10",
97
+ "tsc-alias": "^1.9.2",
98
+ "tsx": "^4.23.12",
99
+ "typescript": "^6.0.3",
100
+ "vitest": "^4.1.10"
101
+ },
102
+ "engines": {
103
+ "node": ">=22.12.0",
104
+ "bun": ">=1.3",
105
+ "pnpm": ">=11",
106
+ "yarn": ">=4"
107
+ }
108
+ }
File without changes
@@ -0,0 +1,41 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: Central, code-visible application identity and runtime settings.
5
+ * When: Server boot, route metadata, OpenAPI titles, and URL resolution.
6
+ * Where: src/config/app.ts.
7
+ * How: App-related values intentionally stay in .env so each deployment can
8
+ * set them without touching code. Feature toggles (openApi, ui)
9
+ * are plain literals you can flip here.
10
+ */
11
+ export const appConfig = {
12
+ name: env.APP_NAME,
13
+ environment: env.APP_ENV,
14
+ port: env.APP_PORT,
15
+ url: env.APP_URL,
16
+ /**
17
+ * frontendUrl
18
+ * Why: Tells the API where the SPA/UI lives when it is NOT served from
19
+ * the API's own origin.
20
+ * When: Only set this when the UI runs on a different domain or port
21
+ * than the API. Leave empty when the API serves the built SPA itself.
22
+ * How: Socket.IO adds it to the allowed CORS origins, and auth/session
23
+ * cookies switch to SameSite=None + Secure when this origin differs
24
+ * from appConfig.url (cross-site cookie handling).
25
+ */
26
+ frontendUrl: env.FRONTEND_URL,
27
+ openApiEnabled: env.OPEN_API,
28
+ /**
29
+ * uiEnabled
30
+ * Why: API-only switch. When false the API never serves the UI build:
31
+ * the public dir is not prepared and the `/*` static + SPA-index
32
+ * middlewares are not mounted — use this for pure API deployments.
33
+ * When: Set UI=false in .env for API-only mode; keep true when the API
34
+ * should serve the built SPA.
35
+ * How: kernel.ts gates ensurePublicDir() and the static/SPA middlewares;
36
+ * server.ts logs the enabled/disabled status.
37
+ */
38
+ uiEnabled: env.UI
39
+ };
40
+
41
+ export type AppConfig = typeof appConfig;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Why: Account/authentication policy settings.
3
+ * When: Register, login, and email verification flows.
4
+ * Where: src/config/auth.ts.
5
+ * How: Plain literals. `requireEmailVerification` adds a verify-email step
6
+ * before a new account can log in.
7
+ */
8
+ export const authConfig = {
9
+ requireEmailVerification: false
10
+ };
11
+
12
+ export type AuthConfig = typeof authConfig;
@@ -0,0 +1,16 @@
1
+ import { redisConfig } from "./redis.js";
2
+
3
+ /**
4
+ * Why: Redis cache TTL defaults and key namespace.
5
+ * When: Cache helpers store values with an implicit expiry.
6
+ * Where: src/config/cache.ts.
7
+ * How: `ttlSeconds` is a plain literal; `keyPrefix` is derived from the
8
+ * shared `REDIS_PREFIX` so cache keys stay in one namespace
9
+ * (`nexwire:cache:*` by default).
10
+ */
11
+ export const cacheConfig = {
12
+ ttlSeconds: 3600,
13
+ keyPrefix: `${redisConfig.prefix}:cache`
14
+ };
15
+
16
+ export type CacheConfig = typeof cacheConfig;
@@ -0,0 +1,15 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: Auth/session cookie naming and signing.
5
+ * When: Setting, reading, and clearing signed auth cookies.
6
+ * Where: src/config/cookie.ts.
7
+ * How: `name` is a plain literal you can change here. `secret` is
8
+ * confidential and stays in .env (`COOKIE_SECRET`).
9
+ */
10
+ export const cookieConfig = {
11
+ name: "nexwire",
12
+ secret: env.COOKIE_SECRET
13
+ };
14
+
15
+ export type CookieConfig = typeof cookieConfig;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Why: CORS policy for the HTTP server.
3
+ * When: Global CORS middleware processes cross-origin requests.
4
+ * Where: src/config/cors.ts.
5
+ * How: `origin` accepts `"*"` for any origin or a comma-separated allow-list.
6
+ * `"*"` reflects the request origin (required for credentialed requests).
7
+ */
8
+ export const corsConfig = {
9
+ origin: "*"
10
+ };
11
+
12
+ export type CorsConfig = typeof corsConfig;
@@ -0,0 +1,29 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: Database connection settings for Drizzle.
5
+ * When: Database bootstrap and dialect detection.
6
+ * Where: src/config/database.ts.
7
+ * How: The connection URL contains credentials, so it stays in .env
8
+ * (`DATABASE_URL`). Dialect is derived from the URL prefix.
9
+ */
10
+ export const databaseConfig = {
11
+ url: env.DATABASE_URL
12
+ };
13
+
14
+ export type DatabaseConfig = typeof databaseConfig;
15
+
16
+ /**
17
+ * Why: Maps a connection URL to its Drizzle dialect.
18
+ * When: Selecting the pool driver and dialect-specific branching.
19
+ * Where: Framework database connection helpers.
20
+ * How: Matches the URL prefix; anything that isn't mysql/postgres is sqlite.
21
+ */
22
+ export function detectDialectFrom(url: string): "sqlite" | "mysql" | "postgresql" {
23
+ const value = url.toLowerCase();
24
+ if (value.startsWith("mysql")) return "mysql";
25
+ if (value.startsWith("postgres")) return "postgresql";
26
+ return "sqlite";
27
+ }
28
+
29
+ export const databaseDialect = detectDialectFrom(databaseConfig.url);
@@ -0,0 +1,83 @@
1
+ import { type AppConfig, appConfig } from "./app.js";
2
+ import { type AuthConfig, authConfig } from "./auth.js";
3
+ import { type CacheConfig, cacheConfig } from "./cache.js";
4
+ import { type CookieConfig, cookieConfig } from "./cookie.js";
5
+ import { type CorsConfig, corsConfig } from "./cors.js";
6
+ import { type DatabaseConfig, databaseConfig } from "./database.js";
7
+ import { type JwtConfig, jwtConfig } from "./jwt.js";
8
+ import { type LoggingConfig, loggingConfig } from "./logging.js";
9
+ import { type MailConfig, mailConfig } from "./mail.js";
10
+ import { type OpenApiConfig, openApiConfig } from "./openapi.js";
11
+ import { type QueueConfig, queueConfig } from "./queue.js";
12
+ import { type RateLimitConfig, rateLimitConfig } from "./rateLimit.js";
13
+ import { type RealtimeConfig, realtimeConfig } from "./realtime.js";
14
+ import { type RedisConfig, redisConfig } from "./redis.js";
15
+ import { type SecurityConfig, securityConfig } from "./security.js";
16
+ import { type SessionConfig, sessionConfig } from "./session.js";
17
+ import { type StorageConfig, storageConfig } from "./storage.js";
18
+
19
+ export { appConfig } from "./app.js";
20
+ export { authConfig } from "./auth.js";
21
+ export { cacheConfig } from "./cache.js";
22
+ export { cookieConfig } from "./cookie.js";
23
+ export { corsConfig } from "./cors.js";
24
+ export { databaseConfig } from "./database.js";
25
+ export { jwtConfig } from "./jwt.js";
26
+ export { loggingConfig } from "./logging.js";
27
+ export { mailConfig } from "./mail.js";
28
+ export { openApiConfig } from "./openapi.js";
29
+ export { queueConfig } from "./queue.js";
30
+ export { rateLimitConfig } from "./rateLimit.js";
31
+ export { realtimeConfig } from "./realtime.js";
32
+ export { redisConfig } from "./redis.js";
33
+ export { securityConfig } from "./security.js";
34
+ export { sessionConfig } from "./session.js";
35
+ export { storageConfig } from "./storage.js";
36
+
37
+ /**
38
+ * Why: Single import point for every config domain.
39
+ * When: Application code needs configuration values.
40
+ * Where: Imported as `import { config } from "@/config/index.js"`.
41
+ * How: Aggregates per-domain config objects; individual files remain the
42
+ * place to edit each setting.
43
+ */
44
+ export const config = {
45
+ app: appConfig,
46
+ auth: authConfig,
47
+ cache: cacheConfig,
48
+ cookie: cookieConfig,
49
+ cors: corsConfig,
50
+ database: databaseConfig,
51
+ jwt: jwtConfig,
52
+ logging: loggingConfig,
53
+ mail: mailConfig,
54
+ openApi: openApiConfig,
55
+ queue: queueConfig,
56
+ rateLimit: rateLimitConfig,
57
+ realtime: realtimeConfig,
58
+ redis: redisConfig,
59
+ session: sessionConfig,
60
+ security: securityConfig,
61
+ storage: storageConfig
62
+ } as const;
63
+
64
+ export type Config = typeof config;
65
+ export type {
66
+ AppConfig,
67
+ AuthConfig,
68
+ CacheConfig,
69
+ CookieConfig,
70
+ CorsConfig,
71
+ DatabaseConfig,
72
+ JwtConfig,
73
+ LoggingConfig,
74
+ MailConfig,
75
+ OpenApiConfig,
76
+ QueueConfig,
77
+ RateLimitConfig,
78
+ RealtimeConfig,
79
+ RedisConfig,
80
+ SecurityConfig,
81
+ SessionConfig,
82
+ StorageConfig
83
+ };
@@ -0,0 +1,19 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: JWT signing and lifetime settings.
5
+ * When: Access/refresh token generation and verification.
6
+ * Where: src/config/jwt.ts.
7
+ * How: Signing secrets are confidential and stay in .env. Expiries are plain
8
+ * literals you can tune here (seconds).
9
+ */
10
+ export const jwtConfig = {
11
+ accessSecret: env.JWT_ACCESS_SECRET,
12
+ refreshSecret: env.JWT_REFRESH_SECRET,
13
+ accessExpirySeconds: 900,
14
+ refreshExpirySeconds: 3600,
15
+ refreshRememberExpirySeconds: 2592000,
16
+ algorithm: "HS256" as const
17
+ };
18
+
19
+ export type JwtConfig = typeof jwtConfig;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Why: Logging behavior shared by the framework logger and HTTP request log.
3
+ * When: Logger bootstrap and global HTTP middleware.
4
+ * Where: src/config/logging.ts.
5
+ * How: Plain literals — edit directly. `httpRequests` mirrors the old
6
+ * `LOG_HTTP` switch: set `false` to quiet per-request console logs.
7
+ */
8
+ export const loggingConfig = {
9
+ level: "info",
10
+ httpRequests: true
11
+ };
12
+
13
+ export type LoggingConfig = typeof loggingConfig;
@@ -0,0 +1,24 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: SMTP mail transport settings.
5
+ * When: Transactional mail (signup, reset, verify) is sent.
6
+ * Where: src/config/mail.ts.
7
+ * How: Host, ports, encryption, from address and fail-silent are plain
8
+ * literals. Username/password are credentials and stay in .env.
9
+ */
10
+ export const mailConfig = {
11
+ host: "127.0.0.1",
12
+ port: 1089,
13
+ encryption: "none",
14
+ username: env.MAIL_USERNAME,
15
+ password: env.MAIL_PASSWORD,
16
+ fromAddress: "no-reply@example.com",
17
+ failSilent: true,
18
+ maildev: {
19
+ smtpPort: 1089,
20
+ webPort: 1080
21
+ }
22
+ };
23
+
24
+ export type MailConfig = typeof mailConfig;
@@ -0,0 +1,54 @@
1
+ import { appConfig } from "./app.js";
2
+
3
+ /**
4
+ * Why: OpenAPI documentation settings — API metadata and Scalar UI presentation.
5
+ * When: OPEN_API=true during app boot.
6
+ * Where: src/config/openapi.ts.
7
+ * How: Edit this file to customise your API title, version, description,
8
+ * and the Scalar docs UI appearance.
9
+ */
10
+ export const openApiConfig = {
11
+ /** OpenAPI spec version */
12
+ version: "3.0.0",
13
+
14
+ /** API title shown in docs and the /doc spec */
15
+ title: `${appConfig.name} API`,
16
+
17
+ /** API version shown in docs */
18
+ apiVersion: "1.0.0",
19
+
20
+ /** Optional description shown in the /doc spec */
21
+ description: "",
22
+
23
+ /** Scalar docs UI settings */
24
+ scalar: {
25
+ /** URL path to the OpenAPI JSON spec */
26
+ specUrl: "/doc",
27
+
28
+ /** URL path to the interactive docs UI */
29
+ docsPath: "/api-docs",
30
+
31
+ /** UI layout: "classic" or "modern" */
32
+ layout: "classic" as const,
33
+
34
+ /** UI theme: "default", "moon", "purple", "solarized", "bluePlanet", "fastify", "kepler", "mars", "nebula", "none" */
35
+ theme: "moon" as const,
36
+
37
+ /** HTML page title for the /api-docs page */
38
+ pageTitle: `${appConfig.name} API`,
39
+
40
+ /** Favicon file (project-relative) served at /favicon.ico for the /api-docs page */
41
+ favicon: "src/resources/src/assets/images/favicon/favicon.ico",
42
+
43
+ /** Default HTTP client shown in code examples */
44
+ defaultHttpClient: {
45
+ targetKey: "js" as const,
46
+ clientKey: "fetch" as const
47
+ },
48
+
49
+ /** Expand all tags on load */
50
+ defaultOpenAllTags: true
51
+ }
52
+ } as const;
53
+
54
+ export type OpenApiConfig = typeof openApiConfig;
@@ -0,0 +1,30 @@
1
+ import { redisConfig } from "./redis.js";
2
+
3
+ /**
4
+ * Why: Queue workers, concurrency, and BullMQ key namespaces.
5
+ * When: The queue facade bootstraps workers and the dashboard connects.
6
+ * Where: src/config/queue.ts.
7
+ * How: `queues` lists which queue names get a worker by default (default,
8
+ * mail, maintenance). `concurrency` caps parallel jobs per worker.
9
+ * Key prefixes derive from the shared `REDIS_PREFIX`.
10
+ */
11
+ export const queueConfig = {
12
+ queues: ["default", "mail", "maintenance"],
13
+ concurrency: 10,
14
+ /**
15
+ * autoPruneQueues
16
+ * Why: Automatically deletes phantom queues (Redis keys for queue names that
17
+ * no longer exist in `queues`) when a queue worker boots. Safe because
18
+ * only empty, unconfigured queues are removed, and BullMQ recreates a
19
+ * queue's keys on demand if code still dispatches to it.
20
+ * When: Set false to disable automatic pruning and rely on manual
21
+ * `queue:clear` instead.
22
+ */
23
+ autoPruneQueues: true,
24
+ prefix: `${redisConfig.prefix}:queue`,
25
+ durablePrefix: `${redisConfig.prefix}:durable`,
26
+ queueUi: "/queues",
27
+ allowedEmails: ""
28
+ };
29
+
30
+ export type QueueConfig = typeof queueConfig;
@@ -0,0 +1,17 @@
1
+ import { redisConfig } from "./redis.js";
2
+
3
+ /**
4
+ * Why: HTTP rate limiting policy and Redis key namespace.
5
+ * When: Global and login-specific rate limiters are built.
6
+ * Where: src/config/rateLimit.ts.
7
+ * How: Limits are plain literals; `keyPrefix` is derived from the shared
8
+ * `REDIS_PREFIX` (`nexwire:rl:*` by default).
9
+ */
10
+ export const rateLimitConfig = {
11
+ windowMs: 60000,
12
+ maxRequests: 500,
13
+ loginMaxRequests: 60,
14
+ keyPrefix: `${redisConfig.prefix}:rl`
15
+ };
16
+
17
+ export type RateLimitConfig = typeof rateLimitConfig;
@@ -0,0 +1,15 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: Realtime (Socket.IO) settings.
5
+ * When: The realtime server bootstraps and registers its HTTP path.
6
+ * Where: src/config/realtime.ts.
7
+ * How: Reads `SOCKET` from env. `enabled` flips the WebSocket server
8
+ * on/off; the admin UI is served when the environment is not production.
9
+ */
10
+ export const realtimeConfig = {
11
+ enabled: env.SOCKET,
12
+ path: "/socket.io"
13
+ };
14
+
15
+ export type RealtimeConfig = typeof realtimeConfig;
@@ -0,0 +1,18 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: Redis connection and namespace settings.
5
+ * When: Cache, session, queue, events, and the queue dashboard bootstrap.
6
+ * Where: src/config/redis.ts.
7
+ * How: `prefix` is shared by cache/session/queue/events, so it stays in .env
8
+ * (`REDIS_PREFIX`) and every namespace derives from it here. `enabled`
9
+ * and the commander port are literals you can change here.
10
+ */
11
+ export const redisConfig = {
12
+ enabled: env.REDIS,
13
+ url: env.REDIS_URL,
14
+ prefix: env.REDIS_PREFIX,
15
+ commanderPort: 1369
16
+ };
17
+
18
+ export type RedisConfig = typeof redisConfig;
@@ -0,0 +1,44 @@
1
+ // config/security.ts
2
+ import { env } from "@/env.js";
3
+
4
+ const isProd = env.APP_ENV === "production";
5
+
6
+ /**
7
+ * Dev CSP is intentionally lax so HMR / inline bootstrap scripts work.
8
+ * Prod CSP is strict and blocks unsafe-inline.
9
+ *
10
+ * NOTE: if you serve a bundled SPA (Vite/Next) in prod, you MUST add
11
+ * either a nonce, a hash, or 'unsafe-inline' to script-src — otherwise
12
+ * the inline bootstrap script will be blocked, exactly as you saw.
13
+ */
14
+ const csp = isProd
15
+ ? [
16
+ "default-src 'self'",
17
+ "script-src 'self' https://cdn.jsdelivr.net", // Scalar UI loads its bundle from jsdelivr CDN
18
+ "style-src 'self' https://cdn.jsdelivr.net 'unsafe-inline'",
19
+ "img-src 'self' data: blob: https://cdn.jsdelivr.net",
20
+ "font-src 'self' data: https://cdn.jsdelivr.net https://fonts.scalar.com",
21
+ "connect-src 'self' https://cdn.jsdelivr.net https://api.scalar.com",
22
+ "frame-ancestors 'none'",
23
+ "base-uri 'self'",
24
+ "form-action 'self'"
25
+ ].join("; ")
26
+ : [
27
+ "default-src 'self'",
28
+ "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net",
29
+ "style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net",
30
+ "img-src 'self' data: blob: https://cdn.jsdelivr.net",
31
+ "font-src 'self' data: https://cdn.jsdelivr.net https://fonts.scalar.com",
32
+ "connect-src 'self' ws: wss: https://cdn.jsdelivr.net https://api.scalar.com", // HMR websocket + Scalar
33
+ "frame-ancestors 'none'"
34
+ ].join("; ");
35
+
36
+ export const securityConfig = {
37
+ enabled: env.SECURITY_HEADERS,
38
+ csp,
39
+ hsts: env.APP_ENV === "production",
40
+ hstsMaxAge: "max-age=31536000; includeSubDomains",
41
+ xFrame: "DENY"
42
+ };
43
+
44
+ export type SecurityConfig = typeof securityConfig;
@@ -0,0 +1,17 @@
1
+ import { cookieConfig } from "./index.js";
2
+ import { redisConfig } from "./redis.js";
3
+
4
+ /**
5
+ * Why: Server-side session cookie and lifetime settings.
6
+ * When: Session middleware creates/refreshes sessions for each request.
7
+ * Where: src/config/session.ts.
8
+ * How: `cookieName` and `ttlSeconds` are plain literals; `keyPrefix` is
9
+ * derived from the shared `REDIS_PREFIX` (`nexwire:session:*` by default).
10
+ */
11
+ export const sessionConfig = {
12
+ cookieName: `${cookieConfig.name}_session`,
13
+ ttlSeconds: 7200,
14
+ keyPrefix: `${redisConfig.prefix}:session`
15
+ };
16
+
17
+ export type SessionConfig = typeof sessionConfig;
@@ -0,0 +1,22 @@
1
+ import { env } from "@/env.js";
2
+
3
+ /**
4
+ * Why: File storage settings for local and S3 backends.
5
+ * When: Storage facade bootstrap and file operations.
6
+ * Where: src/config/storage.ts.
7
+ * How: Driver, disk, region and TTL are plain literals you can change here.
8
+ * Credentials (access key, secret) are confidential and stay in .env.
9
+ */
10
+ export const storageConfig = {
11
+ driver: "local",
12
+ defaultDisk: "public",
13
+ bucket: "",
14
+ region: "us-east-1",
15
+ endpoint: "",
16
+ forcePathStyle: false,
17
+ signedUrlTtlSeconds: 900,
18
+ accessKeyId: env.STORAGE_ACCESS_KEY_ID,
19
+ secretAccessKey: env.STORAGE_SECRET_ACCESS_KEY
20
+ };
21
+
22
+ export type StorageConfig = typeof storageConfig;