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,74 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
|
+
import { HttpStatusCodes } from "@/framework/facade.js";
|
|
3
|
+
import { {{ServiceName}} } from "@/modules/{{module}}/services/{{controller}}.js";
|
|
4
|
+
|
|
5
|
+
type IdRequest = FastifyRequest<{ Params: { id: number } }>;
|
|
6
|
+
type BodyRequest = FastifyRequest<{ Body: Record<string, unknown> }>;
|
|
7
|
+
type UpdateRequest = FastifyRequest<{ Params: { id: number }; Body: Record<string, unknown> }>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Why: Returns every {{controller}} row for list screens.
|
|
11
|
+
* When: Used by GET list endpoint.
|
|
12
|
+
* Where: GET /{{controller}} route.
|
|
13
|
+
*/
|
|
14
|
+
export const index = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
15
|
+
const data = await {{ServiceName}}.list();
|
|
16
|
+
|
|
17
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} list fetched successfully", data });
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Why: Returns one {{controller}} row by validated route id.
|
|
22
|
+
* When: Used by detail screens or fetch-by-id calls.
|
|
23
|
+
* Where: GET /{{controller}}/:id route.
|
|
24
|
+
*/
|
|
25
|
+
export const show = async (request: IdRequest, reply: FastifyReply) => {
|
|
26
|
+
const data = await {{ServiceName}}.findOne(request.params.id);
|
|
27
|
+
|
|
28
|
+
if (!data) {
|
|
29
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} fetched successfully", data });
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Why: Creates a new {{controller}} row from a validated request body.
|
|
37
|
+
* When: Used by create form submissions.
|
|
38
|
+
* Where: POST /{{controller}} route.
|
|
39
|
+
*/
|
|
40
|
+
export const store = async (request: BodyRequest, reply: FastifyReply) => {
|
|
41
|
+
const data = await {{ServiceName}}.create(request.body);
|
|
42
|
+
|
|
43
|
+
return reply.code(HttpStatusCodes.CREATED).send({ message: "{{controller}} created successfully", data });
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Why: Updates an existing {{controller}} row using id + body validation.
|
|
48
|
+
* When: Used by edit/update form submissions.
|
|
49
|
+
* Where: PUT/PATCH /{{controller}}/:id route.
|
|
50
|
+
*/
|
|
51
|
+
export const update = async (request: UpdateRequest, reply: FastifyReply) => {
|
|
52
|
+
const data = await {{ServiceName}}.update(request.params.id, request.body);
|
|
53
|
+
|
|
54
|
+
if (!data) {
|
|
55
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} updated successfully", data });
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Why: Deletes one {{controller}} row by validated route id.
|
|
63
|
+
* When: Used by delete actions.
|
|
64
|
+
* Where: DELETE /{{controller}}/:id route.
|
|
65
|
+
*/
|
|
66
|
+
export const destroy = async (request: IdRequest, reply: FastifyReply) => {
|
|
67
|
+
const data = await {{ServiceName}}.remove(request.params.id);
|
|
68
|
+
|
|
69
|
+
if (!data) {
|
|
70
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} deleted successfully" });
|
|
74
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
|
+
import { HttpStatusCodes } from "@/framework/facade.js";
|
|
3
|
+
import { validate } from "@/framework/facade.js";
|
|
4
|
+
import { Create{{ClassName}}Schema, Update{{ClassName}}Schema, {{ClassName}}IdParamsSchema } from "@/modules/{{module}}/schemas/{{controller}}.js";
|
|
5
|
+
import { {{ServiceName}} } from "@/modules/{{module}}/services/{{controller}}.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Why: Returns every {{controller}} row for list screens.
|
|
9
|
+
* When: Used by GET list endpoint.
|
|
10
|
+
* Where: GET /{{controller}} route.
|
|
11
|
+
*/
|
|
12
|
+
export const index = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
13
|
+
const data = await {{ServiceName}}.list();
|
|
14
|
+
|
|
15
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} list fetched successfully", data });
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Why: Returns one {{controller}} row by validated route id.
|
|
20
|
+
* When: Used by detail screens or fetch-by-id calls.
|
|
21
|
+
* Where: GET /{{controller}}/:id route.
|
|
22
|
+
*/
|
|
23
|
+
export const show = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
24
|
+
const params = await validate({{ClassName}}IdParamsSchema, request.params);
|
|
25
|
+
const data = await {{ServiceName}}.findOne(params.id);
|
|
26
|
+
|
|
27
|
+
if (!data) {
|
|
28
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} fetched successfully", data });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Why: Creates a new {{controller}} row from a validated request body.
|
|
36
|
+
* When: Used by create form submissions.
|
|
37
|
+
* Where: POST /{{controller}} route.
|
|
38
|
+
*/
|
|
39
|
+
export const store = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
40
|
+
const body = await validate(Create{{ClassName}}Schema, request.body);
|
|
41
|
+
const data = await {{ServiceName}}.create(body);
|
|
42
|
+
|
|
43
|
+
return reply.code(HttpStatusCodes.CREATED).send({ message: "{{controller}} created successfully", data });
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Why: Updates an existing {{controller}} row using id + body validation.
|
|
48
|
+
* When: Used by edit/update form submissions.
|
|
49
|
+
* Where: PUT/PATCH /{{controller}}/:id route.
|
|
50
|
+
*/
|
|
51
|
+
export const update = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
52
|
+
const params = await validate({{ClassName}}IdParamsSchema, request.params);
|
|
53
|
+
const body = await validate(Update{{ClassName}}Schema, request.body);
|
|
54
|
+
const data = await {{ServiceName}}.update(params.id, body);
|
|
55
|
+
|
|
56
|
+
if (!data) {
|
|
57
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} updated successfully", data });
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Why: Deletes one {{controller}} row by validated route id.
|
|
65
|
+
* When: Used by delete actions.
|
|
66
|
+
* Where: DELETE /{{controller}}/:id route.
|
|
67
|
+
*/
|
|
68
|
+
export const destroy = async (request: FastifyRequest, reply: FastifyReply) => {
|
|
69
|
+
const params = await validate({{ClassName}}IdParamsSchema, request.params);
|
|
70
|
+
const data = await {{ServiceName}}.remove(params.id);
|
|
71
|
+
|
|
72
|
+
if (!data) {
|
|
73
|
+
return reply.code(HttpStatusCodes.NOT_FOUND).send({ message: "{{controller}} not found" });
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} deleted successfully" });
|
|
77
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { FastifyReply, FastifyRequest } from "fastify";
|
|
2
|
+
import { HttpStatusCodes } from "@/framework/facade.js";
|
|
3
|
+
|
|
4
|
+
type IdRequest = FastifyRequest<{ Params: { id: number } }>;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Why: Returns collection response shape for list pages.
|
|
8
|
+
* When: Used by GET list endpoint.
|
|
9
|
+
* Where: GET /{{controller}} route.
|
|
10
|
+
*/
|
|
11
|
+
export const index = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
12
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} list fetched successfully", data: [] });
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Why: Returns one resource by validated route id.
|
|
17
|
+
* When: Used by detail screens or fetch-by-id calls.
|
|
18
|
+
* Where: GET /{{controller}}/:id route.
|
|
19
|
+
*/
|
|
20
|
+
export const show = async (request: IdRequest, reply: FastifyReply) => {
|
|
21
|
+
return reply
|
|
22
|
+
.code(HttpStatusCodes.OK)
|
|
23
|
+
.send({ message: "{{controller}} fetched successfully", data: { id: request.params.id, name: "" } });
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Why: Creates a new resource from validated request body.
|
|
28
|
+
* When: Used by create form submissions.
|
|
29
|
+
* Where: POST /{{controller}} route.
|
|
30
|
+
*/
|
|
31
|
+
export const store = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
32
|
+
return reply.code(HttpStatusCodes.CREATED).send({ message: "{{controller}} created successfully" });
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Why: Updates an existing resource using id + body validation.
|
|
37
|
+
* When: Used by edit/update form submissions.
|
|
38
|
+
* Where: PUT/PATCH /{{controller}}/:id route.
|
|
39
|
+
*/
|
|
40
|
+
export const update = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
41
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} updated successfully" });
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Why: Deletes one resource by validated route id.
|
|
46
|
+
* When: Used by delete actions.
|
|
47
|
+
* Where: DELETE /{{controller}}/:id route.
|
|
48
|
+
*/
|
|
49
|
+
export const destroy = async (_request: FastifyRequest, reply: FastifyReply) => {
|
|
50
|
+
return reply.code(HttpStatusCodes.OK).send({ message: "{{controller}} deleted successfully" });
|
|
51
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
ARG BUN_VERSION=1.4.0
|
|
2
|
+
FROM oven/bun:${BUN_VERSION}-slim AS builder
|
|
3
|
+
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
|
|
6
|
+
ENV APP_URL=http://localhost:3000
|
|
7
|
+
ARG UI=true
|
|
8
|
+
ENV UI=${UI}
|
|
9
|
+
|
|
10
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
11
|
+
ca-certificates \
|
|
12
|
+
python3 \
|
|
13
|
+
make \
|
|
14
|
+
g++ \
|
|
15
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
16
|
+
|
|
17
|
+
COPY package.json bun.lockb* bun.lock* package-lock.json* ./
|
|
18
|
+
RUN bun install --frozen-lockfile
|
|
19
|
+
|
|
20
|
+
COPY . .
|
|
21
|
+
RUN cp deploy/.env .env || true
|
|
22
|
+
RUN bun src/framework/maker-cli/index.mjs db:schema
|
|
23
|
+
RUN bun run build
|
|
24
|
+
|
|
25
|
+
FROM oven/bun:${BUN_VERSION}-slim AS runner
|
|
26
|
+
|
|
27
|
+
WORKDIR /app
|
|
28
|
+
|
|
29
|
+
ENV NODE_ENV=production
|
|
30
|
+
ENV APP_URL=http://localhost:3000
|
|
31
|
+
|
|
32
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
33
|
+
supervisor \
|
|
34
|
+
ca-certificates \
|
|
35
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
36
|
+
|
|
37
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
38
|
+
COPY --from=builder /app/package.json ./package.json
|
|
39
|
+
COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts
|
|
40
|
+
COPY --from=builder /app/tsconfig.json ./tsconfig.json
|
|
41
|
+
COPY --from=builder /app/dist ./dist
|
|
42
|
+
COPY --from=builder /app/public ./public
|
|
43
|
+
COPY --from=builder /app/src ./src
|
|
44
|
+
COPY --from=builder /app/deploy/scripts ./deploy/scripts
|
|
45
|
+
COPY --from=builder /app/deploy/.env ./.env
|
|
46
|
+
|
|
47
|
+
COPY deploy/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
|
48
|
+
|
|
49
|
+
EXPOSE 3000
|
|
50
|
+
|
|
51
|
+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
|
52
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
ARG NODE_VERSION=24
|
|
2
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS builder
|
|
3
|
+
|
|
4
|
+
ARG PNPM_VERSION=10.33.2
|
|
5
|
+
ARG UI=true
|
|
6
|
+
ENV UI=${UI}
|
|
7
|
+
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
|
|
10
|
+
ENV APP_URL=http://localhost:3000
|
|
11
|
+
|
|
12
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
13
|
+
ca-certificates \
|
|
14
|
+
python3 \
|
|
15
|
+
make \
|
|
16
|
+
g++ \
|
|
17
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
18
|
+
|
|
19
|
+
RUN corepack enable && corepack prepare pnpm@${PNPM_VERSION} --activate
|
|
20
|
+
|
|
21
|
+
COPY package.json pnpm-lock.yaml* ./
|
|
22
|
+
RUN if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile; else pnpm install --no-frozen-lockfile; fi
|
|
23
|
+
|
|
24
|
+
COPY . .
|
|
25
|
+
RUN node src/framework/maker-cli/index.mjs db:schema
|
|
26
|
+
RUN pnpm run build
|
|
27
|
+
|
|
28
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS runner
|
|
29
|
+
|
|
30
|
+
WORKDIR /app
|
|
31
|
+
|
|
32
|
+
ENV NODE_ENV=production
|
|
33
|
+
ENV APP_URL=http://localhost:3000
|
|
34
|
+
|
|
35
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
36
|
+
supervisor \
|
|
37
|
+
ca-certificates \
|
|
38
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
39
|
+
|
|
40
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
41
|
+
COPY --from=builder /app/package.json ./package.json
|
|
42
|
+
COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts
|
|
43
|
+
COPY --from=builder /app/tsconfig.json ./tsconfig.json
|
|
44
|
+
COPY --from=builder /app/dist ./dist
|
|
45
|
+
COPY --from=builder /app/public ./public
|
|
46
|
+
COPY --from=builder /app/src ./src
|
|
47
|
+
COPY --from=builder /app/deploy/scripts ./deploy/scripts
|
|
48
|
+
COPY --from=builder /app/deploy/.env ./.env
|
|
49
|
+
|
|
50
|
+
COPY deploy/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
|
51
|
+
|
|
52
|
+
EXPOSE 3000
|
|
53
|
+
|
|
54
|
+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
|
55
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
ARG NODE_VERSION=24
|
|
2
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS builder
|
|
3
|
+
|
|
4
|
+
WORKDIR /app
|
|
5
|
+
|
|
6
|
+
ENV APP_URL=http://localhost:3000
|
|
7
|
+
ARG UI=true
|
|
8
|
+
ENV UI=${UI}
|
|
9
|
+
|
|
10
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
11
|
+
ca-certificates \
|
|
12
|
+
python3 \
|
|
13
|
+
make \
|
|
14
|
+
g++ \
|
|
15
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
16
|
+
|
|
17
|
+
COPY package.json package-lock.json* ./
|
|
18
|
+
RUN if [ -f package-lock.json ]; then npm ci --legacy-peer-deps || npm install --legacy-peer-deps; else npm install --legacy-peer-deps; fi
|
|
19
|
+
|
|
20
|
+
COPY . .
|
|
21
|
+
RUN node src/framework/maker-cli/index.mjs db:schema
|
|
22
|
+
RUN npm run build
|
|
23
|
+
|
|
24
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS runner
|
|
25
|
+
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
|
|
28
|
+
ENV NODE_ENV=production
|
|
29
|
+
ENV APP_URL=http://localhost:3000
|
|
30
|
+
|
|
31
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
32
|
+
supervisor \
|
|
33
|
+
ca-certificates \
|
|
34
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
35
|
+
|
|
36
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
37
|
+
COPY --from=builder /app/package.json ./package.json
|
|
38
|
+
COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts
|
|
39
|
+
COPY --from=builder /app/tsconfig.json ./tsconfig.json
|
|
40
|
+
COPY --from=builder /app/dist ./dist
|
|
41
|
+
COPY --from=builder /app/public ./public
|
|
42
|
+
COPY --from=builder /app/src ./src
|
|
43
|
+
COPY --from=builder /app/deploy/scripts ./deploy/scripts
|
|
44
|
+
COPY --from=builder /app/deploy/.env ./.env
|
|
45
|
+
|
|
46
|
+
COPY deploy/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
|
47
|
+
|
|
48
|
+
EXPOSE 3000
|
|
49
|
+
|
|
50
|
+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
|
51
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
ARG NODE_VERSION=24
|
|
2
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS builder
|
|
3
|
+
|
|
4
|
+
ARG YARN_VERSION=1.22.22
|
|
5
|
+
ARG UI=true
|
|
6
|
+
ENV UI=${UI}
|
|
7
|
+
|
|
8
|
+
WORKDIR /app
|
|
9
|
+
|
|
10
|
+
ENV APP_URL=http://localhost:3000
|
|
11
|
+
|
|
12
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
13
|
+
ca-certificates \
|
|
14
|
+
python3 \
|
|
15
|
+
make \
|
|
16
|
+
g++ \
|
|
17
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
18
|
+
|
|
19
|
+
RUN corepack enable && corepack prepare yarn@${YARN_VERSION} --activate
|
|
20
|
+
|
|
21
|
+
COPY package.json yarn.lock* ./
|
|
22
|
+
RUN yarn install --immutable
|
|
23
|
+
|
|
24
|
+
COPY . .
|
|
25
|
+
RUN node src/framework/maker-cli/index.mjs db:schema
|
|
26
|
+
RUN yarn build
|
|
27
|
+
|
|
28
|
+
FROM node:${NODE_VERSION}-bookworm-slim AS runner
|
|
29
|
+
|
|
30
|
+
WORKDIR /app
|
|
31
|
+
|
|
32
|
+
ENV NODE_ENV=production
|
|
33
|
+
ENV APP_URL=http://localhost:3000
|
|
34
|
+
|
|
35
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
36
|
+
supervisor \
|
|
37
|
+
ca-certificates \
|
|
38
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
39
|
+
|
|
40
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
41
|
+
COPY --from=builder /app/package.json ./package.json
|
|
42
|
+
COPY --from=builder /app/drizzle.config.ts ./drizzle.config.ts
|
|
43
|
+
COPY --from=builder /app/tsconfig.json ./tsconfig.json
|
|
44
|
+
COPY --from=builder /app/dist ./dist
|
|
45
|
+
COPY --from=builder /app/public ./public
|
|
46
|
+
COPY --from=builder /app/src ./src
|
|
47
|
+
COPY --from=builder /app/deploy/scripts ./deploy/scripts
|
|
48
|
+
COPY --from=builder /app/deploy/.env ./.env
|
|
49
|
+
|
|
50
|
+
COPY deploy/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
|
|
51
|
+
|
|
52
|
+
EXPOSE 3000
|
|
53
|
+
|
|
54
|
+
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
|
|
55
|
+
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Deploy
|
|
2
|
+
|
|
3
|
+
Generated from current project .env.
|
|
4
|
+
|
|
5
|
+
- Database mode: {{DATABASE_MODE}}
|
|
6
|
+
- Redis enabled: {{REDIS_STATUS}}
|
|
7
|
+
- Runtime: {{RUNTIME_NAME}}
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- External docker networks exist:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
docker network create nginx-proxy || true
|
|
15
|
+
docker network create infra || true
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
- Proxy stack from `server-setup` is running (jwilder + letsencrypt companion).
|
|
19
|
+
|
|
20
|
+
## Start app stack
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
docker compose --env-file deploy/server/.env --env-file deploy/.env -f deploy/docker-compose.yml up -d --build
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Equivalent maker command:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
bun maker deploy:workflow --app-only
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## DB Import
|
|
33
|
+
|
|
34
|
+
Import SQL dump into local Docker container (auto-detects MySQL or PostgreSQL):
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
bun maker deploy:db:import --file=deploy/nexwire.sql --database=nexwire
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
PostgreSQL restores into a fresh database by default (drops and recreates the
|
|
41
|
+
target database first). Pass `--no-drop` to keep the existing database.
|
|
42
|
+
|
|
43
|
+
Import SQL dump into remote Docker container (auto-detects MySQL or PostgreSQL):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
bun maker deploy:db:import:remote --config=deploy/workflow.remote.json --file=deploy/nexwire.sql --database=nexwire
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Runtime
|
|
50
|
+
|
|
51
|
+
Supervisor starts:
|
|
52
|
+
|
|
53
|
+
- API: `maker serve --prod --runtime={{RUNTIME_NAME}}`
|
|
54
|
+
{{QUEUE_LINE}}- Scheduler: `maker schedule:work --prod --runtime={{RUNTIME_NAME}}`
|
|
55
|
+
|
|
56
|
+
{{REDIS_NOTE}}
|
|
57
|
+
|
|
58
|
+
This deploy style follows `server-setup` and `statistic_postgre` patterns (external `nginx-proxy` + `infra` networks).
|
|
59
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: ${COMPOSE_PROJECT_NAME:-nexwire}
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
app:
|
|
5
|
+
build:
|
|
6
|
+
context: ..
|
|
7
|
+
dockerfile: deploy/Dockerfile
|
|
8
|
+
args:
|
|
9
|
+
UI: ${UI}
|
|
10
|
+
container_name: ${APP_NAME:-nexwire}-app
|
|
11
|
+
restart: unless-stopped
|
|
12
|
+
working_dir: /app
|
|
13
|
+
ports:
|
|
14
|
+
- "${APP_PORT:-3000}:3000"
|
|
15
|
+
expose:
|
|
16
|
+
- "3000"
|
|
17
|
+
env_file:
|
|
18
|
+
- .env
|
|
19
|
+
environment:
|
|
20
|
+
APP_ENV: production
|
|
21
|
+
APP_PORT: 3000
|
|
22
|
+
APP_URL: ${APP_URL:-http://localhost:3000}
|
|
23
|
+
DATABASE_URL: ${DATABASE_URL}
|
|
24
|
+
{{REDIS_ENV_LINE}} APP_HOST: ${APP_HOST:-localhost}
|
|
25
|
+
VIRTUAL_HOST: ${VIRTUAL_HOST:-}
|
|
26
|
+
VIRTUAL_PORT: ${VIRTUAL_PORT:-3000}
|
|
27
|
+
LETSENCRYPT_HOST: ${LETSENCRYPT_HOST:-}
|
|
28
|
+
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-}
|
|
29
|
+
volumes:
|
|
30
|
+
- app-storage:/app/src/storage
|
|
31
|
+
networks:
|
|
32
|
+
- infra
|
|
33
|
+
- nginx-proxy
|
|
34
|
+
|
|
35
|
+
volumes:
|
|
36
|
+
app-storage:
|
|
37
|
+
|
|
38
|
+
networks:
|
|
39
|
+
infra:
|
|
40
|
+
external: true
|
|
41
|
+
name: infra
|
|
42
|
+
nginx-proxy:
|
|
43
|
+
external: true
|
|
44
|
+
name: nginx-proxy
|
|
45
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: ${COMPOSE_PROJECT_NAME:-nexwire}
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
app:
|
|
5
|
+
build:
|
|
6
|
+
context: ..
|
|
7
|
+
dockerfile: deploy/Dockerfile
|
|
8
|
+
args:
|
|
9
|
+
UI: ${UI}
|
|
10
|
+
container_name: ${APP_NAME:-nexwire}-app
|
|
11
|
+
restart: unless-stopped
|
|
12
|
+
working_dir: /app
|
|
13
|
+
ports:
|
|
14
|
+
- "${APP_PORT:-3000}:3000"
|
|
15
|
+
expose:
|
|
16
|
+
- "3000"
|
|
17
|
+
env_file:
|
|
18
|
+
- .env
|
|
19
|
+
environment:
|
|
20
|
+
APP_ENV: production
|
|
21
|
+
APP_PORT: 3000
|
|
22
|
+
APP_URL: ${APP_URL:-http://localhost:3000}
|
|
23
|
+
DATABASE_URL: ${DATABASE_URL}
|
|
24
|
+
{{REDIS_ENV_LINE}} APP_HOST: ${APP_HOST:-localhost}
|
|
25
|
+
VIRTUAL_HOST: ${VIRTUAL_HOST:-}
|
|
26
|
+
VIRTUAL_PORT: ${VIRTUAL_PORT:-3000}
|
|
27
|
+
LETSENCRYPT_HOST: ${LETSENCRYPT_HOST:-}
|
|
28
|
+
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-}
|
|
29
|
+
volumes:
|
|
30
|
+
- app-storage:/app/src/storage
|
|
31
|
+
networks:
|
|
32
|
+
- infra
|
|
33
|
+
- nginx-proxy
|
|
34
|
+
|
|
35
|
+
volumes:
|
|
36
|
+
app-storage:
|
|
37
|
+
|
|
38
|
+
networks:
|
|
39
|
+
infra:
|
|
40
|
+
external: true
|
|
41
|
+
name: infra
|
|
42
|
+
nginx-proxy:
|
|
43
|
+
external: true
|
|
44
|
+
name: nginx-proxy
|
|
45
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: ${COMPOSE_PROJECT_NAME:-nexwire}
|
|
2
|
+
|
|
3
|
+
services:
|
|
4
|
+
app:
|
|
5
|
+
build:
|
|
6
|
+
context: ..
|
|
7
|
+
dockerfile: deploy/Dockerfile
|
|
8
|
+
args:
|
|
9
|
+
UI: ${UI}
|
|
10
|
+
container_name: ${APP_NAME:-nexwire}-app
|
|
11
|
+
restart: unless-stopped
|
|
12
|
+
working_dir: /app
|
|
13
|
+
ports:
|
|
14
|
+
- "${APP_PORT:-3000}:3000"
|
|
15
|
+
expose:
|
|
16
|
+
- "3000"
|
|
17
|
+
env_file:
|
|
18
|
+
- .env
|
|
19
|
+
environment:
|
|
20
|
+
APP_ENV: production
|
|
21
|
+
APP_PORT: 3000
|
|
22
|
+
APP_URL: ${APP_URL:-http://localhost:3000}
|
|
23
|
+
DATABASE_URL: ${DATABASE_URL}
|
|
24
|
+
{{REDIS_ENV_LINE}} APP_HOST: ${APP_HOST:-localhost}
|
|
25
|
+
VIRTUAL_HOST: ${VIRTUAL_HOST:-}
|
|
26
|
+
VIRTUAL_PORT: ${VIRTUAL_PORT:-3000}
|
|
27
|
+
LETSENCRYPT_HOST: ${LETSENCRYPT_HOST:-}
|
|
28
|
+
LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL:-}
|
|
29
|
+
volumes:
|
|
30
|
+
- app-storage:/app/src/storage
|
|
31
|
+
networks:
|
|
32
|
+
- infra
|
|
33
|
+
- nginx-proxy
|
|
34
|
+
|
|
35
|
+
volumes:
|
|
36
|
+
app-storage:
|
|
37
|
+
|
|
38
|
+
networks:
|
|
39
|
+
infra:
|
|
40
|
+
external: true
|
|
41
|
+
name: infra
|
|
42
|
+
nginx-proxy:
|
|
43
|
+
external: true
|
|
44
|
+
name: nginx-proxy
|
|
45
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# App deploy env template (shared for local + remote)
|
|
2
|
+
# Local: use this as deploy/.env
|
|
3
|
+
# Remote: use this as deploy/.env
|
|
4
|
+
# Runtime settings (mail, storage, cors, log level, toggles, expiries) live in
|
|
5
|
+
# src/config/*. Only app basics, secrets, and infra vars belong in this file.
|
|
6
|
+
# ── App ────────────────────────────────────────────
|
|
7
|
+
APP_ENV=production
|
|
8
|
+
APP_NAME=nexwire
|
|
9
|
+
APP_HOST=localhost
|
|
10
|
+
APP_PORT=3000
|
|
11
|
+
|
|
12
|
+
# Full public URL the app is served at (used for links, redirects, CORS)
|
|
13
|
+
# Local: http://localhost:3000 | Remote: https://your-domain.com
|
|
14
|
+
APP_URL=http://localhost:3000
|
|
15
|
+
|
|
16
|
+
# Run "db:migrate --seed" automatically on container start (true/false)
|
|
17
|
+
AUTO_MIGRATE=true
|
|
18
|
+
|
|
19
|
+
# UI origin (only needed when UI is on a different domain than API)
|
|
20
|
+
# Leave empty if UI is served from the same APP_URL or UI=false
|
|
21
|
+
FRONTEND_URL={{FRONTEND_URL}}
|
|
22
|
+
|
|
23
|
+
# ── Reverse Proxy (nginx-proxy) ────────────────────
|
|
24
|
+
# Remote only: nginx-proxy routes by VIRTUAL_HOST and auto-issues Let's Encrypt certs.
|
|
25
|
+
# Leave empty for local-only deploys.
|
|
26
|
+
VIRTUAL_HOST=
|
|
27
|
+
VIRTUAL_PORT=3000
|
|
28
|
+
LETSENCRYPT_HOST=
|
|
29
|
+
LETSENCRYPT_EMAIL=
|
|
30
|
+
|
|
31
|
+
# ── Database ───────────────────────────────────────
|
|
32
|
+
# Set the password and database name to match deploy/server/.env
|
|
33
|
+
DATABASE_URL=mysql://root:change-me-root@mysql-global:3306/nexwire
|
|
34
|
+
|
|
35
|
+
# ── JWT Auth (expiries live in src/config/jwt.ts) ──
|
|
36
|
+
JWT_ACCESS_SECRET={{JWT_ACCESS_SECRET}}
|
|
37
|
+
JWT_REFRESH_SECRET={{JWT_REFRESH_SECRET}}
|
|
38
|
+
|
|
39
|
+
# ── Cookie (name lives in src/config/cookie.ts) ────
|
|
40
|
+
COOKIE_SECRET={{COOKIE_SECRET}}
|
|
41
|
+
|
|
42
|
+
# ── Storage credentials (driver/disk/bucket live in src/config/storage.ts) ──
|
|
43
|
+
STORAGE_ACCESS_KEY_ID={{STORAGE_ACCESS_KEY_ID}}
|
|
44
|
+
STORAGE_SECRET_ACCESS_KEY={{STORAGE_SECRET_ACCESS_KEY}}
|
|
45
|
+
|
|
46
|
+
# ── Mail credentials (host/port/encryption live in src/config/mail.ts) ──
|
|
47
|
+
MAIL_USERNAME=
|
|
48
|
+
MAIL_PASSWORD=
|
|
49
|
+
|
|
50
|
+
# ── Redis ──────────────────────────────────────────
|
|
51
|
+
# Enables/disables cache, session, queue, events, Queue Dashboard (all Redis-backed services)
|
|
52
|
+
REDIS={{REDIS_ENABLED}}
|
|
53
|
+
REDIS_URL=redis://redis-global:6379
|
|
54
|
+
REDIS_PREFIX={{REDIS_PREFIX}}
|
|
55
|
+
|
|
56
|
+
# ── Feature Toggle (build) ─────────────────────────
|
|
57
|
+
# Enable/disable UI build and serving. Set false for API-only mode
|
|
58
|
+
UI={{UI}}
|
|
59
|
+
|
|
60
|
+
# ── Feature Toggle ─────────────────────────────────
|
|
61
|
+
# OpenAPI / Scalar docs at /api-docs. Set true to enable.
|
|
62
|
+
OPEN_API={{OPEN_API}}
|
|
63
|
+
# Socket.IO realtime server. Set false to disable.
|
|
64
|
+
SOCKET={{SOCKET}}
|
|
65
|
+
# Security headers (CSP, HSTS, X-Frame). Set false to disable.
|
|
66
|
+
SECURITY_HEADERS={{SECURITY_HEADERS}}
|
|
67
|
+
|
|
68
|
+
|