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.
- package/README.md +29 -12
- package/express/.env +1 -1
- package/express/package.json +1 -1
- package/express/src/config/database.ts +48 -29
- package/express/src/config/index.ts +83 -83
- package/express/src/config/openapi.ts +6 -24
- package/express/src/config/queue.ts +30 -30
- package/express/src/config/validate.ts +50 -40
- package/express/src/database/migrations/sqlite/0000_init.sql +47 -47
- package/express/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/express/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/express/src/framework/cache/cache.ts +40 -8
- package/express/src/framework/circuit-breaker/cb.ts +88 -60
- package/express/src/framework/database/connection.ts +52 -27
- package/express/src/framework/events/dispatcher.ts +61 -49
- package/express/src/framework/facade.ts +47 -3
- package/express/src/framework/http/app.ts +28 -22
- package/express/src/framework/http/logger.ts +37 -17
- package/express/src/framework/http/openapi.ts +9 -11
- package/express/src/framework/maker-cli/runtime/core.mjs +1 -2
- package/express/src/framework/modules/routes.ts +26 -21
- package/express/src/framework/notification/channels/broadcast.ts +15 -0
- package/express/src/framework/notification/channels/mail.ts +42 -0
- package/express/src/framework/notification/contracts.ts +29 -0
- package/express/src/framework/notification/index.ts +19 -94
- package/express/src/framework/notification/registry.ts +15 -0
- package/express/src/framework/providers/adapter.ts +27 -17
- package/express/src/framework/queue/queue.ts +43 -44
- package/express/src/framework/realtime/broadcast.ts +29 -5
- package/express/src/framework/realtime/socket.ts +149 -119
- package/express/src/framework/redis/client.ts +148 -151
- package/express/src/framework/runtime/server-adapter.ts +39 -34
- package/express/src/framework/scheduler/lock.ts +128 -116
- package/express/src/framework/server.ts +33 -49
- package/express/src/framework/session/session.ts +69 -14
- package/express/src/framework/storage/storage.ts +744 -785
- package/express/src/framework/support/mail.ts +15 -7
- package/express/src/middlewares/auth-middleware.ts +1 -2
- package/express/src/middlewares/role-middleware.ts +3 -13
- package/express/src/modules/auth/routes/index.ts +1 -2
- package/express/src/providers/notification.ts +4 -0
- package/express/src/resources/src/components/Switch.vue +60 -65
- package/express/src/resources/src/layouts/Layout/Header.vue +124 -105
- package/express/src/resources/src/pages/auth/forgetPassword.vue +23 -30
- package/express/src/resources/src/pages/auth/login.vue +25 -28
- package/express/src/resources/src/pages/auth/register.vue +35 -39
- package/express/src/resources/src/pages/auth/resetPassword.vue +29 -37
- package/express/src/resources/src/pages/auth/verifyEmail.vue +15 -19
- package/express/src/resources/src/plugins/gum.ts +519 -203
- package/express/src/resources/src/plugins/pulse.ts +157 -147
- package/express/src/resources/src/stores/auth.ts +9 -6
- package/express/src/resources/vite.config.ts +54 -43
- package/express/src/storage/database/nexwire.sqlite +0 -0
- package/express/src/storage/logs/app.log +0 -0
- package/express/src/storage/logs/fatal.log +0 -0
- package/express/src/types/global.d.ts +32 -26
- package/fastify/.dockerignore +14 -0
- package/fastify/.env +44 -0
- package/fastify/.env.example +42 -0
- package/fastify/.vscode/extensions.json +6 -0
- package/fastify/.vscode/settings.json +37 -0
- package/fastify/LICENSE +21 -0
- package/fastify/README.md +232 -0
- package/fastify/biome.json +99 -0
- package/fastify/drizzle.config.ts +25 -0
- package/fastify/gitignore-stub +31 -0
- package/fastify/package.json +130 -0
- package/fastify/public/.gitkeep +0 -0
- package/fastify/src/config/app.ts +41 -0
- package/fastify/src/config/auth.ts +12 -0
- package/fastify/src/config/cache.ts +16 -0
- package/fastify/src/config/cookie.ts +15 -0
- package/fastify/src/config/cors.ts +12 -0
- package/fastify/src/config/database.ts +48 -0
- package/fastify/src/config/index.ts +83 -0
- package/fastify/src/config/jwt.ts +19 -0
- package/fastify/src/config/logging.ts +13 -0
- package/fastify/src/config/mail.ts +24 -0
- package/fastify/src/config/openapi.ts +36 -0
- package/fastify/src/config/queue.ts +30 -0
- package/fastify/src/config/rateLimit.ts +17 -0
- package/fastify/src/config/realtime.ts +15 -0
- package/fastify/src/config/redis.ts +18 -0
- package/fastify/src/config/security.ts +44 -0
- package/fastify/src/config/session.ts +17 -0
- package/fastify/src/config/storage.ts +22 -0
- package/fastify/src/config/validate.ts +50 -0
- package/fastify/src/database/migrations/sqlite/0000_init.sql +48 -0
- package/fastify/src/database/migrations/sqlite/meta/0000_snapshot.json +324 -0
- package/fastify/src/database/migrations/sqlite/meta/_journal.json +13 -0
- package/fastify/src/database/schema.ts +2 -0
- package/fastify/src/env.ts +76 -0
- package/fastify/src/framework/cache/cache.ts +114 -0
- package/fastify/src/framework/circuit-breaker/cb.ts +88 -0
- package/fastify/src/framework/database/app-schema.ts +37 -0
- package/fastify/src/framework/database/connection.ts +223 -0
- package/fastify/src/framework/database/migrate-hooks.ts +87 -0
- package/fastify/src/framework/database/paginate.ts +226 -0
- package/fastify/src/framework/database/schema.ts +20 -0
- package/fastify/src/framework/database/seed.ts +152 -0
- package/fastify/src/framework/events/dispatcher.ts +61 -0
- package/fastify/src/framework/facade.ts +96 -0
- package/fastify/src/framework/http/app.ts +176 -0
- package/fastify/src/framework/http/cors.ts +13 -0
- package/fastify/src/framework/http/fastify.d.ts +13 -0
- package/fastify/src/framework/http/logger.ts +110 -0
- package/fastify/src/framework/http/metrics.ts +22 -0
- package/fastify/src/framework/http/openapi.ts +48 -0
- package/fastify/src/framework/http/ratelimiter.ts +47 -0
- package/fastify/src/framework/http/security.ts +25 -0
- package/fastify/src/framework/http/static.ts +83 -0
- package/fastify/src/framework/http/validation.ts +49 -0
- package/fastify/src/framework/kernel.ts +43 -0
- package/fastify/src/framework/maker-cli/db/core.mjs +291 -0
- package/fastify/src/framework/maker-cli/db/index.mjs +204 -0
- package/fastify/src/framework/maker-cli/deploy/core.mjs +1046 -0
- package/fastify/src/framework/maker-cli/deploy/index.mjs +91 -0
- package/fastify/src/framework/maker-cli/index.mjs +65 -0
- package/fastify/src/framework/maker-cli/middleware/core.mjs +41 -0
- package/fastify/src/framework/maker-cli/middleware/index.mjs +17 -0
- package/fastify/src/framework/maker-cli/module/core.mjs +1066 -0
- package/fastify/src/framework/maker-cli/module/index.mjs +211 -0
- package/fastify/src/framework/maker-cli/provider/core.mjs +49 -0
- package/fastify/src/framework/maker-cli/provider/index.mjs +12 -0
- package/fastify/src/framework/maker-cli/runtime/build-ui.mjs +16 -0
- package/fastify/src/framework/maker-cli/runtime/core.mjs +560 -0
- package/fastify/src/framework/maker-cli/runtime/index.mjs +120 -0
- package/fastify/src/framework/maker-cli/runtime/redis-commander-patch.cjs +20 -0
- package/fastify/src/framework/maker-cli/stubs/controller/openapi.ts.stub +74 -0
- package/fastify/src/framework/maker-cli/stubs/controller/plain.ts.stub +77 -0
- package/fastify/src/framework/maker-cli/stubs/controller/standalone.ts.stub +51 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.bun.stub +52 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.pnpm.stub +55 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.stub +51 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/Dockerfile.yarn.stub +55 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/README.stub +59 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/mysql.server.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/postgres.server.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/compose/sqlite.stub +45 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/mysql.server.stub +68 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/postgres.server.stub +68 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/env/sqlite.stub +67 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/scripts/auto-migrate.sh.stub +41 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/README.stub +78 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/noredis.stub +120 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.dev.stub +133 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/compose/redis.stub +131 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/local.example.stub +11 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/noredis.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/env/redis.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/README.stub +16 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/nginx-vhost/app.example.com.stub +13 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/pgadmin/servers.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/server/redis/redis.conf.stub +7 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/noredis.stub +54 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/supervisor/redis.stub +70 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/workflow/local.json.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/deploy/workflow/remote.json.stub +24 -0
- package/fastify/src/framework/maker-cli/stubs/facade/name.ts.stub +12 -0
- package/fastify/src/framework/maker-cli/stubs/helper/name.ts.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/job/name.ts.stub +25 -0
- package/fastify/src/framework/maker-cli/stubs/middleware/name.local.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/middleware/name.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.mysql.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.postgresql.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/model/name.sqlite.ts.stub +10 -0
- package/fastify/src/framework/maker-cli/stubs/notification/controller.ts.stub +79 -0
- package/fastify/src/framework/maker-cli/stubs/notification/job.ts.stub +11 -0
- package/fastify/src/framework/maker-cli/stubs/notification/model.ts.stub +29 -0
- package/fastify/src/framework/maker-cli/stubs/notification/provider.ts.stub +174 -0
- package/fastify/src/framework/maker-cli/stubs/notification/route.api.ts.stub +71 -0
- package/fastify/src/framework/maker-cli/stubs/notification/route.plain.ts.stub +15 -0
- package/fastify/src/framework/maker-cli/stubs/notification/schema.plain.ts.stub +26 -0
- package/fastify/src/framework/maker-cli/stubs/notification/schema.ts.stub +26 -0
- package/fastify/src/framework/maker-cli/stubs/provider/module-barrel.ts.stub +19 -0
- package/fastify/src/framework/maker-cli/stubs/provider/module.ts.stub +21 -0
- package/fastify/src/framework/maker-cli/stubs/provider/name.ts.stub +21 -0
- package/fastify/src/framework/maker-cli/stubs/route/api.ts.stub +101 -0
- package/fastify/src/framework/maker-cli/stubs/route/plain.ts.stub +23 -0
- package/fastify/src/framework/maker-cli/stubs/route/standalone.api.ts.stub +120 -0
- package/fastify/src/framework/maker-cli/stubs/route/standalone.plain.ts.stub +50 -0
- package/fastify/src/framework/maker-cli/stubs/schedule/name.ts.stub +36 -0
- package/fastify/src/framework/maker-cli/stubs/schema/name.plain.ts.stub +14 -0
- package/fastify/src/framework/maker-cli/stubs/schema/name.ts.stub +33 -0
- package/fastify/src/framework/maker-cli/stubs/seeder/name.ts.stub +18 -0
- package/fastify/src/framework/maker-cli/stubs/seeder/standalone.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/stubs/service/name.plain.ts.stub +67 -0
- package/fastify/src/framework/maker-cli/stubs/service/name.ts.stub +65 -0
- package/fastify/src/framework/maker-cli/stubs/test/unit.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/stubs/type/name.ts.stub +22 -0
- package/fastify/src/framework/maker-cli/utils/env-config.mjs +44 -0
- package/fastify/src/framework/maker-cli/utils/env-db.mjs +61 -0
- package/fastify/src/framework/maker-cli/utils/file-ops.mjs +30 -0
- package/fastify/src/framework/maker-cli/utils/flags.mjs +14 -0
- package/fastify/src/framework/maker-cli/utils/help.mjs +379 -0
- package/fastify/src/framework/maker-cli/utils/naming.mjs +119 -0
- package/fastify/src/framework/maker-cli/utils/process.mjs +52 -0
- package/fastify/src/framework/maker-cli/utils/project-commands.mjs +201 -0
- package/fastify/src/framework/modules/discover.ts +57 -0
- package/fastify/src/framework/modules/routes.ts +31 -0
- package/fastify/src/framework/notification/channels/broadcast.ts +15 -0
- package/fastify/src/framework/notification/channels/mail.ts +42 -0
- package/fastify/src/framework/notification/contracts.ts +29 -0
- package/fastify/src/framework/notification/index.ts +59 -0
- package/fastify/src/framework/notification/registry.ts +15 -0
- package/fastify/src/framework/providers/adapter.ts +149 -0
- package/fastify/src/framework/providers/contracts.ts +126 -0
- package/fastify/src/framework/providers/loader.ts +105 -0
- package/fastify/src/framework/providers/registry.ts +88 -0
- package/fastify/src/framework/queue/clear.ts +22 -0
- package/fastify/src/framework/queue/queue.ts +401 -0
- package/fastify/src/framework/queue/ui.ts +194 -0
- package/fastify/src/framework/queue/worker.ts +61 -0
- package/fastify/src/framework/realtime/broadcast.ts +70 -0
- package/fastify/src/framework/realtime/index.ts +2 -0
- package/fastify/src/framework/realtime/socket-cookie.ts +72 -0
- package/fastify/src/framework/realtime/socket.ts +149 -0
- package/fastify/src/framework/realtime/types.ts +6 -0
- package/fastify/src/framework/realtime/ui.ts +16 -0
- package/fastify/src/framework/redis/client.ts +148 -0
- package/fastify/src/framework/runtime/runtime.ts +23 -0
- package/fastify/src/framework/runtime/server-adapter.ts +33 -0
- package/fastify/src/framework/scheduler/lock.ts +128 -0
- package/fastify/src/framework/scheduler/run.ts +48 -0
- package/fastify/src/framework/scheduler/scheduler.ts +155 -0
- package/fastify/src/framework/server.ts +162 -0
- package/fastify/src/framework/session/session.ts +160 -0
- package/fastify/src/framework/storage/storage.ts +744 -0
- package/fastify/src/framework/support/cookie.ts +71 -0
- package/fastify/src/framework/support/jwt.ts +33 -0
- package/fastify/src/framework/support/lifecycle.ts +35 -0
- package/fastify/src/framework/support/logger.ts +148 -0
- package/fastify/src/framework/support/mail.ts +56 -0
- package/fastify/src/framework/support/password.ts +23 -0
- package/fastify/src/framework/support/status-codes.ts +75 -0
- package/fastify/src/framework/support/upload.ts +181 -0
- package/fastify/src/framework/support/url.ts +41 -0
- package/fastify/src/middlewares/auth-middleware.ts +134 -0
- package/fastify/src/middlewares/role-middleware.ts +19 -0
- package/fastify/src/modules/auth/__tests__/forgetpass.test.ts +200 -0
- package/fastify/src/modules/auth/__tests__/login.test.ts +171 -0
- package/fastify/src/modules/auth/__tests__/logout.test.ts +60 -0
- package/fastify/src/modules/auth/__tests__/logoutalldevices.test.ts +49 -0
- package/fastify/src/modules/auth/__tests__/me.test.ts +91 -0
- package/fastify/src/modules/auth/__tests__/refreshtoken.test.ts +305 -0
- package/fastify/src/modules/auth/__tests__/register.test.ts +291 -0
- package/fastify/src/modules/auth/__tests__/resetpass.test.ts +206 -0
- package/fastify/src/modules/auth/__tests__/verifyemail.test.ts +183 -0
- package/fastify/src/modules/auth/controllers/auth.ts +252 -0
- package/fastify/src/modules/auth/controllers/role.ts +35 -0
- package/fastify/src/modules/auth/database/models/role.ts +14 -0
- package/fastify/src/modules/auth/database/models/user.ts +46 -0
- package/fastify/src/modules/auth/database/seeders/role.ts +18 -0
- package/fastify/src/modules/auth/database/seeders/user.ts +35 -0
- package/fastify/src/modules/auth/facade.ts +12 -0
- package/fastify/src/modules/auth/helpers/auth.ts +115 -0
- package/fastify/src/modules/auth/jobs/forgetpass.ts +20 -0
- package/fastify/src/modules/auth/jobs/registeruser.ts +23 -0
- package/fastify/src/modules/auth/jobs/verifyemail.ts +18 -0
- package/fastify/src/modules/auth/routes/index.ts +185 -0
- package/fastify/src/modules/auth/routes/role.ts +56 -0
- package/fastify/src/modules/auth/schemas/auth.ts +116 -0
- package/fastify/src/modules/auth/services/forgetpassword.ts +66 -0
- package/fastify/src/modules/auth/services/login.ts +63 -0
- package/fastify/src/modules/auth/services/logout.ts +25 -0
- package/fastify/src/modules/auth/services/logoutalldevices.ts +19 -0
- package/fastify/src/modules/auth/services/me.ts +31 -0
- package/fastify/src/modules/auth/services/refreshtoken.ts +110 -0
- package/fastify/src/modules/auth/services/register.ts +141 -0
- package/fastify/src/modules/auth/services/resetpassword.ts +69 -0
- package/fastify/src/modules/auth/services/verifyemail.ts +77 -0
- package/fastify/src/modules/auth/types/auth.ts +31 -0
- package/fastify/src/providers/README.md +107 -0
- package/fastify/src/providers/notification.ts +4 -0
- package/fastify/src/resources/index.html +17 -0
- package/fastify/src/resources/src/App.vue +5 -0
- package/fastify/src/resources/src/assets/css/styles.css +14761 -0
- package/fastify/src/resources/src/assets/css/styles.css.map +1 -0
- package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin-ext.woff2 +0 -0
- package/fastify/src/resources/src/assets/fonts/public-sans/public-sans-latin.woff2 +0 -0
- package/fastify/src/resources/src/assets/images/favicon/favicon.ico +0 -0
- package/fastify/src/resources/src/assets/images/logo.png +0 -0
- package/fastify/src/resources/src/assets/scss/custom.css +217 -0
- package/fastify/src/resources/src/assets/scss/custom.css.map +1 -0
- package/fastify/src/resources/src/assets/scss/custom.scss +1346 -0
- package/fastify/src/resources/src/components/Button.vue +32 -0
- package/fastify/src/resources/src/components/Checkbox.vue +32 -0
- package/fastify/src/resources/src/components/Datepicker.vue +106 -0
- package/fastify/src/resources/src/components/FeatureButton.vue +53 -0
- package/fastify/src/resources/src/components/FloatButton.vue +33 -0
- package/fastify/src/resources/src/components/Href.vue +32 -0
- package/fastify/src/resources/src/components/Input.vue +243 -0
- package/fastify/src/resources/src/components/InputGroup.vue +147 -0
- package/fastify/src/resources/src/components/InputPasswordToggle.vue +229 -0
- package/fastify/src/resources/src/components/Modal.vue +71 -0
- package/fastify/src/resources/src/components/Pagebar.vue +26 -0
- package/fastify/src/resources/src/components/Refresh.vue +19 -0
- package/fastify/src/resources/src/components/Select.vue +384 -0
- package/fastify/src/resources/src/components/Spinner.vue +42 -0
- package/fastify/src/resources/src/components/Switch.vue +60 -0
- package/fastify/src/resources/src/components/TextArea.vue +117 -0
- package/fastify/src/resources/src/components/Toast.vue +56 -0
- package/fastify/src/resources/src/components/datatable/DataTableSkeleton.vue +98 -0
- package/fastify/src/resources/src/components/datatable/Pagination.vue +147 -0
- package/fastify/src/resources/src/components/datatable/SelectOpption.vue +64 -0
- package/fastify/src/resources/src/components/datatable/index.vue +199 -0
- package/fastify/src/resources/src/composables/useAuth.ts +52 -0
- package/fastify/src/resources/src/helpers/assets.ts +51 -0
- package/fastify/src/resources/src/helpers/nformatter.ts +10 -0
- package/fastify/src/resources/src/helpers/utils.ts +75 -0
- package/fastify/src/resources/src/layouts/AuthLayout.vue +20 -0
- package/fastify/src/resources/src/layouts/Layout/Footer.vue +23 -0
- package/fastify/src/resources/src/layouts/Layout/Header.vue +124 -0
- package/fastify/src/resources/src/layouts/Layout/Sidebar.vue +137 -0
- package/fastify/src/resources/src/layouts/Layout/index.vue +87 -0
- package/fastify/src/resources/src/main.ts +28 -0
- package/fastify/src/resources/src/pages/auth/forgetPassword.vue +76 -0
- package/fastify/src/resources/src/pages/auth/login.vue +96 -0
- package/fastify/src/resources/src/pages/auth/register.vue +129 -0
- package/fastify/src/resources/src/pages/auth/resetPassword.vue +110 -0
- package/fastify/src/resources/src/pages/auth/verifyEmail.vue +64 -0
- package/fastify/src/resources/src/pages/dashboard/index.vue +66 -0
- package/fastify/src/resources/src/plugins/axios.ts +31 -0
- package/fastify/src/resources/src/plugins/browserDetect.ts +55 -0
- package/fastify/src/resources/src/plugins/dialog.ts +216 -0
- package/fastify/src/resources/src/plugins/gum.ts +683 -0
- package/fastify/src/resources/src/plugins/pulse.ts +157 -0
- package/fastify/src/resources/src/plugins/routeProgress.ts +87 -0
- package/fastify/src/resources/src/router/index.ts +85 -0
- package/fastify/src/resources/src/stores/admin-ui.ts +148 -0
- package/fastify/src/resources/src/stores/auth.ts +187 -0
- package/fastify/src/resources/tsconfig.json +19 -0
- package/fastify/src/resources/vite.config.ts +64 -0
- package/fastify/src/storage/app/private/.gitkeep +0 -0
- package/fastify/src/storage/app/public/.gitkeep +0 -0
- package/fastify/src/storage/app/tmp/generated/.gitkeep +0 -0
- package/fastify/src/storage/database/nexwire.sqlite +0 -0
- package/fastify/src/storage/logs/.gitkeep +0 -0
- package/fastify/src/storage/logs/app.log +0 -0
- package/fastify/src/storage/logs/fatal.log +0 -0
- package/fastify/src/storage/tmp/.gitkeep +0 -0
- package/fastify/src/storage/trash/modules/.gitkeep +0 -0
- package/fastify/src/types/global.d.ts +32 -0
- package/fastify/tsconfig.json +19 -0
- package/fastify/vitest.config.ts +38 -0
- package/hono/.env +1 -1
- package/hono/package.json +1 -1
- package/hono/src/config/database.ts +48 -29
- package/hono/src/config/index.ts +83 -83
- package/hono/src/config/openapi.ts +6 -24
- package/hono/src/config/queue.ts +30 -30
- package/hono/src/config/validate.ts +50 -40
- package/hono/src/database/migrations/sqlite/0000_init.sql +47 -47
- package/hono/src/database/migrations/sqlite/meta/0000_snapshot.json +1 -1
- package/hono/src/database/migrations/sqlite/meta/_journal.json +1 -1
- package/hono/src/framework/cache/cache.ts +40 -8
- package/hono/src/framework/circuit-breaker/cb.ts +88 -60
- package/hono/src/framework/database/connection.ts +52 -27
- package/hono/src/framework/events/dispatcher.ts +61 -49
- package/hono/src/framework/facade.ts +39 -1
- package/hono/src/framework/http/logger.ts +86 -81
- package/hono/src/framework/http/openapi.ts +7 -9
- package/hono/src/framework/maker-cli/runtime/core.mjs +1 -2
- package/hono/src/framework/notification/channels/broadcast.ts +15 -0
- package/hono/src/framework/notification/channels/mail.ts +42 -0
- package/hono/src/framework/notification/contracts.ts +29 -0
- package/hono/src/framework/notification/index.ts +19 -94
- package/hono/src/framework/notification/registry.ts +15 -0
- package/hono/src/framework/providers/adapter.ts +27 -17
- package/hono/src/framework/queue/queue.ts +43 -44
- package/hono/src/framework/realtime/broadcast.ts +29 -5
- package/hono/src/framework/realtime/socket.ts +217 -196
- package/hono/src/framework/redis/client.ts +148 -151
- package/hono/src/framework/scheduler/lock.ts +128 -116
- package/hono/src/framework/server.ts +27 -29
- package/hono/src/framework/session/session.ts +62 -14
- package/hono/src/framework/storage/storage.ts +744 -785
- package/hono/src/framework/support/mail.ts +56 -48
- package/hono/src/middlewares/auth-middleware.ts +1 -2
- package/hono/src/middlewares/role-middleware.ts +3 -13
- package/hono/src/modules/auth/routes/index.ts +1 -2
- package/hono/src/providers/notification.ts +4 -0
- package/hono/src/resources/src/components/Switch.vue +60 -65
- package/hono/src/resources/src/layouts/Layout/Header.vue +124 -105
- package/hono/src/resources/src/pages/auth/forgetPassword.vue +23 -29
- package/hono/src/resources/src/pages/auth/login.vue +26 -29
- package/hono/src/resources/src/pages/auth/register.vue +36 -40
- package/hono/src/resources/src/pages/auth/resetPassword.vue +29 -37
- package/hono/src/resources/src/pages/auth/verifyEmail.vue +15 -19
- package/hono/src/resources/src/plugins/gum.ts +519 -203
- package/hono/src/resources/src/plugins/pulse.ts +157 -147
- package/hono/src/resources/src/stores/auth.ts +9 -6
- package/hono/src/resources/vite.config.ts +54 -43
- package/hono/src/storage/database/nexwire.sqlite +0 -0
- package/hono/src/storage/logs/app.log +0 -0
- package/hono/src/storage/logs/fatal.log +0 -0
- package/hono/src/types/global.d.ts +32 -26
- package/package.json +4 -3
- package/src/index.js +143 -15
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath, URL } from "node:url";
|
|
3
|
+
import vue from "@vitejs/plugin-vue";
|
|
4
|
+
import { defineConfig, loadEnv } from "vite";
|
|
5
|
+
|
|
6
|
+
const configDir = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const projectRoot = path.resolve(configDir, "../..");
|
|
8
|
+
|
|
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, "");
|
|
13
|
+
|
|
14
|
+
const cacheBase = process.env.LOCALAPPDATA || process.env.TEMP || ".";
|
|
15
|
+
const apiUrl = env.APP_URL || "http://localhost:3000";
|
|
16
|
+
|
|
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
|
+
}
|
|
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
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
Binary file
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +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";
|
|
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,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ESNext",
|
|
4
|
+
"module": "NodeNext",
|
|
5
|
+
"moduleResolution": "NodeNext",
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"paths": {
|
|
8
|
+
"@/*": ["./src/*"]
|
|
9
|
+
},
|
|
10
|
+
"strict": false,
|
|
11
|
+
"esModuleInterop": true,
|
|
12
|
+
"allowSyntheticDefaultImports": true,
|
|
13
|
+
"outDir": "./dist",
|
|
14
|
+
"skipLibCheck": true,
|
|
15
|
+
"types": ["node"]
|
|
16
|
+
},
|
|
17
|
+
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/framework/maker-cli/**/*.mjs", "drizzle.config.ts"],
|
|
18
|
+
"exclude": ["node_modules", "dist", "src/resources", "src/storage/trash"]
|
|
19
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { defineConfig } from "vitest/config";
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
resolve: {
|
|
6
|
+
alias: {
|
|
7
|
+
"@": fileURLToPath(new URL("./src", import.meta.url))
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
test: {
|
|
11
|
+
globals: true,
|
|
12
|
+
include: ["src/**/*.test.ts", "src/**/*.spec.ts"],
|
|
13
|
+
exclude: ["src/resources/**", "src/storage/**", "node_modules/**", "dist/**"],
|
|
14
|
+
environment: "node",
|
|
15
|
+
coverage: {
|
|
16
|
+
provider: "v8",
|
|
17
|
+
reporter: ["text", "json", "html"],
|
|
18
|
+
include: ["src/**/*.ts"],
|
|
19
|
+
exclude: ["src/resources/**", "src/storage/**", "src/framework/maker-cli/**", "src/**/*.d.ts", "src/**/*.test.ts", "src/**/*.spec.ts"]
|
|
20
|
+
// No `thresholds` here on purpose.
|
|
21
|
+
//
|
|
22
|
+
// This file is published inside the package, so any floor written here also
|
|
23
|
+
// becomes every scaffolded project's floor - and it would fail them on the
|
|
24
|
+
// first run. A new project ships with only the auth module's tests: the
|
|
25
|
+
// framework's own tests under `src/framework/**/__tests__/` are not
|
|
26
|
+
// published, because they test the framework rather than the application.
|
|
27
|
+
// That measures 8.49% statements, so a floor calibrated for this repository
|
|
28
|
+
// reports a failure for a developer who has done nothing wrong and whose
|
|
29
|
+
// 56 tests all pass.
|
|
30
|
+
//
|
|
31
|
+
// The floor is a guard on this repository, not on yours, so it is passed on
|
|
32
|
+
// the command line when the framework's own suite is run - it is never read
|
|
33
|
+
// from this file. That keeps this file byte-identical across both engines,
|
|
34
|
+
// keeps it free of a number that would be meaningless in someone else's
|
|
35
|
+
// project, and still fails when untested code is added here.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
package/hono/.env
CHANGED
|
@@ -37,7 +37,7 @@ UI=true
|
|
|
37
37
|
# Set true to enable OpenAPI / Scalar docs at /api-docs
|
|
38
38
|
OPEN_API=true
|
|
39
39
|
# Set false to disable Socket.IO realtime server
|
|
40
|
-
SOCKET=
|
|
40
|
+
SOCKET=false
|
|
41
41
|
# Set false to disable browser security headers (CSP, HSTS, X-Frame)
|
|
42
42
|
SECURITY_HEADERS=true
|
|
43
43
|
|
package/hono/package.json
CHANGED
|
@@ -1,29 +1,48 @@
|
|
|
1
|
-
import { env } from "@/env.js";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Why: Database connection settings
|
|
5
|
-
* When: Database bootstrap and dialect detection.
|
|
6
|
-
* Where: src/config/database.ts.
|
|
7
|
-
* How:
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
import { env } from "@/env.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Why: Database connection settings.
|
|
5
|
+
* When: Database bootstrap and dialect detection.
|
|
6
|
+
* Where: src/config/database.ts.
|
|
7
|
+
* How: Only DATABASE_URL is required. Pool settings use generic,
|
|
8
|
+
* provider-agnostic defaults.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const rawUrl = env.DATABASE_URL;
|
|
12
|
+
|
|
13
|
+
export const databaseConfig = {
|
|
14
|
+
// If it's sqlite, convert "sqlite:./db.sqlite" to "file:./db.sqlite"
|
|
15
|
+
url: rawUrl.startsWith("sqlite:") ? `file:${rawUrl.slice("sqlite:".length)}` : rawUrl,
|
|
16
|
+
|
|
17
|
+
/** Generic, sensible pool defaults for any provider */
|
|
18
|
+
pool: {
|
|
19
|
+
max: 10,
|
|
20
|
+
idleTimeout: 20000, // ms
|
|
21
|
+
connectTimeout: 10000, // ms
|
|
22
|
+
keepAlive: true
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Default to true. If a provider (like a pooler) doesn't support it,
|
|
27
|
+
* they usually indicate this in the connection string or require the user
|
|
28
|
+
* to handle it at the driver level.
|
|
29
|
+
*/
|
|
30
|
+
prepare: true,
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Require TLS for MySQL and PostgreSQL connections. Set this to true, or
|
|
34
|
+
* append `?sslmode=require` to DATABASE_URL if your provider documents that.
|
|
35
|
+
*/
|
|
36
|
+
ssl: false
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type DatabaseConfig = typeof databaseConfig;
|
|
40
|
+
|
|
41
|
+
export function detectDialectFrom(url: string): "sqlite" | "mysql" | "postgresql" {
|
|
42
|
+
const value = url.toLowerCase();
|
|
43
|
+
if (value.startsWith("mysql")) return "mysql";
|
|
44
|
+
if (value.startsWith("postgres")) return "postgresql";
|
|
45
|
+
return "sqlite";
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const databaseDialect = detectDialectFrom(rawUrl);
|
package/hono/src/config/index.ts
CHANGED
|
@@ -1,83 +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
|
-
};
|
|
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, databaseDialect, detectDialectFrom } 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
|
+
};
|
|
@@ -8,46 +8,28 @@ import { appConfig } from "./app.js";
|
|
|
8
8
|
* and the Scalar docs UI appearance.
|
|
9
9
|
*/
|
|
10
10
|
export const openApiConfig = {
|
|
11
|
-
/** OpenAPI spec version */
|
|
12
11
|
version: "3.0.0",
|
|
13
|
-
|
|
14
|
-
/** API title shown in docs and the /doc spec */
|
|
15
12
|
title: `${appConfig.name} API`,
|
|
16
|
-
|
|
17
|
-
/** API version shown in docs */
|
|
18
13
|
apiVersion: "1.0.0",
|
|
19
|
-
|
|
20
|
-
/** Optional description shown in the /doc spec */
|
|
21
14
|
description: "",
|
|
22
15
|
|
|
23
16
|
/** Scalar docs UI settings */
|
|
24
17
|
scalar: {
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
18
|
+
specUrl: "/doc", // URL path to the OpenAPI JSON spec
|
|
19
|
+
docsPath: "/api-docs", // URL path to the interactive docs UI
|
|
20
|
+
layout: "classic" as const, // UI layout: "classic" or "modern"
|
|
34
21
|
/** UI theme: "default", "moon", "purple", "solarized", "bluePlanet", "fastify", "kepler", "mars", "nebula", "none" */
|
|
35
22
|
theme: "moon" as const,
|
|
36
|
-
|
|
37
|
-
/** HTML page title for the /api-docs page */
|
|
38
|
-
pageTitle: `${appConfig.name} API`,
|
|
39
|
-
|
|
23
|
+
pageTitle: `${appConfig.name} API`, // HTML page title for the /api-docs page
|
|
40
24
|
/** Favicon file (project-relative) served at /favicon.ico for the /api-docs page */
|
|
41
25
|
favicon: "src/resources/src/assets/images/favicon/favicon.ico",
|
|
42
|
-
|
|
43
26
|
/** Default HTTP client shown in code examples */
|
|
44
27
|
defaultHttpClient: {
|
|
45
28
|
targetKey: "js" as const,
|
|
46
29
|
clientKey: "fetch" as const
|
|
47
30
|
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
defaultOpenAllTags: true
|
|
31
|
+
defaultOpenAllTags: true, // Expand all tags on load
|
|
32
|
+
showDeveloperTools: "never"
|
|
51
33
|
}
|
|
52
34
|
} as const;
|
|
53
35
|
|
package/hono/src/config/queue.ts
CHANGED
|
@@ -1,30 +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;
|
|
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: "" // Comma-separated list of email addresses allowed to access the queue UI. Empty means no restriction.
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type QueueConfig = typeof queueConfig;
|
|
@@ -1,40 +1,50 @@
|
|
|
1
|
-
import { databaseConfig } from "./database.js";
|
|
2
|
-
import { mailConfig } from "./mail.js";
|
|
3
|
-
import { redisConfig } from "./redis.js";
|
|
4
|
-
import { storageConfig } from "./storage.js";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Why: Validates that resolved configs are internally consistent at startup.
|
|
8
|
-
* When: Called before any framework subsystem initializes.
|
|
9
|
-
* Where: kernel.ts, before storage.init() and initRedis().
|
|
10
|
-
* How: Checks cross-config dependencies and throws clear errors for inconsistencies.
|
|
11
|
-
*/
|
|
12
|
-
export function validateConfig(): void {
|
|
13
|
-
if (!databaseConfig.url) {
|
|
14
|
-
throw new Error("DATABASE_URL is required but is empty");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
if (storageConfig.driver === "s3") {
|
|
18
|
-
if (!storageConfig.bucket) {
|
|
19
|
-
throw new Error("STORAGE_BUCKET is required when storage driver is s3");
|
|
20
|
-
}
|
|
21
|
-
if (!storageConfig.accessKeyId || !storageConfig.secretAccessKey) {
|
|
22
|
-
throw new Error("STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY are required when storage driver is s3");
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (redisConfig.enabled) {
|
|
27
|
-
try {
|
|
28
|
-
const url = new URL(redisConfig.url);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
1
|
+
import { databaseConfig } from "./database.js";
|
|
2
|
+
import { mailConfig } from "./mail.js";
|
|
3
|
+
import { redisConfig } from "./redis.js";
|
|
4
|
+
import { storageConfig } from "./storage.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Why: Validates that resolved configs are internally consistent at startup.
|
|
8
|
+
* When: Called before any framework subsystem initializes.
|
|
9
|
+
* Where: kernel.ts, before storage.init() and initRedis().
|
|
10
|
+
* How: Checks cross-config dependencies and throws clear errors for inconsistencies.
|
|
11
|
+
*/
|
|
12
|
+
export function validateConfig(): void {
|
|
13
|
+
if (!databaseConfig.url) {
|
|
14
|
+
throw new Error("DATABASE_URL is required but is empty");
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (storageConfig.driver === "s3") {
|
|
18
|
+
if (!storageConfig.bucket) {
|
|
19
|
+
throw new Error("STORAGE_BUCKET is required when storage driver is s3");
|
|
20
|
+
}
|
|
21
|
+
if (!storageConfig.accessKeyId || !storageConfig.secretAccessKey) {
|
|
22
|
+
throw new Error("STORAGE_ACCESS_KEY_ID and STORAGE_SECRET_ACCESS_KEY are required when storage driver is s3");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (redisConfig.enabled) {
|
|
27
|
+
try {
|
|
28
|
+
const url = new URL(redisConfig.url);
|
|
29
|
+
|
|
30
|
+
// Ensure it starts with redis:// or rediss://
|
|
31
|
+
if (url.protocol !== "redis:" && url.protocol !== "rediss:") {
|
|
32
|
+
throw new Error("URL must start with redis:// or rediss://");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Hostname is mandatory (e.g., localhost, 127.0.0.1, redis-container)
|
|
36
|
+
if (!url.hostname) {
|
|
37
|
+
throw new Error("URL must include a valid hostname");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Note: We do NOT check if the port is empty.
|
|
41
|
+
// ioredis automatically defaults to 6379 if no port is provided.
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new Error(`REDIS_URL is invalid: "${redisConfig.url}" — ${error instanceof Error ? error.message : error}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!mailConfig.failSilent && !mailConfig.username) {
|
|
48
|
+
throw new Error("MAIL_USERNAME is required when MAIL_FAIL_SILENT is false");
|
|
49
|
+
}
|
|
50
|
+
}
|