exisjs 0.6.1 → 0.7.1
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 +9 -3
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +2 -8
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +33 -44
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/exports.d.ts.map +1 -1
- package/dist/cli/commands/exports.js +5 -32
- package/dist/cli/commands/exports.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +2 -13
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +27 -60
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +4 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -6
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +11 -23
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/routes.d.ts.map +1 -1
- package/dist/cli/routes.js +20 -8
- package/dist/cli/routes.js.map +1 -1
- package/dist/config/config.d.ts +2 -1
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +7 -5
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +3 -2
- package/dist/config/env.js.map +1 -1
- package/dist/config/types.d.ts +7 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/decorators/constants.d.ts +9 -2
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +3 -2
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core/metadata.d.ts +31 -0
- package/dist/decorators/core/metadata.d.ts.map +1 -1
- package/dist/decorators/core/metadata.js +110 -1
- package/dist/decorators/core/metadata.js.map +1 -1
- package/dist/decorators/core.d.ts +19 -4
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +29 -4
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/middleware.d.ts +17 -17
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +111 -208
- package/dist/decorators/middleware.js.map +1 -1
- package/dist/decorators/params.d.ts +54 -12
- package/dist/decorators/params.d.ts.map +1 -1
- package/dist/decorators/params.js +40 -20
- package/dist/decorators/params.js.map +1 -1
- package/dist/decorators/routing.d.ts +0 -2
- package/dist/decorators/routing.d.ts.map +1 -1
- package/dist/decorators/routing.js +3 -4
- package/dist/decorators/routing.js.map +1 -1
- package/dist/di/container.d.ts +5 -1
- package/dist/di/container.d.ts.map +1 -1
- package/dist/di/container.js +56 -8
- package/dist/di/container.js.map +1 -1
- package/dist/di/decorators.d.ts +30 -0
- package/dist/di/decorators.d.ts.map +1 -0
- package/dist/di/decorators.js +59 -0
- package/dist/di/decorators.js.map +1 -0
- package/dist/di/index.d.ts +1 -0
- package/dist/di/index.d.ts.map +1 -1
- package/dist/di/index.js +4 -1
- package/dist/di/index.js.map +1 -1
- package/dist/docs/ARCHITECTURE.md +46 -285
- package/dist/docs/BENCHMARKS.md +5 -5
- package/dist/docs/README.md +8 -11
- package/dist/docs/content/boundaries.mdx +151 -0
- package/dist/docs/content/cli/commands.mdx +66 -104
- package/dist/docs/content/cli/overview.mdx +37 -47
- package/dist/docs/content/cli/usage.mdx +29 -15
- package/dist/docs/content/decorators.mdx +142 -81
- package/dist/docs/content/installation.mdx +20 -1
- package/dist/docs/content/middleware.mdx +65 -291
- package/dist/docs/content/modules.mdx +22 -1
- package/dist/docs/content/providers.mdx +33 -1
- package/dist/docs/content/security.mdx +44 -246
- package/dist/docs/content/structure.mdx +227 -100
- package/dist/docs/content/validation.mdx +0 -17
- package/dist/docs/reference/decorators.mdx +34 -216
- package/dist/docs/reference/di.mdx +35 -11
- package/dist/docs/reference/logger.mdx +100 -0
- package/dist/docs/reference/middleware.mdx +41 -217
- package/dist/docs/reference/router.mdx +9 -9
- package/dist/docs/reference/validator.mdx +2 -5
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +19 -5
- package/dist/error/errors.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/start-server.js +10 -0
- package/dist/lib/start-server.js.map +1 -1
- package/dist/logger/index.d.ts +81 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +142 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/middleware/dedupe.d.ts +1 -1
- package/dist/middleware/dedupe.js +1 -1
- package/dist/middleware/middleware.d.ts +3 -5
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +2 -6
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts +0 -2
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +2 -14
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/module/index.d.ts +2 -0
- package/dist/module/index.d.ts.map +1 -1
- package/dist/module/index.js +3 -1
- package/dist/module/index.js.map +1 -1
- package/dist/plugin/manager.d.ts +1 -1
- package/dist/plugin/manager.d.ts.map +1 -1
- package/dist/plugin/manager.js +47 -0
- package/dist/plugin/manager.js.map +1 -1
- package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
- package/dist/router/boundary.d.ts.map +1 -0
- package/dist/router/boundary.js +11 -0
- package/dist/router/boundary.js.map +1 -0
- package/dist/router/controller-registrar.d.ts.map +1 -1
- package/dist/router/controller-registrar.js +33 -6
- package/dist/router/controller-registrar.js.map +1 -1
- package/dist/router/index.d.ts +3 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js +3 -7
- package/dist/router/index.js.map +1 -1
- package/dist/router/route-builder.d.ts +0 -28
- package/dist/router/route-builder.d.ts.map +1 -1
- package/dist/router/route-builder.js +2 -5
- package/dist/router/route-builder.js.map +1 -1
- package/dist/router/route-scanner.d.ts +1 -2
- package/dist/router/route-scanner.d.ts.map +1 -1
- package/dist/router/route-scanner.js +225 -203
- package/dist/router/route-scanner.js.map +1 -1
- package/dist/router/router.d.ts +4 -6
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/router.js +36 -72
- package/dist/router/router.js.map +1 -1
- package/dist/router/types.d.ts +2 -6
- package/dist/router/types.d.ts.map +1 -1
- package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
- package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
- package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
- package/dist/server/adapters/bun-adapter.js.map +1 -0
- package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
- package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
- package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
- package/dist/server/adapters/uws-adapter.js.map +1 -0
- package/dist/server/app.d.ts +10 -31
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +20 -135
- package/dist/server/app.js.map +1 -1
- package/dist/server/bootstrapper.d.ts +4 -15
- package/dist/server/bootstrapper.d.ts.map +1 -1
- package/dist/server/bootstrapper.js +30 -229
- package/dist/server/bootstrapper.js.map +1 -1
- package/dist/server/define.d.ts +2 -2
- package/dist/server/define.d.ts.map +1 -1
- package/dist/server/define.js +3 -3
- package/dist/server/define.js.map +1 -1
- package/dist/server/engines/bun-engine.d.ts +16 -0
- package/dist/server/engines/bun-engine.d.ts.map +1 -0
- package/dist/server/engines/bun-engine.js +41 -0
- package/dist/server/engines/bun-engine.js.map +1 -0
- package/dist/server/engines/engine.d.ts +16 -0
- package/dist/server/engines/engine.d.ts.map +1 -0
- package/dist/{queue/types.js → server/engines/engine.js} +1 -1
- package/dist/server/engines/engine.js.map +1 -0
- package/dist/server/engines/node-engine.d.ts +22 -0
- package/dist/server/engines/node-engine.d.ts.map +1 -0
- package/dist/server/engines/node-engine.js +130 -0
- package/dist/server/engines/node-engine.js.map +1 -0
- package/dist/server/engines/uws-engine.d.ts +16 -0
- package/dist/server/engines/uws-engine.d.ts.map +1 -0
- package/dist/server/engines/uws-engine.js +48 -0
- package/dist/server/engines/uws-engine.js.map +1 -0
- package/dist/server/request-handler.d.ts +0 -1
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/server/request-handler.js +74 -48
- package/dist/server/request-handler.js.map +1 -1
- package/dist/server/request.d.ts +0 -8
- package/dist/server/request.d.ts.map +1 -1
- package/dist/server/request.js +0 -16
- package/dist/server/request.js.map +1 -1
- package/dist/server/response.d.ts.map +1 -1
- package/dist/server/response.js +2 -1
- package/dist/server/response.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +0 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/time.d.ts +6 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +15 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/validator/index.d.ts +1 -7
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js +1 -5
- package/dist/validator/index.js.map +1 -1
- package/dist/validator/tex-types.d.ts +15 -2
- package/dist/validator/tex-types.d.ts.map +1 -1
- package/dist/validator/tex-types.js +8 -0
- package/dist/validator/tex-types.js.map +1 -1
- package/dist/validator/tex.d.ts.map +1 -1
- package/dist/validator/tex.js +21 -2
- package/dist/validator/tex.js.map +1 -1
- package/package.json +9 -151
- package/dist/adapters/aws-lambda.d.ts +0 -21
- package/dist/adapters/aws-lambda.d.ts.map +0 -1
- package/dist/adapters/aws-lambda.js +0 -125
- package/dist/adapters/aws-lambda.js.map +0 -1
- package/dist/adapters/bun.d.ts +0 -9
- package/dist/adapters/bun.d.ts.map +0 -1
- package/dist/adapters/bun.js +0 -23
- package/dist/adapters/bun.js.map +0 -1
- package/dist/adapters/cloudflare.d.ts +0 -10
- package/dist/adapters/cloudflare.d.ts.map +0 -1
- package/dist/adapters/cloudflare.js +0 -22
- package/dist/adapters/cloudflare.js.map +0 -1
- package/dist/adapters/deno.d.ts +0 -7
- package/dist/adapters/deno.d.ts.map +0 -1
- package/dist/adapters/deno.js +0 -21
- package/dist/adapters/deno.js.map +0 -1
- package/dist/adapters/fastly.d.ts +0 -6
- package/dist/adapters/fastly.d.ts.map +0 -1
- package/dist/adapters/fastly.js +0 -20
- package/dist/adapters/fastly.js.map +0 -1
- package/dist/adapters/fetch.d.ts +0 -30
- package/dist/adapters/fetch.d.ts.map +0 -1
- package/dist/adapters/fetch.js +0 -119
- package/dist/adapters/fetch.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -9
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -28
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/netlify.d.ts +0 -8
- package/dist/adapters/netlify.d.ts.map +0 -1
- package/dist/adapters/netlify.js +0 -20
- package/dist/adapters/netlify.js.map +0 -1
- package/dist/adapters/vercel.d.ts +0 -17
- package/dist/adapters/vercel.d.ts.map +0 -1
- package/dist/adapters/vercel.js +0 -23
- package/dist/adapters/vercel.js.map +0 -1
- package/dist/auth/index.d.ts +0 -8
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -49
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/jwt.d.ts +0 -20
- package/dist/auth/jwt.d.ts.map +0 -1
- package/dist/auth/jwt.js +0 -59
- package/dist/auth/jwt.js.map +0 -1
- package/dist/auth/oauth/core.d.ts +0 -96
- package/dist/auth/oauth/core.d.ts.map +0 -1
- package/dist/auth/oauth/core.js +0 -203
- package/dist/auth/oauth/core.js.map +0 -1
- package/dist/auth/oauth/index.d.ts +0 -45
- package/dist/auth/oauth/index.d.ts.map +0 -1
- package/dist/auth/oauth/index.js +0 -64
- package/dist/auth/oauth/index.js.map +0 -1
- package/dist/auth/oauth/middleware.d.ts +0 -63
- package/dist/auth/oauth/middleware.d.ts.map +0 -1
- package/dist/auth/oauth/middleware.js +0 -164
- package/dist/auth/oauth/middleware.js.map +0 -1
- package/dist/auth/oauth/providers/custom.d.ts +0 -41
- package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
- package/dist/auth/oauth/providers/custom.js +0 -204
- package/dist/auth/oauth/providers/custom.js.map +0 -1
- package/dist/auth/oauth/providers/discord.d.ts +0 -23
- package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
- package/dist/auth/oauth/providers/discord.js +0 -130
- package/dist/auth/oauth/providers/discord.js.map +0 -1
- package/dist/auth/oauth/providers/facebook.d.ts +0 -28
- package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
- package/dist/auth/oauth/providers/facebook.js +0 -124
- package/dist/auth/oauth/providers/facebook.js.map +0 -1
- package/dist/auth/oauth/providers/github.d.ts +0 -25
- package/dist/auth/oauth/providers/github.d.ts.map +0 -1
- package/dist/auth/oauth/providers/github.js +0 -132
- package/dist/auth/oauth/providers/github.js.map +0 -1
- package/dist/auth/oauth/providers/google.d.ts +0 -23
- package/dist/auth/oauth/providers/google.d.ts.map +0 -1
- package/dist/auth/oauth/providers/google.js +0 -134
- package/dist/auth/oauth/providers/google.js.map +0 -1
- package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
- package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
- package/dist/auth/oauth/providers/microsoft.js +0 -136
- package/dist/auth/oauth/providers/microsoft.js.map +0 -1
- package/dist/auth/oauth/types.d.ts +0 -158
- package/dist/auth/oauth/types.d.ts.map +0 -1
- package/dist/auth/oauth/types.js +0 -4
- package/dist/auth/oauth/types.js.map +0 -1
- package/dist/auth/password.d.ts +0 -25
- package/dist/auth/password.d.ts.map +0 -1
- package/dist/auth/password.js +0 -93
- package/dist/auth/password.js.map +0 -1
- package/dist/auth/rbac.d.ts +0 -10
- package/dist/auth/rbac.d.ts.map +0 -1
- package/dist/auth/rbac.js +0 -34
- package/dist/auth/rbac.js.map +0 -1
- package/dist/auth/session.d.ts +0 -26
- package/dist/auth/session.d.ts.map +0 -1
- package/dist/auth/session.js +0 -134
- package/dist/auth/session.js.map +0 -1
- package/dist/cache/index.d.ts +0 -4
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/index.js +0 -25
- package/dist/cache/index.js.map +0 -1
- package/dist/cache/store.d.ts +0 -58
- package/dist/cache/store.d.ts.map +0 -1
- package/dist/cache/store.js +0 -298
- package/dist/cache/store.js.map +0 -1
- package/dist/cron/parser.d.ts +0 -2
- package/dist/cron/parser.d.ts.map +0 -1
- package/dist/cron/parser.js +0 -52
- package/dist/cron/parser.js.map +0 -1
- package/dist/cron/scheduler.d.ts +0 -23
- package/dist/cron/scheduler.d.ts.map +0 -1
- package/dist/cron/scheduler.js +0 -114
- package/dist/cron/scheduler.js.map +0 -1
- package/dist/database/adapters/mongodb.d.ts +0 -58
- package/dist/database/adapters/mongodb.d.ts.map +0 -1
- package/dist/database/adapters/mongodb.js +0 -264
- package/dist/database/adapters/mongodb.js.map +0 -1
- package/dist/database/adapters/mysql.d.ts +0 -27
- package/dist/database/adapters/mysql.d.ts.map +0 -1
- package/dist/database/adapters/mysql.js +0 -188
- package/dist/database/adapters/mysql.js.map +0 -1
- package/dist/database/adapters/postgres.d.ts +0 -28
- package/dist/database/adapters/postgres.d.ts.map +0 -1
- package/dist/database/adapters/postgres.js +0 -174
- package/dist/database/adapters/postgres.js.map +0 -1
- package/dist/database/adapters/sqlite.d.ts +0 -27
- package/dist/database/adapters/sqlite.d.ts.map +0 -1
- package/dist/database/adapters/sqlite.js +0 -149
- package/dist/database/adapters/sqlite.js.map +0 -1
- package/dist/database/index.d.ts +0 -42
- package/dist/database/index.d.ts.map +0 -1
- package/dist/database/index.js +0 -58
- package/dist/database/index.js.map +0 -1
- package/dist/database/manager.d.ts +0 -141
- package/dist/database/manager.d.ts.map +0 -1
- package/dist/database/manager.js +0 -337
- package/dist/database/manager.js.map +0 -1
- package/dist/database/migration.d.ts +0 -57
- package/dist/database/migration.d.ts.map +0 -1
- package/dist/database/migration.js +0 -329
- package/dist/database/migration.js.map +0 -1
- package/dist/database/query-builder.d.ts +0 -95
- package/dist/database/query-builder.d.ts.map +0 -1
- package/dist/database/query-builder.js +0 -404
- package/dist/database/query-builder.js.map +0 -1
- package/dist/database/sql/index.d.ts +0 -18
- package/dist/database/sql/index.d.ts.map +0 -1
- package/dist/database/sql/index.js +0 -74
- package/dist/database/sql/index.js.map +0 -1
- package/dist/database/sql/schema.d.ts +0 -38
- package/dist/database/sql/schema.d.ts.map +0 -1
- package/dist/database/sql/schema.js +0 -80
- package/dist/database/sql/schema.js.map +0 -1
- package/dist/database/synchronizer.d.ts +0 -12
- package/dist/database/synchronizer.d.ts.map +0 -1
- package/dist/database/synchronizer.js +0 -82
- package/dist/database/synchronizer.js.map +0 -1
- package/dist/database/types.d.ts +0 -184
- package/dist/database/types.d.ts.map +0 -1
- package/dist/database/types.js +0 -4
- package/dist/database/types.js.map +0 -1
- package/dist/dataloader/dataloader.d.ts +0 -23
- package/dist/dataloader/dataloader.d.ts.map +0 -1
- package/dist/dataloader/dataloader.js +0 -98
- package/dist/dataloader/dataloader.js.map +0 -1
- package/dist/dataloader/index.d.ts +0 -3
- package/dist/dataloader/index.d.ts.map +0 -1
- package/dist/dataloader/index.js +0 -19
- package/dist/dataloader/index.js.map +0 -1
- package/dist/dataloader/registry.d.ts +0 -17
- package/dist/dataloader/registry.d.ts.map +0 -1
- package/dist/dataloader/registry.js +0 -47
- package/dist/dataloader/registry.js.map +0 -1
- package/dist/dev/dep-graph.d.ts +0 -2
- package/dist/dev/dep-graph.d.ts.map +0 -1
- package/dist/dev/dep-graph.js +0 -111
- package/dist/dev/dep-graph.js.map +0 -1
- package/dist/dev/hot-reload.d.ts +0 -30
- package/dist/dev/hot-reload.d.ts.map +0 -1
- package/dist/dev/hot-reload.js +0 -262
- package/dist/dev/hot-reload.js.map +0 -1
- package/dist/docs/content/adapters.mdx +0 -199
- package/dist/docs/content/cache.mdx +0 -239
- package/dist/docs/content/circuit-breaker.mdx +0 -130
- package/dist/docs/content/cron.mdx +0 -109
- package/dist/docs/content/database.mdx +0 -278
- package/dist/docs/content/gateways.mdx +0 -376
- package/dist/docs/content/oauth.mdx +0 -179
- package/dist/docs/content/queues.mdx +0 -177
- package/dist/docs/content/rpc.mdx +0 -146
- package/dist/docs/content/sse.mdx +0 -159
- package/dist/docs/content/websockets.mdx +0 -289
- package/dist/docs/integrations/README.md +0 -23
- package/dist/docs/integrations/jwt.mdx +0 -151
- package/dist/docs/integrations/mongo.mdx +0 -183
- package/dist/docs/integrations/observability.mdx +0 -125
- package/dist/docs/integrations/openai.mdx +0 -108
- package/dist/docs/integrations/postgres.mdx +0 -190
- package/dist/docs/integrations/posthog.mdx +0 -122
- package/dist/docs/integrations/redis.mdx +0 -141
- package/dist/docs/integrations/resend.mdx +0 -117
- package/dist/docs/integrations/s3.mdx +0 -122
- package/dist/docs/integrations/swagger.mdx +0 -113
- package/dist/docs/reference/adapters.mdx +0 -130
- package/dist/docs/reference/auth.mdx +0 -183
- package/dist/docs/reference/cache.mdx +0 -132
- package/dist/docs/reference/circuit-breaker.mdx +0 -71
- package/dist/docs/reference/queue.mdx +0 -155
- package/dist/docs/reference/storage.mdx +0 -116
- package/dist/docs/reference/swagger.mdx +0 -132
- package/dist/integrations/drizzle.d.ts +0 -10
- package/dist/integrations/drizzle.d.ts.map +0 -1
- package/dist/integrations/drizzle.js +0 -34
- package/dist/integrations/drizzle.js.map +0 -1
- package/dist/integrations/jwt.d.ts +0 -12
- package/dist/integrations/jwt.d.ts.map +0 -1
- package/dist/integrations/jwt.js +0 -29
- package/dist/integrations/jwt.js.map +0 -1
- package/dist/integrations/mongodb.d.ts +0 -13
- package/dist/integrations/mongodb.d.ts.map +0 -1
- package/dist/integrations/mongodb.js +0 -48
- package/dist/integrations/mongodb.js.map +0 -1
- package/dist/integrations/mongoose.d.ts +0 -13
- package/dist/integrations/mongoose.d.ts.map +0 -1
- package/dist/integrations/mongoose.js +0 -84
- package/dist/integrations/mongoose.js.map +0 -1
- package/dist/integrations/openai.d.ts +0 -12
- package/dist/integrations/openai.d.ts.map +0 -1
- package/dist/integrations/openai.js +0 -47
- package/dist/integrations/openai.js.map +0 -1
- package/dist/integrations/postgres.d.ts +0 -13
- package/dist/integrations/postgres.d.ts.map +0 -1
- package/dist/integrations/postgres.js +0 -55
- package/dist/integrations/postgres.js.map +0 -1
- package/dist/integrations/posthog.d.ts +0 -13
- package/dist/integrations/posthog.d.ts.map +0 -1
- package/dist/integrations/posthog.js +0 -49
- package/dist/integrations/posthog.js.map +0 -1
- package/dist/integrations/prisma.d.ts +0 -10
- package/dist/integrations/prisma.d.ts.map +0 -1
- package/dist/integrations/prisma.js +0 -39
- package/dist/integrations/prisma.js.map +0 -1
- package/dist/integrations/redis.d.ts +0 -12
- package/dist/integrations/redis.d.ts.map +0 -1
- package/dist/integrations/redis.js +0 -48
- package/dist/integrations/redis.js.map +0 -1
- package/dist/integrations/resend.d.ts +0 -12
- package/dist/integrations/resend.d.ts.map +0 -1
- package/dist/integrations/resend.js +0 -47
- package/dist/integrations/resend.js.map +0 -1
- package/dist/integrations/s3.d.ts +0 -15
- package/dist/integrations/s3.d.ts.map +0 -1
- package/dist/integrations/s3.js +0 -60
- package/dist/integrations/s3.js.map +0 -1
- package/dist/integrations/supabase.d.ts +0 -13
- package/dist/integrations/supabase.d.ts.map +0 -1
- package/dist/integrations/supabase.js +0 -51
- package/dist/integrations/supabase.js.map +0 -1
- package/dist/middleware/cache.d.ts +0 -21
- package/dist/middleware/cache.d.ts.map +0 -1
- package/dist/middleware/cache.js +0 -156
- package/dist/middleware/cache.js.map +0 -1
- package/dist/observability/health.d.ts +0 -23
- package/dist/observability/health.d.ts.map +0 -1
- package/dist/observability/health.js +0 -49
- package/dist/observability/health.js.map +0 -1
- package/dist/observability/index.d.ts +0 -4
- package/dist/observability/index.d.ts.map +0 -1
- package/dist/observability/index.js +0 -10
- package/dist/observability/index.js.map +0 -1
- package/dist/observability/metrics.d.ts +0 -6
- package/dist/observability/metrics.d.ts.map +0 -1
- package/dist/observability/metrics.js +0 -60
- package/dist/observability/metrics.js.map +0 -1
- package/dist/observability/otel.d.ts +0 -27
- package/dist/observability/otel.d.ts.map +0 -1
- package/dist/observability/otel.js +0 -45
- package/dist/observability/otel.js.map +0 -1
- package/dist/observability/prometheus.d.ts +0 -30
- package/dist/observability/prometheus.d.ts.map +0 -1
- package/dist/observability/prometheus.js +0 -31
- package/dist/observability/prometheus.js.map +0 -1
- package/dist/queue/client.d.ts +0 -13
- package/dist/queue/client.d.ts.map +0 -1
- package/dist/queue/client.js +0 -83
- package/dist/queue/client.js.map +0 -1
- package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
- package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
- package/dist/queue/drivers/MemoryDriver.js +0 -176
- package/dist/queue/drivers/MemoryDriver.js.map +0 -1
- package/dist/queue/drivers/RedisDriver.d.ts +0 -19
- package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
- package/dist/queue/drivers/RedisDriver.js +0 -130
- package/dist/queue/drivers/RedisDriver.js.map +0 -1
- package/dist/queue/index.d.ts +0 -18
- package/dist/queue/index.d.ts.map +0 -1
- package/dist/queue/index.js +0 -37
- package/dist/queue/index.js.map +0 -1
- package/dist/queue/manager.d.ts +0 -18
- package/dist/queue/manager.d.ts.map +0 -1
- package/dist/queue/manager.js +0 -59
- package/dist/queue/manager.js.map +0 -1
- package/dist/queue/types.d.ts +0 -55
- package/dist/queue/types.d.ts.map +0 -1
- package/dist/queue/types.js.map +0 -1
- package/dist/queue/worker.d.ts +0 -18
- package/dist/queue/worker.d.ts.map +0 -1
- package/dist/queue/worker.js +0 -176
- package/dist/queue/worker.js.map +0 -1
- package/dist/router/gateway.d.ts.map +0 -1
- package/dist/router/gateway.js +0 -11
- package/dist/router/gateway.js.map +0 -1
- package/dist/server/bun-adapter.d.ts.map +0 -1
- package/dist/server/bun-adapter.js.map +0 -1
- package/dist/server/sse.d.ts +0 -16
- package/dist/server/sse.d.ts.map +0 -1
- package/dist/server/sse.js +0 -51
- package/dist/server/sse.js.map +0 -1
- package/dist/server/uws-adapter.d.ts.map +0 -1
- package/dist/server/uws-adapter.js.map +0 -1
- package/dist/storage/index.d.ts +0 -15
- package/dist/storage/index.d.ts.map +0 -1
- package/dist/storage/index.js +0 -7
- package/dist/storage/index.js.map +0 -1
- package/dist/swagger/index.d.ts +0 -9
- package/dist/swagger/index.d.ts.map +0 -1
- package/dist/swagger/index.js +0 -165
- package/dist/swagger/index.js.map +0 -1
- package/dist/threads/pool.d.ts +0 -14
- package/dist/threads/pool.d.ts.map +0 -1
- package/dist/threads/pool.js +0 -93
- package/dist/threads/pool.js.map +0 -1
- package/dist/threads/worker-runner.d.ts +0 -2
- package/dist/threads/worker-runner.d.ts.map +0 -1
- package/dist/threads/worker-runner.js +0 -71
- package/dist/threads/worker-runner.js.map +0 -1
- package/dist/validator/validator.d.ts +0 -360
- package/dist/validator/validator.d.ts.map +0 -1
- package/dist/validator/validator.js +0 -931
- package/dist/validator/validator.js.map +0 -1
- package/dist/websocket/orchestrator.d.ts +0 -11
- package/dist/websocket/orchestrator.d.ts.map +0 -1
- package/dist/websocket/orchestrator.js +0 -238
- package/dist/websocket/orchestrator.js.map +0 -1
- package/dist/websocket/server.d.ts +0 -66
- package/dist/websocket/server.d.ts.map +0 -1
- package/dist/websocket/server.js +0 -158
- package/dist/websocket/server.js.map +0 -1
- package/dist/websocket/socket.d.ts +0 -119
- package/dist/websocket/socket.d.ts.map +0 -1
- package/dist/websocket/socket.js +0 -242
- package/dist/websocket/socket.js.map +0 -1
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Database Layer"
|
|
3
|
-
description: "ExisJS includes a built-in, efficient database layer with native support for PostgreSQL, MySQL, SQLite, and MongoDB, plus a powerful SQL-First auto-sync engine."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Database Layer
|
|
7
|
-
|
|
8
|
-
Unlike other Node.js frameworks that rely entirely on third-party ORMs like Prisma or TypeORM, **ExisJS ships with a fully integrated, efficient Database Layer.**
|
|
9
|
-
|
|
10
|
-
This provides a massive advantage in developer experience and reliability, as connections, query generation, schema synchronization, and migrations are orchestrated directly by the framework.
|
|
11
|
-
|
|
12
|
-
<Info title="Functional vs OOP">
|
|
13
|
-
ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP Paradigm** (for dependency injection and decorators). The database layer is seamlessly accessible through both approaches.
|
|
14
|
-
</Info>
|
|
15
|
-
|
|
16
|
-
## Setup and Connection
|
|
17
|
-
|
|
18
|
-
#### Functional Paradigm
|
|
19
|
-
```typescript filename="src/http/server.ts"
|
|
20
|
-
import { exis } from 'exisjs'
|
|
21
|
-
import { createDatabase } from 'exisjs/database'
|
|
22
|
-
import { userTable, leadCustomerTable } from '../database/schema'
|
|
23
|
-
|
|
24
|
-
export default exis({
|
|
25
|
-
async onStart(app) {
|
|
26
|
-
const database = createDatabase({
|
|
27
|
-
dialect: 'postgres',
|
|
28
|
-
url: process.env.DATABASE_URL,
|
|
29
|
-
autoSync: true // Enables automatic schema synchronization!
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
// Register schemas for Auto-Sync
|
|
33
|
-
database.registerSchema([userTable, leadCustomerTable])
|
|
34
|
-
|
|
35
|
-
// Connect on boot
|
|
36
|
-
await database.connect()
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
#### Class-Based (OOP) Paradigm
|
|
42
|
-
```typescript filename="src/http/server.ts"
|
|
43
|
-
import { Server } from 'exisjs/decorators'
|
|
44
|
-
import { createDatabase } from 'exisjs/database'
|
|
45
|
-
import { userTable, leadCustomerTable } from '../database/schema'
|
|
46
|
-
|
|
47
|
-
@Server()
|
|
48
|
-
export default class RootServer {
|
|
49
|
-
async onStart(app: App) {
|
|
50
|
-
const database = createDatabase({
|
|
51
|
-
dialect: 'postgres',
|
|
52
|
-
url: process.env.DATABASE_URL,
|
|
53
|
-
autoSync: true
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
database.registerSchema([userTable, leadCustomerTable])
|
|
57
|
-
await database.connect()
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## SQL-First Schema Definition
|
|
63
|
-
|
|
64
|
-
ExisJS provides a strictly-typed, modern **SQL-First Schema API**. Instead of writing raw SQL migration files, you define your tables in TypeScript. When `autoSync` is enabled, ExisJS will read these definitions, diff them against your live PostgreSQL database, and automatically run `CREATE TABLE` and `ALTER TABLE` for you!
|
|
65
|
-
|
|
66
|
-
```typescript filename="src/database/schema.ts"
|
|
67
|
-
import { table, uuid, text, jsonb, timestamptz, boolean } from 'exisjs/database/sql'
|
|
68
|
-
|
|
69
|
-
export const userTable = table('user', {
|
|
70
|
-
user_id: uuid('user_id').primaryKey().default('gen_random_uuid()'),
|
|
71
|
-
name: text('name').notNull(),
|
|
72
|
-
phone: text('phone').unique().notNull(),
|
|
73
|
-
email: text('email').unique().notNull(),
|
|
74
|
-
address: jsonb('address'),
|
|
75
|
-
date_of_birth: timestamptz('date_of_birth'),
|
|
76
|
-
role: text('role').notNull(),
|
|
77
|
-
password_hash: text('password_hash').notNull(),
|
|
78
|
-
created_at: timestamptz('created_at').default('NOW()')
|
|
79
|
-
})
|
|
80
|
-
|
|
81
|
-
export const leadCustomerTable = table('leadCustomer', {
|
|
82
|
-
record_id: uuid('record_id').primaryKey().default('gen_random_uuid()'),
|
|
83
|
-
name: text('name').notNull(),
|
|
84
|
-
email: text('email'),
|
|
85
|
-
is_customer: boolean('is_customer').default('false'),
|
|
86
|
-
// Perfect, strict SQL Foreign Key References!
|
|
87
|
-
assigned_to: uuid('assigned_to').references(() => userTable.user_id),
|
|
88
|
-
})
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Querying
|
|
92
|
-
|
|
93
|
-
ExisJS supports **two ways** to query your database. You can use the traditional string-based builder, or the new fully-typed SQL-First builder.
|
|
94
|
-
|
|
95
|
-
### Method A: Typed SQL-First Querying (Recommended)
|
|
96
|
-
This method gives you 100% type safety and auto-complete for your columns.
|
|
97
|
-
|
|
98
|
-
#### Functional Paradigm
|
|
99
|
-
```typescript filename="src/http/users/route.ts"
|
|
100
|
-
import { controller, route } from 'exisjs/router'
|
|
101
|
-
import { db } from 'exisjs/database'
|
|
102
|
-
import { eq } from 'exisjs/database/sql'
|
|
103
|
-
import { userTable } from '@/database/schema'
|
|
104
|
-
|
|
105
|
-
export default controller({
|
|
106
|
-
list: route.get('/', {
|
|
107
|
-
async handle() {
|
|
108
|
-
// Fully typed! Auto-complete knows userTable has name, email, etc.
|
|
109
|
-
const users = await db
|
|
110
|
-
.select(userTable.user_id.name, userTable.name.name, userTable.email.name)
|
|
111
|
-
.from(userTable)
|
|
112
|
-
.where(eq(userTable.role, 'admin'))
|
|
113
|
-
.limit(10)
|
|
114
|
-
.rows()
|
|
115
|
-
|
|
116
|
-
return users
|
|
117
|
-
}
|
|
118
|
-
}),
|
|
119
|
-
|
|
120
|
-
create: route.post('/', {
|
|
121
|
-
async handle({ req }) {
|
|
122
|
-
const { name, email, phone, password_hash } = req.body
|
|
123
|
-
|
|
124
|
-
const result = await db
|
|
125
|
-
.insert(userTable)
|
|
126
|
-
.values({ name, email, phone, role: 'user', password_hash })
|
|
127
|
-
.returning(userTable.user_id.name)
|
|
128
|
-
.execute()
|
|
129
|
-
|
|
130
|
-
return { id: result.rows[0].user_id }
|
|
131
|
-
}
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
#### Class-Based (OOP) Paradigm
|
|
137
|
-
```typescript filename="src/http/users/service.ts"
|
|
138
|
-
import { Injectable } from 'exisjs/decorators'
|
|
139
|
-
import { db } from 'exisjs/database'
|
|
140
|
-
import { eq } from 'exisjs/database/sql'
|
|
141
|
-
import { userTable } from '@/database/schema'
|
|
142
|
-
|
|
143
|
-
@Injectable()
|
|
144
|
-
export class UsersService {
|
|
145
|
-
async getAdmins() {
|
|
146
|
-
return await db
|
|
147
|
-
.select(userTable.user_id.name, userTable.name.name, userTable.email.name)
|
|
148
|
-
.from(userTable)
|
|
149
|
-
.where(eq(userTable.role, 'admin'))
|
|
150
|
-
.limit(10)
|
|
151
|
-
.rows()
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async createUser(data: any) {
|
|
155
|
-
const result = await db
|
|
156
|
-
.insert(userTable)
|
|
157
|
-
.values({ ...data, role: 'user' })
|
|
158
|
-
.returning(userTable.user_id.name)
|
|
159
|
-
.execute()
|
|
160
|
-
|
|
161
|
-
return { id: result.rows[0].user_id }
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Method B: String-Based Query Builder
|
|
167
|
-
If you don't want to define schema files, you can still use the raw string builder.
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
// Query multiple rows
|
|
171
|
-
const users = await db.table('users')
|
|
172
|
-
.select('id', 'name', 'email')
|
|
173
|
-
.where('role', '=', 'admin')
|
|
174
|
-
.orderBy('created_at', 'desc')
|
|
175
|
-
.limit(10)
|
|
176
|
-
.rows()
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
## Transactions
|
|
180
|
-
|
|
181
|
-
ExisJS makes it trivial to perform safe database transactions. If the callback throws an error, the transaction is automatically rolled back.
|
|
182
|
-
|
|
183
|
-
```typescript
|
|
184
|
-
import { db } from 'exisjs/database'
|
|
185
|
-
|
|
186
|
-
await db.transaction(async (tx) => {
|
|
187
|
-
// Deduct from inventory
|
|
188
|
-
await tx.execute(
|
|
189
|
-
'UPDATE inventory SET stock = stock - $1 WHERE id = $2',
|
|
190
|
-
[1, itemId]
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
// Create order record
|
|
194
|
-
await tx.execute(
|
|
195
|
-
'INSERT INTO orders (user_id, item_id) VALUES ($1, $2)',
|
|
196
|
-
[userId, itemId]
|
|
197
|
-
)
|
|
198
|
-
})
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
## Manual Migrations (Optional)
|
|
202
|
-
|
|
203
|
-
If you prefer to write raw SQL instead of using the Auto-Sync engine, ExisJS still includes a built-in migration tracker.
|
|
204
|
-
|
|
205
|
-
```typescript
|
|
206
|
-
import { db } from 'exisjs/database'
|
|
207
|
-
|
|
208
|
-
const migrator = db.getMigrator({ directory: './migrations' })
|
|
209
|
-
|
|
210
|
-
// Apply all pending migrations
|
|
211
|
-
await migrator.up()
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
A migration file simply exports `up` and `down` methods. You write raw SQL inside them for ultimate control.
|
|
215
|
-
|
|
216
|
-
```typescript filename="migrations/001_create_users.ts"
|
|
217
|
-
module.exports = {
|
|
218
|
-
name: '001_create_users',
|
|
219
|
-
async up(db) {
|
|
220
|
-
await db.execute(`
|
|
221
|
-
CREATE TABLE users (
|
|
222
|
-
id SERIAL PRIMARY KEY,
|
|
223
|
-
name VARCHAR(255) NOT NULL,
|
|
224
|
-
email VARCHAR(255) UNIQUE NOT NULL
|
|
225
|
-
)
|
|
226
|
-
`)
|
|
227
|
-
},
|
|
228
|
-
async down(db) {
|
|
229
|
-
await db.execute('DROP TABLE users')
|
|
230
|
-
},
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## API Reference
|
|
235
|
-
|
|
236
|
-
To maintain a clean namespace, ExisJS separates the core database manager from the SQL schema utilities.
|
|
237
|
-
|
|
238
|
-
### Core Database (`exisjs/database`)
|
|
239
|
-
Imports related to connection management, raw queries, and migrations.
|
|
240
|
-
|
|
241
|
-
- `db` - The global singleton database manager.
|
|
242
|
-
- `createDatabase` - Factory to instantiate a new database connection.
|
|
243
|
-
- `DatabaseManager` - The underlying class for `db`.
|
|
244
|
-
- `Migrator` - The migration engine class.
|
|
245
|
-
- `QueryBuilder` - The base query builder class.
|
|
246
|
-
|
|
247
|
-
### SQL-First Schema & Queries (`exisjs/database/sql`)
|
|
248
|
-
Imports related to defining tables, column types, and writing fluent queries.
|
|
249
|
-
|
|
250
|
-
**Table Builder:**
|
|
251
|
-
- `table` - Define a new SQL-first table.
|
|
252
|
-
|
|
253
|
-
**Column Types:**
|
|
254
|
-
- `uuid`
|
|
255
|
-
- `text`
|
|
256
|
-
- `varchar`
|
|
257
|
-
- `integer`
|
|
258
|
-
- `serial`
|
|
259
|
-
- `bigint`
|
|
260
|
-
- `numeric`
|
|
261
|
-
- `real`
|
|
262
|
-
- `boolean`
|
|
263
|
-
- `json`
|
|
264
|
-
- `jsonb`
|
|
265
|
-
- `timestamp`
|
|
266
|
-
- `timestamptz`
|
|
267
|
-
- `date`
|
|
268
|
-
|
|
269
|
-
**Condition Operators (for `.where()`):**
|
|
270
|
-
- `eq` (Equal: `=`)
|
|
271
|
-
- `ne` (Not Equal: `!=`)
|
|
272
|
-
- `gt` (Greater Than: `>`)
|
|
273
|
-
- `gte` (Greater Than or Equal: `>=`)
|
|
274
|
-
- `lt` (Less Than: `<`)
|
|
275
|
-
- `lte` (Less Than or Equal: `<=`)
|
|
276
|
-
- `isNull` (IS NULL)
|
|
277
|
-
- `isNotNull` (IS NOT NULL)
|
|
278
|
-
- `inArray` (IN)
|
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/validation"
|
|
3
|
-
nextTitle: "Validation"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Gateways (Middleware & Modules)
|
|
7
|
-
|
|
8
|
-
Gateways act as a configuration entry point for specific folders in your file-system routing architecture.
|
|
9
|
-
|
|
10
|
-
Instead of writing programmatic middleware declarations like `app.use('/admin', requireAuth)`, you can place a `gateway.ts` file inside a folder to scope **Middleware**, **CORS**, and **Dependency Injection** to that specific domain.
|
|
11
|
-
|
|
12
|
-
## Cascading Middleware
|
|
13
|
-
|
|
14
|
-
The most common use-case for a gateway is applying middleware arrays to a group of routes.
|
|
15
|
-
|
|
16
|
-
### Functional Paradigm
|
|
17
|
-
|
|
18
|
-
```typescript className="language-typescript" filename="src/http/admin/gateway.ts"
|
|
19
|
-
import { defineGateway } from 'exisjs/router'
|
|
20
|
-
import { requireAuth } from '../../middleware/auth'
|
|
21
|
-
import { cors, helmet } from 'exisjs/middleware'
|
|
22
|
-
|
|
23
|
-
export default defineGateway({
|
|
24
|
-
// This middleware array runs before ANY route in /admin/*
|
|
25
|
-
middleware: [
|
|
26
|
-
helmet(),
|
|
27
|
-
compress(),
|
|
28
|
-
cache({ ttlMs: 60000 }),
|
|
29
|
-
requireAuth
|
|
30
|
-
],
|
|
31
|
-
|
|
32
|
-
// Enforce strict CORS for this folder
|
|
33
|
-
cors: {
|
|
34
|
-
origin: 'https://admin.yourdomain.com',
|
|
35
|
-
methods: ['GET', 'POST', 'DELETE']
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
// Append custom default headers to all responses
|
|
39
|
-
headers: {
|
|
40
|
-
'X-Admin-Api-Version': '2.0'
|
|
41
|
-
}
|
|
42
|
-
})
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Class-Based (OOP) Paradigm
|
|
46
|
-
|
|
47
|
-
```typescript className="language-typescript" filename="src/http/admin/gateway.ts"
|
|
48
|
-
import { Gateway } from 'exisjs/decorators'
|
|
49
|
-
import { requireAuth } from '../../middleware/auth'
|
|
50
|
-
import { helmet } from 'exisjs/middleware'
|
|
51
|
-
|
|
52
|
-
@Gateway({
|
|
53
|
-
// This middleware array runs before ANY route in /admin/*
|
|
54
|
-
middleware: [
|
|
55
|
-
helmet(),
|
|
56
|
-
compress(),
|
|
57
|
-
cache({ ttlMs: 60000 }),
|
|
58
|
-
requireAuth
|
|
59
|
-
],
|
|
60
|
-
|
|
61
|
-
// Enforce strict CORS for this folder
|
|
62
|
-
cors: {
|
|
63
|
-
origin: 'https://admin.yourdomain.com',
|
|
64
|
-
methods: ['GET', 'POST', 'DELETE']
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
// Append custom default headers to all responses
|
|
68
|
-
headers: {
|
|
69
|
-
'X-Admin-Api-Version': '2.0'
|
|
70
|
-
}
|
|
71
|
-
})
|
|
72
|
-
export default class AdminGateway {}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
When a request comes in for `/admin/users`, ExisJS processes the Gateway's middleware sequentially before it ever reaches your `route.ts` file.
|
|
76
|
-
|
|
77
|
-
## Folder-Scoped CORS
|
|
78
|
-
|
|
79
|
-
Handling CORS across an API can require granular control. For instance, you might want your `/public` folder to accept requests from anywhere, while restricting your `/billing` folder to a strict frontend domain. ExisJS allows you to define the `cors` property in your Gateway, overriding the global configuration for that specific folder.
|
|
80
|
-
|
|
81
|
-
## File-Based Modules (Domain-Driven Design)
|
|
82
|
-
|
|
83
|
-
In addition to serving as an interceptor for middleware, `gateway.ts` acts as a module boundary, enabling **Domain-Driven Design (DDD)** via the file system.
|
|
84
|
-
|
|
85
|
-
### Providers (Dependency Injection)
|
|
86
|
-
|
|
87
|
-
If you have a database service unique to your `/users` domain, encapsulate it strictly inside the users gateway:
|
|
88
|
-
|
|
89
|
-
```typescript className="language-typescript" filename="src/http/users/gateway.ts"
|
|
90
|
-
import { defineGateway } from 'exisjs/router'
|
|
91
|
-
import { UsersRepository } from './repository'
|
|
92
|
-
|
|
93
|
-
export default defineGateway({
|
|
94
|
-
// Provide the UsersRepository directly to this folder's DI container!
|
|
95
|
-
providers: [
|
|
96
|
-
['UsersRepository', { useClass: UsersRepository }]
|
|
97
|
-
]
|
|
98
|
-
})
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
When ExisJS boots, it automatically discovers `gateway.ts`, parses the `providers`, and hydrates them into the internal Dependency Injection container before executing the routes. Inside your route handler, you can inject them:
|
|
102
|
-
|
|
103
|
-
#### Functional Paradigm
|
|
104
|
-
|
|
105
|
-
```typescript className="language-typescript" filename="src/http/users/route.ts"
|
|
106
|
-
import { controller, route } from 'exisjs/router'
|
|
107
|
-
import { inject } from 'exisjs/di'
|
|
108
|
-
import type { UsersRepository } from './repository'
|
|
109
|
-
|
|
110
|
-
export default controller({
|
|
111
|
-
list: route.get('/', {
|
|
112
|
-
async handle() {
|
|
113
|
-
// Access the scoped dependency
|
|
114
|
-
const usersRepo = inject<UsersRepository>('UsersRepository')
|
|
115
|
-
return await usersRepo.findAll()
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
})
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
#### Class-Based (OOP) Paradigm
|
|
122
|
-
|
|
123
|
-
```typescript className="language-typescript" filename="src/http/users/route.ts"
|
|
124
|
-
import { Controller, Get } from 'exisjs/decorators'
|
|
125
|
-
import { inject } from 'exisjs/di'
|
|
126
|
-
import type { UsersRepository } from './repository'
|
|
127
|
-
|
|
128
|
-
@Controller()
|
|
129
|
-
export default class UsersController {
|
|
130
|
-
@Get('/')
|
|
131
|
-
async list() {
|
|
132
|
-
const usersRepo = inject<UsersRepository>('UsersRepository')
|
|
133
|
-
return await usersRepo.findAll()
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
### Imports & Plugins
|
|
139
|
-
|
|
140
|
-
Gateways allow you to bundle other modules and plugins into a domain.
|
|
141
|
-
|
|
142
|
-
### Functional Paradigm
|
|
143
|
-
|
|
144
|
-
```typescript className="language-typescript" filename="src/http/orders/gateway.ts"
|
|
145
|
-
import { defineGateway } from 'exisjs/router'
|
|
146
|
-
import AuthModule from '../auth/module'
|
|
147
|
-
import { stripePlugin } from '../../plugins/stripe'
|
|
148
|
-
|
|
149
|
-
export default defineGateway({
|
|
150
|
-
// Pull in the Auth feature set
|
|
151
|
-
imports: [AuthModule],
|
|
152
|
-
|
|
153
|
-
// Isolate Stripe setup for the orders domain
|
|
154
|
-
plugins: [stripePlugin({ apiKey: process.env.STRIPE_KEY })]
|
|
155
|
-
})
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### Class-Based (OOP) Paradigm
|
|
159
|
-
|
|
160
|
-
```typescript className="language-typescript" filename="src/http/orders/gateway.ts"
|
|
161
|
-
import { Gateway } from 'exisjs/decorators'
|
|
162
|
-
import AuthModule from '../auth/module'
|
|
163
|
-
import { stripePlugin } from '../../plugins/stripe'
|
|
164
|
-
|
|
165
|
-
@Gateway({
|
|
166
|
-
// Pull in the Auth feature set
|
|
167
|
-
imports: [AuthModule],
|
|
168
|
-
|
|
169
|
-
// Isolate Stripe setup for the orders domain
|
|
170
|
-
plugins: [stripePlugin({ apiKey: process.env.STRIPE_KEY })]
|
|
171
|
-
})
|
|
172
|
-
export default class OrdersGateway {}
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
<Hint>
|
|
176
|
-
- **Imports**: Automatically deduplicated. If multiple gateways import `AuthModule`, its internal singletons are only initialized once.
|
|
177
|
-
- **Plugins**: Setup logic runs specifically for the scoped folder.
|
|
178
|
-
</Hint>
|
|
179
|
-
|
|
180
|
-
## Gateway Inheritance (Cascading)
|
|
181
|
-
|
|
182
|
-
Gateways inherently **cascade**. If you define a Gateway at the absolute root (`src/http/gateway.ts`), it applies globally.
|
|
183
|
-
|
|
184
|
-
If you define another Gateway at `src/http/admin/gateway.ts`, requests to `/admin/dashboard` will sequentially pass through the Root Gateway, and *then* pass through the Admin Gateway!
|
|
185
|
-
|
|
186
|
-
```text className="language-text"
|
|
187
|
-
src/
|
|
188
|
-
└── http/
|
|
189
|
-
├── gateway.ts <-- Runs first (Global Rate Limits)
|
|
190
|
-
└── admin/
|
|
191
|
-
├── gateway.ts <-- Runs second (JWT Validation)
|
|
192
|
-
└── users/
|
|
193
|
-
└── route.ts <-- Runs last (Only if both gateways succeed!)
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## Extended Features
|
|
197
|
-
|
|
198
|
-
Gateways provide features to manage cross-cutting concerns like Exception Filters or Guards for an entire folder.
|
|
199
|
-
|
|
200
|
-
### 1. Folder-Scoped Guards
|
|
201
|
-
|
|
202
|
-
Apply Authorization Guards directly to a folder. If the guard returns `false`, the entire folder is protected.
|
|
203
|
-
|
|
204
|
-
#### Functional Paradigm
|
|
205
|
-
|
|
206
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
207
|
-
import { defineGateway } from 'exisjs/router'
|
|
208
|
-
import { RequireAdminRoleGuard } from '../../guards'
|
|
209
|
-
|
|
210
|
-
export default defineGateway({
|
|
211
|
-
// Protects the entire /api folder
|
|
212
|
-
guards: [RequireAdminRoleGuard]
|
|
213
|
-
})
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
#### Class-Based (OOP) Paradigm
|
|
217
|
-
|
|
218
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
219
|
-
import { Gateway } from 'exisjs/decorators'
|
|
220
|
-
import { RequireAdminRoleGuard } from '../../guards'
|
|
221
|
-
|
|
222
|
-
@Gateway({
|
|
223
|
-
// Protects the entire /api folder
|
|
224
|
-
guards: [RequireAdminRoleGuard]
|
|
225
|
-
})
|
|
226
|
-
export default class ApiGateway {}
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### 2. Folder-Scoped Exception Filters
|
|
230
|
-
|
|
231
|
-
Catch exceptions for a specific domain. For example, you can return HTML error pages for `/views`, but standardized JSON errors for `/api`.
|
|
232
|
-
|
|
233
|
-
#### Functional Paradigm
|
|
234
|
-
|
|
235
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
236
|
-
import { defineGateway } from 'exisjs/router'
|
|
237
|
-
import { ApiVersion2ErrorFilter } from '../../filters'
|
|
238
|
-
|
|
239
|
-
export default defineGateway({
|
|
240
|
-
// Catches all exceptions thrown inside /api/*
|
|
241
|
-
filters: [ApiVersion2ErrorFilter]
|
|
242
|
-
})
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
#### Class-Based (OOP) Paradigm
|
|
246
|
-
|
|
247
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
248
|
-
import { Gateway } from 'exisjs/decorators'
|
|
249
|
-
import { ApiVersion2ErrorFilter } from '../../filters'
|
|
250
|
-
|
|
251
|
-
@Gateway({
|
|
252
|
-
// Catches all exceptions thrown inside /api/*
|
|
253
|
-
filters: [ApiVersion2ErrorFilter]
|
|
254
|
-
})
|
|
255
|
-
export default class ApiGateway {}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### 3. Folder-Scoped Interceptors
|
|
259
|
-
|
|
260
|
-
Transform or wrap all responses exiting a specific folder.
|
|
261
|
-
|
|
262
|
-
#### Functional Paradigm
|
|
263
|
-
|
|
264
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
265
|
-
import { defineGateway } from 'exisjs/router'
|
|
266
|
-
import { StandardResponseInterceptor } from '../../interceptors'
|
|
267
|
-
|
|
268
|
-
export default defineGateway({
|
|
269
|
-
// Wraps all responses from /api/* in a standard format
|
|
270
|
-
interceptors: [StandardResponseInterceptor]
|
|
271
|
-
})
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
#### Class-Based (OOP) Paradigm
|
|
275
|
-
|
|
276
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
277
|
-
import { Gateway } from 'exisjs/decorators'
|
|
278
|
-
import { StandardResponseInterceptor } from '../../interceptors'
|
|
279
|
-
|
|
280
|
-
@Gateway({
|
|
281
|
-
// Wraps all responses from /api/* in a standard format
|
|
282
|
-
interceptors: [StandardResponseInterceptor]
|
|
283
|
-
})
|
|
284
|
-
export default class ApiGateway {}
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### 4. Bypassing Gateways (Exclude)
|
|
288
|
-
|
|
289
|
-
Bypass the Gateway's middleware, guards, and filters for specific sub-paths or methods without breaking your folder structure.
|
|
290
|
-
|
|
291
|
-
#### Functional Paradigm
|
|
292
|
-
|
|
293
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
294
|
-
import { defineGateway } from 'exisjs/router'
|
|
295
|
-
|
|
296
|
-
export default defineGateway({
|
|
297
|
-
exclude: [
|
|
298
|
-
'/api/public/status', // Exact Match
|
|
299
|
-
'/api/webhooks/*', // Wildcard Match
|
|
300
|
-
{ path: '/api/users', methods: ['GET'] } // Method-specific bypass
|
|
301
|
-
]
|
|
302
|
-
})
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
#### Class-Based (OOP) Paradigm
|
|
306
|
-
|
|
307
|
-
```typescript className="language-typescript" filename="src/http/api/gateway.ts"
|
|
308
|
-
import { Gateway } from 'exisjs/decorators'
|
|
309
|
-
|
|
310
|
-
@Gateway({
|
|
311
|
-
exclude: [
|
|
312
|
-
'/api/public/status', // Exact Match
|
|
313
|
-
'/api/webhooks/*', // Wildcard Match
|
|
314
|
-
{ path: '/api/users', methods: ['GET'] } // Method-specific bypass
|
|
315
|
-
]
|
|
316
|
-
})
|
|
317
|
-
export default class ApiGateway {}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### 5. Dynamic Request Timeouts
|
|
321
|
-
|
|
322
|
-
Define dynamic, folder-scoped request timeouts. For example, give your `/reports` folder 60 seconds, but restrict `/api` to 5 seconds. You can evaluate the timeout dynamically per-request.
|
|
323
|
-
|
|
324
|
-
#### Functional Paradigm
|
|
325
|
-
|
|
326
|
-
```typescript className="language-typescript" filename="src/http/reports/gateway.ts"
|
|
327
|
-
import { defineGateway } from 'exisjs/router'
|
|
328
|
-
|
|
329
|
-
export default defineGateway({
|
|
330
|
-
// Dynamic request timeouts evaluated per-request
|
|
331
|
-
timeout: (req) => req.headers['x-premium'] ? 30000 : 5000
|
|
332
|
-
})
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
#### Class-Based (OOP) Paradigm
|
|
336
|
-
|
|
337
|
-
```typescript className="language-typescript" filename="src/http/reports/gateway.ts"
|
|
338
|
-
import { Gateway } from 'exisjs/decorators'
|
|
339
|
-
|
|
340
|
-
@Gateway({
|
|
341
|
-
// Dynamic request timeouts evaluated per-request
|
|
342
|
-
timeout: (req) => req.headers['x-premium'] ? 30000 : 5000
|
|
343
|
-
})
|
|
344
|
-
export default class ReportsGateway {}
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### 6. Cascading Metadata
|
|
348
|
-
|
|
349
|
-
Define tags (like OpenAPI/Swagger tags or Role definitions) at the folder level that automatically cascade down to every route inside.
|
|
350
|
-
|
|
351
|
-
#### Functional Paradigm
|
|
352
|
-
|
|
353
|
-
```typescript className="language-typescript" filename="src/http/admin/gateway.ts"
|
|
354
|
-
import { defineGateway } from 'exisjs/router'
|
|
355
|
-
|
|
356
|
-
export default defineGateway({
|
|
357
|
-
// Automatically cascades OpenAPI tags to every route in the folder
|
|
358
|
-
metadata: {
|
|
359
|
-
openapi: { tags: ['Admin API'], security: ['bearerAuth'] }
|
|
360
|
-
}
|
|
361
|
-
})
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
#### Class-Based (OOP) Paradigm
|
|
365
|
-
|
|
366
|
-
```typescript className="language-typescript" filename="src/http/admin/gateway.ts"
|
|
367
|
-
import { Gateway } from 'exisjs/decorators'
|
|
368
|
-
|
|
369
|
-
@Gateway({
|
|
370
|
-
// Automatically cascades OpenAPI tags to every route in the folder
|
|
371
|
-
metadata: {
|
|
372
|
-
openapi: { tags: ['Admin API'], security: ['bearerAuth'] }
|
|
373
|
-
}
|
|
374
|
-
})
|
|
375
|
-
export default class AdminGateway {}
|
|
376
|
-
```
|