exisjs 0.6.0 → 0.7.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/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +11 -9
- 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 +34 -36
- 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 +3 -2
- package/dist/config/config.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 +2 -2
- package/dist/decorators/constants.d.ts.map +1 -1
- package/dist/decorators/constants.js +2 -2
- package/dist/decorators/constants.js.map +1 -1
- package/dist/decorators/core.d.ts +4 -3
- package/dist/decorators/core.d.ts.map +1 -1
- package/dist/decorators/core.js +7 -4
- package/dist/decorators/core.js.map +1 -1
- package/dist/decorators/middleware.d.ts +0 -10
- package/dist/decorators/middleware.d.ts.map +1 -1
- package/dist/decorators/middleware.js +0 -25
- package/dist/decorators/middleware.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 +1 -3
- package/dist/decorators/routing.js.map +1 -1
- package/dist/di/inject.d.ts +1 -2
- package/dist/di/inject.d.ts.map +1 -1
- package/dist/di/inject.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 +107 -80
- package/dist/docs/content/installation.mdx +20 -1
- package/dist/docs/content/middleware.mdx +65 -291
- 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 +24 -217
- package/dist/docs/reference/middleware.mdx +41 -217
- package/dist/docs/reference/validator.mdx +2 -5
- package/dist/error/errors.d.ts.map +1 -1
- package/dist/error/errors.js +16 -0
- package/dist/error/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/start-repl.js +2 -4
- package/dist/lib/start-repl.js.map +1 -1
- package/dist/lib/start-server.js +12 -4
- 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/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/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 +0 -4
- 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 +216 -193
- 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 +9 -30
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +19 -134
- 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 +31 -222
- 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/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
|
@@ -3,11 +3,11 @@ title: "Decorators"
|
|
|
3
3
|
description: "API Reference for ExisJS Class-Based Routing and Decorators."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Decorators (
|
|
6
|
+
# Decorators (`exisjs/decorators`)
|
|
7
7
|
|
|
8
|
-
ExisJS provides a robust Object-Oriented Programming (OOP) paradigm via the `exisjs/decorators` module.
|
|
8
|
+
ExisJS provides a robust Object-Oriented Programming (OOP) paradigm via the `exisjs/decorators` module.
|
|
9
9
|
|
|
10
|
-
Unlike
|
|
10
|
+
Unlike frameworks that depend on heavy reflection libraries, ExisJS decorators are built completely on standard ECMAScript decorators and **do not require `reflect-metadata`**.
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
@@ -20,8 +20,7 @@ Marks a class as a Controller. All route handler methods within the class will b
|
|
|
20
20
|
```typescript filename="src/http/users/route.ts"
|
|
21
21
|
import { Controller } from 'exisjs/decorators'
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
@Controller('/api/users')
|
|
23
|
+
@Controller('/users')
|
|
25
24
|
export default class UserController {
|
|
26
25
|
// ...
|
|
27
26
|
}
|
|
@@ -40,7 +39,6 @@ Defines an HTTP route handler on a class method. You can optionally pass a schem
|
|
|
40
39
|
- `@Connect(path?, schema?)`
|
|
41
40
|
- `@Trace(path?, schema?)`
|
|
42
41
|
- `@All(path?, schema?)`
|
|
43
|
-
- `@Query(path?, schema?)`: Can be used as a method decorator to handle custom `QUERY` method requests (e.g., RPC or GraphQL-like endpoints).
|
|
44
42
|
|
|
45
43
|
```typescript filename="src/http/users/route.ts"
|
|
46
44
|
import { Controller, Get, Post } from 'exisjs/decorators'
|
|
@@ -60,234 +58,43 @@ export default class UserController {
|
|
|
60
58
|
}
|
|
61
59
|
```
|
|
62
60
|
|
|
63
|
-
### Real-Time Methods
|
|
64
|
-
- `@Ws(path?, schema?)`: Maps the handler to a WebSocket connection.
|
|
65
|
-
- `@Sse(path?, schema?)`: Maps the handler to a Server-Sent Events stream.
|
|
66
|
-
|
|
67
61
|
---
|
|
68
62
|
|
|
69
63
|
## 2. Parameter Injection
|
|
70
64
|
|
|
71
|
-
Parameter decorators automatically extract data from the incoming request and inject them directly into your method arguments
|
|
65
|
+
Parameter decorators automatically extract data from the incoming request and inject them directly into your method arguments:
|
|
72
66
|
|
|
73
|
-
- `@Body()`: Parses and injects the JSON request body.
|
|
74
|
-
- `@Param(
|
|
75
|
-
- `@
|
|
76
|
-
- `@
|
|
77
|
-
- `@HostParam(name?)`: Injects a subdomain parameter (e.g., extracted from `@Hosts(':tenant.example.com')`).
|
|
67
|
+
- `@Body(nameOrPipe?)`: Parses and injects the JSON request body (or passes it through a validator/pipe).
|
|
68
|
+
- `@Param(nameOrPipe?)`: Injects a URL path parameter (e.g., `id` from `/:id`).
|
|
69
|
+
- `@Headers(nameOrPipe?)`: Injects an HTTP header by name.
|
|
70
|
+
- `@HostParam(nameOrPipe?)`: Injects a subdomain parameter.
|
|
78
71
|
- `@Req()`: Injects the raw ExisJS Request object.
|
|
79
|
-
- `@Res(options?)`: Injects the raw ExisJS Response object
|
|
72
|
+
- `@Res(options?)`: Injects the raw ExisJS Response object (`{ passthrough: true }`).
|
|
80
73
|
- `@Ip()`: Injects the client's IP address.
|
|
81
|
-
- `@Session()`: Injects the active session object (requires session middleware).
|
|
82
74
|
- `@Next()`: Injects the Next function.
|
|
83
|
-
- `@Socket()`: Injects the active WebSocket instance (for `@Ws`).
|
|
84
|
-
- `@Stream()`: Injects the active SSE instance (for `@Sse`).
|
|
85
|
-
- `@UploadedFile() / @UploadedFiles()`: Injects multipart/form-data files.
|
|
86
|
-
|
|
87
|
-
```typescript filename="src/http/users/route.ts"
|
|
88
|
-
import { Controller, Get, Post, Param, Body, Ip } from 'exisjs/decorators'
|
|
89
|
-
|
|
90
|
-
@Controller('/users')
|
|
91
|
-
export default class UserController {
|
|
92
|
-
@Get('/:id')
|
|
93
|
-
getUser(@Param('id') id: string, @Ip() ip: string) {
|
|
94
|
-
return { id, requestedBy: ip }
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
@Post('/')
|
|
98
|
-
createUser(@Body() body: { email: string }) {
|
|
99
|
-
return { email: body.email }
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
75
|
|
|
104
76
|
---
|
|
105
77
|
|
|
106
|
-
## 3. Middleware &
|
|
107
|
-
|
|
108
|
-
### `@Use(...middlewares)`
|
|
109
|
-
Applies Express-style middleware functions to a specific route handler or an entire controller class.
|
|
110
|
-
|
|
111
|
-
```typescript filename="src/http/secure/route.ts"
|
|
112
|
-
import { Controller, Get, Use } from 'exisjs/decorators'
|
|
113
|
-
import { authMiddleware } from '../middleware/auth'
|
|
114
|
-
|
|
115
|
-
@Controller('/secure')
|
|
116
|
-
@Use(authMiddleware)
|
|
117
|
-
export default class SecureController {
|
|
118
|
-
@Get('/')
|
|
119
|
-
getSecureData() {
|
|
120
|
-
return { secure: true }
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### `@Cache(options)`
|
|
126
|
-
Automatically caches `GET` responses in memory or Redis.
|
|
78
|
+
## 3. Middleware & Pipeline Decorators
|
|
127
79
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
```typescript filename="src/http/payments/route.ts"
|
|
132
|
-
import { Controller, Post, Idempotent } from 'exisjs/decorators'
|
|
133
|
-
|
|
134
|
-
@Controller('/payments')
|
|
135
|
-
export default class PaymentController {
|
|
136
|
-
@Post('/checkout')
|
|
137
|
-
@Idempotent()
|
|
138
|
-
checkout() {
|
|
139
|
-
return { status: 'processing' }
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
```
|
|
80
|
+
- `@Use(...middlewares)`: Binds standard Express-style or ExisJS middleware to a controller class or method.
|
|
81
|
+
- `@Idempotent(options?)`: Caches responses based on the `Idempotency-Key` header using native in-memory off-heap storage.
|
|
143
82
|
|
|
144
83
|
---
|
|
145
84
|
|
|
146
|
-
## 4.
|
|
147
|
-
|
|
148
|
-
### `@HttpCode(code)`
|
|
149
|
-
Forces a specific HTTP status code for successful responses.
|
|
150
|
-
|
|
151
|
-
### `@Header(name, value)`
|
|
152
|
-
Automatically injects a specific response header before sending the response.
|
|
153
|
-
|
|
154
|
-
### `@Redirect(url, statusCode?)`
|
|
155
|
-
Redirects the request to the specified URL.
|
|
85
|
+
## 4. Response & Metadata Modifiers
|
|
156
86
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
@Controller('/documents')
|
|
164
|
-
export default class DocumentController {
|
|
165
|
-
@Post('/')
|
|
166
|
-
@HttpCode(201)
|
|
167
|
-
@Header('X-Custom-Status', 'Processed')
|
|
168
|
-
createDoc() {
|
|
169
|
-
return { created: true }
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## 5. Security & Lifecycle
|
|
177
|
-
|
|
178
|
-
These decorators allow you to attach ExisJS lifecycle hooks to your OOP routes.
|
|
179
|
-
|
|
180
|
-
- `@Permissions(...flags)`: Restricts the route to users with specific permission flags.
|
|
181
|
-
- `@Hosts(...hosts)`: Restricts the route to a specific subdomain/host.
|
|
182
|
-
- `@UseGuards(...guards)`: Attaches Guards (authentication/authorization checks).
|
|
183
|
-
- `@UseInterceptors(...interceptors)`: Attaches Interceptors (request/response mutation).
|
|
184
|
-
- `@UseFilters(...filters)`: Attaches Exception Filters (custom error handling).
|
|
87
|
+
- `@HttpCode(code: number)`: Enforces a custom HTTP status code on success.
|
|
88
|
+
- `@Header(name: string, value: string)`: Appends an HTTP header to the response.
|
|
89
|
+
- `@Returns(schema)`: Attaches response schema for OpenAPI documentation.
|
|
90
|
+
- `@Redirect(url: string, statusCode?: number)`: Redirects request to target URL.
|
|
91
|
+
- `@Permissions(...permissions: string[])`: Sets required permissions on the route.
|
|
92
|
+
- `@Hosts(...hosts: string[])`: Restricts routes to specific Host headers.
|
|
185
93
|
|
|
186
94
|
---
|
|
187
95
|
|
|
188
|
-
##
|
|
189
|
-
|
|
190
|
-
### `@Server(options?)`
|
|
191
|
-
Marks a class as the root Server entry point. Used to register global configuration and dependencies.
|
|
192
|
-
|
|
193
|
-
**Options Interface:**
|
|
194
|
-
```typescript
|
|
195
|
-
interface ServerConfig {
|
|
196
|
-
plugins?: any[]
|
|
197
|
-
providers?: any[]
|
|
198
|
-
cron?: any[]
|
|
199
|
-
queue?: any[]
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
```typescript filename="src/http/server.ts"
|
|
204
|
-
import { Server } from 'exisjs/decorators'
|
|
205
|
-
import { corsPlugin } from 'exisjs/middleware'
|
|
206
|
-
|
|
207
|
-
@Server({
|
|
208
|
-
plugins: [corsPlugin]
|
|
209
|
-
})
|
|
210
|
-
export default class RootServer {
|
|
211
|
-
async onStart(app) {
|
|
212
|
-
app.log.info("App booted!")
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### `@Gateway(options?)`
|
|
218
|
-
Marks a class as a Gateway module. Gateways are used to apply massive configuration blocks across an entire directory of routes (e.g., applying an auth guard to all routes inside `src/http/admin`).
|
|
96
|
+
## 5. Dependency Injection
|
|
219
97
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
exclude?: any[]
|
|
224
|
-
middleware?: any[]
|
|
225
|
-
filters?: any[]
|
|
226
|
-
guards?: any[]
|
|
227
|
-
interceptors?: any[]
|
|
228
|
-
timeout?: number | ((req: any) => number)
|
|
229
|
-
metadata?: Record<string, any>
|
|
230
|
-
cors?: any
|
|
231
|
-
headers?: Record<string, string>
|
|
232
|
-
imports?: any[]
|
|
233
|
-
providers?: any[]
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
```typescript filename="src/http/gateway.ts"
|
|
238
|
-
import { Gateway } from 'exisjs/decorators'
|
|
239
|
-
import { helmet, hpp } from 'exisjs/middleware'
|
|
240
|
-
|
|
241
|
-
/**
|
|
242
|
-
* Root Gateway (gatekeeper for the entire application)
|
|
243
|
-
*
|
|
244
|
-
* Gateways apply configuration to all routes within their directory and subdirectories.
|
|
245
|
-
* This acts as the global security and infrastructure layer.
|
|
246
|
-
*/
|
|
247
|
-
@Gateway({
|
|
248
|
-
// 1. Cross-Origin Resource Sharing (CORS)
|
|
249
|
-
cors: {
|
|
250
|
-
origin: ['https://myapp.com', /localhost:\d+/],
|
|
251
|
-
credentials: true,
|
|
252
|
-
},
|
|
253
|
-
|
|
254
|
-
// 2. Global Headers
|
|
255
|
-
headers: {
|
|
256
|
-
'X-Powered-By': 'ExisJS',
|
|
257
|
-
'X-Application-Version': '1.0.0',
|
|
258
|
-
},
|
|
259
|
-
|
|
260
|
-
// 3. Global Middleware
|
|
261
|
-
middleware: [
|
|
262
|
-
helmet(), // Sets secure HTTP headers
|
|
263
|
-
hpp(), // Prevents HTTP Parameter Pollution
|
|
264
|
-
],
|
|
265
|
-
|
|
266
|
-
// 4. Exclude Paths
|
|
267
|
-
exclude: [{ path: '/health', method: 'GET' }],
|
|
268
|
-
|
|
269
|
-
// 5. Dependency Injection Providers
|
|
270
|
-
providers: [
|
|
271
|
-
['ConfigService', { useValue: { apiKey: process.env.API_KEY || 'default' } }],
|
|
272
|
-
],
|
|
273
|
-
|
|
274
|
-
// 6. Global Metadata
|
|
275
|
-
metadata: {
|
|
276
|
-
tenant: 'root',
|
|
277
|
-
},
|
|
278
|
-
|
|
279
|
-
// 7. Request Timeout
|
|
280
|
-
timeout: 10000,
|
|
281
|
-
})
|
|
282
|
-
export default class RootGateway {}
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
### `@Injectable(options?)`
|
|
286
|
-
Marks a class as a provider for Dependency Injection, meaning it can be automatically injected into controllers or other services by the IoC container.
|
|
287
|
-
|
|
288
|
-
**Options Interface:**
|
|
289
|
-
```typescript
|
|
290
|
-
interface InjectableOptions {
|
|
291
|
-
scope?: 'singleton' | 'request'
|
|
292
|
-
}
|
|
293
|
-
```
|
|
98
|
+
- `@Injectable(options?)`: Marks a service class as an IoC provider managed by the container.
|
|
99
|
+
- `@Boundary(config)`: Marks a class as a folder-scoped Boundary configuring CORS, headers, exclusions, and pipeline steps.
|
|
100
|
+
- `@Server(config)`: Marks a class as a root server definition.
|
|
@@ -5,9 +5,11 @@ description: "API Reference for ExisJS built-in Middleware functions."
|
|
|
5
5
|
|
|
6
6
|
# Middleware (`exisjs/middleware`)
|
|
7
7
|
|
|
8
|
-
ExisJS ships with
|
|
8
|
+
ExisJS ships with an optimized suite of core middleware. Rather than relying on heavy external dependencies, ExisJS implements security and utility middleware directly.
|
|
9
9
|
|
|
10
|
-
All middlewares can be applied globally in `server.ts`,
|
|
10
|
+
All middlewares can be applied globally in `server.ts`, folder-wide in `boundary.ts`, or locally on specific controllers/routes.
|
|
11
|
+
|
|
12
|
+
---
|
|
11
13
|
|
|
12
14
|
## How to Apply Middleware
|
|
13
15
|
|
|
@@ -16,14 +18,12 @@ ExisJS provides first-class support for both Object-Oriented and Functional midd
|
|
|
16
18
|
**Class-Based (OOP)**
|
|
17
19
|
```typescript filename="src/http/users/route.ts"
|
|
18
20
|
import { Controller, Get, Use } from 'exisjs/decorators'
|
|
19
|
-
import {
|
|
21
|
+
import { ipFilter } from 'exisjs/middleware'
|
|
20
22
|
|
|
21
23
|
@Controller('/users')
|
|
22
|
-
@Use(ipFilter({ allow: ['192.168.1.0/24'] })) // Applies to entire
|
|
24
|
+
@Use(ipFilter({ allow: ['192.168.1.0/24'] })) // Applies to entire controller
|
|
23
25
|
export default class UserController {
|
|
24
|
-
|
|
25
26
|
@Get('/stats')
|
|
26
|
-
@Use(cache(60)) // Applies only to this method
|
|
27
27
|
getStats() {
|
|
28
28
|
return { users: 100 }
|
|
29
29
|
}
|
|
@@ -33,15 +33,12 @@ export default class UserController {
|
|
|
33
33
|
**Functional**
|
|
34
34
|
```typescript filename="src/http/users/route.ts"
|
|
35
35
|
import { controller, route } from 'exisjs/router'
|
|
36
|
-
import {
|
|
36
|
+
import { ipFilter } from 'exisjs/middleware'
|
|
37
37
|
|
|
38
38
|
export default controller({
|
|
39
|
-
// Applies to entire controller block
|
|
40
39
|
middleware: [ipFilter({ allow: ['192.168.1.0/24'] })],
|
|
41
|
-
|
|
40
|
+
|
|
42
41
|
getStats: route.get('/stats', {
|
|
43
|
-
// Applies only to this specific route
|
|
44
|
-
middleware: [cache(60)],
|
|
45
42
|
async handle() {
|
|
46
43
|
return { users: 100 }
|
|
47
44
|
}
|
|
@@ -54,251 +51,78 @@ export default controller({
|
|
|
54
51
|
## Security Middleware
|
|
55
52
|
|
|
56
53
|
### `helmet(options?)`
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
interface HelmetOptions {
|
|
61
|
-
contentSecurityPolicy?: string
|
|
62
|
-
hsts?: boolean | { maxAge: number; includeSubDomains: boolean }
|
|
63
|
-
noSniff?: boolean
|
|
64
|
-
xssFilter?: boolean
|
|
65
|
-
hidePoweredBy?: boolean
|
|
66
|
-
frameguard?: boolean | { action: 'DENY' | 'SAMEORIGIN' }
|
|
67
|
-
}
|
|
68
|
-
```
|
|
54
|
+
Sets 14+ strict security headers (HSTS, CSP, XSS Protection, No Sniff, Frameguard) to protect your application.
|
|
69
55
|
|
|
70
56
|
```typescript
|
|
71
57
|
import { helmet } from 'exisjs/middleware'
|
|
72
58
|
|
|
73
|
-
|
|
74
|
-
middleware: [
|
|
75
|
-
helmet({
|
|
76
|
-
hsts: { maxAge: 31536000, includeSubDomains: true },
|
|
77
|
-
xssFilter: true,
|
|
78
|
-
hidePoweredBy: true
|
|
79
|
-
})
|
|
80
|
-
]
|
|
81
|
-
})
|
|
59
|
+
app.use(helmet())
|
|
82
60
|
```
|
|
83
61
|
|
|
84
62
|
### `csrf(options)`
|
|
85
|
-
Implements the Signed Double Submit Cookie pattern for Cross-Site Request Forgery (CSRF) protection.
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
interface CsrfOptions {
|
|
89
|
-
secret: string
|
|
90
|
-
cookieName?: string
|
|
91
|
-
headerName?: string
|
|
92
|
-
cookieOptions?: {
|
|
93
|
-
httpOnly?: boolean
|
|
94
|
-
secure?: boolean
|
|
95
|
-
sameSite?: 'Strict' | 'Lax' | 'None'
|
|
96
|
-
path?: string
|
|
97
|
-
maxAge?: number
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
```
|
|
63
|
+
Implements the Signed Double Submit Cookie pattern for Cross-Site Request Forgery (CSRF) protection.
|
|
101
64
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
app.use(csrf({
|
|
106
|
-
secret: process.env.CSRF_SECRET, // Must be 32+ chars
|
|
107
|
-
cookieName: 'csrf-token',
|
|
108
|
-
headerName: 'x-csrf-token'
|
|
109
|
-
}))
|
|
110
|
-
```
|
|
65
|
+
### `timeout(ms)`
|
|
66
|
+
Automatically times out requests that exceed the specified milliseconds, returning a 503 response.
|
|
111
67
|
|
|
112
68
|
### `hpp()`
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
### `mongoSanitize()` / `dbSanitize(options)`
|
|
116
|
-
Recursively scans incoming `req.body`, `req.query`, and `req.params` and immediately strips any keys containing dangerous NoSQL characters (like `$` or `.`). This definitively prevents NoSQL Injection attacks.
|
|
69
|
+
HTTP Parameter Pollution protection.
|
|
117
70
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
mongo?: boolean // Default: true
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### `ipFilter(options)`
|
|
125
|
-
Restricts access based on the client's IP address. Supports exact matches, CIDR blocks, and custom validation functions.
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
import { ipFilter } from 'exisjs/middleware'
|
|
129
|
-
|
|
130
|
-
// Only allow internal network traffic
|
|
131
|
-
app.use(ipFilter({
|
|
132
|
-
allow: ['10.0.0.0/8', '192.168.1.100'],
|
|
133
|
-
message: 'Access denied from external networks'
|
|
134
|
-
}))
|
|
135
|
-
```
|
|
71
|
+
### `dbSanitize(options?)`
|
|
72
|
+
Sanitizes query and body payloads from NoSQL injection attempts.
|
|
136
73
|
|
|
137
74
|
---
|
|
138
75
|
|
|
139
|
-
##
|
|
76
|
+
## Traffic & Reliability Middleware
|
|
140
77
|
|
|
141
|
-
### `rateLimit(options)`
|
|
142
|
-
|
|
78
|
+
### `rateLimit(options?)`
|
|
79
|
+
High-performance rate limiter running in-memory and off-heap via Rust native bindings (`NativeRateLimiter`).
|
|
143
80
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
windowMs?: number // Time window in ms (default: 60000)
|
|
147
|
-
max?: number // Max requests per windowMs (default: 100)
|
|
148
|
-
message?: string // Error message (default: 'Too many requests...')
|
|
149
|
-
statusCode?: number // HTTP Status Code (default: 429)
|
|
150
|
-
keyGenerator?: Function // Custom IP extraction logic
|
|
151
|
-
redis?: any // Optional ioredis client for distributed limits
|
|
152
|
-
prefix?: string // Redis key prefix
|
|
153
|
-
}
|
|
154
|
-
```
|
|
81
|
+
> [!NOTE]
|
|
82
|
+
> Core rate limiting is scoped to in-memory native execution. Distributed multi-instance Redis rate limiting moves to `@exisjs/cache`.
|
|
155
83
|
|
|
156
84
|
```typescript
|
|
157
85
|
import { rateLimit } from 'exisjs/middleware'
|
|
158
86
|
|
|
159
87
|
app.use(rateLimit({
|
|
160
|
-
windowMs:
|
|
161
|
-
max: 100
|
|
162
|
-
message: 'Too many requests, please try again later.'
|
|
88
|
+
windowMs: 60000,
|
|
89
|
+
max: 100
|
|
163
90
|
}))
|
|
164
91
|
```
|
|
165
92
|
|
|
166
|
-
### `idempotent(options)`
|
|
167
|
-
|
|
93
|
+
### `idempotent(options?)`
|
|
94
|
+
Caches responses based on the `Idempotency-Key` header into off-heap native memory to prevent duplicate mutations.
|
|
168
95
|
|
|
169
96
|
```typescript
|
|
170
97
|
import { idempotent } from 'exisjs/middleware'
|
|
171
98
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
}
|
|
99
|
+
export const handlePayment = [
|
|
100
|
+
idempotent({ ttlMs: 86400000 }),
|
|
101
|
+
async (req, res) => { ... }
|
|
102
|
+
]
|
|
177
103
|
```
|
|
178
104
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
## Performance & Reliability
|
|
182
|
-
|
|
183
|
-
### `cache(ttl)`
|
|
184
|
-
Caches identical GET request responses in memory (or Redis, depending on the active adapter) for a specified number of seconds (`ttl`). Highly effective for public APIs and computationally expensive routes.
|
|
105
|
+
### `dedupe(options?)`
|
|
106
|
+
Prevents duplicate identical in-flight requests from being computed simultaneously.
|
|
185
107
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
// Cache this endpoint for 60 seconds
|
|
190
|
-
@Get('/stats')
|
|
191
|
-
@Use(cache(60))
|
|
192
|
-
getStats() {
|
|
193
|
-
return db.computeHeavyStats()
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
### `dedupe(ttl)`
|
|
198
|
-
Prevents duplicate identical requests from being processed simultaneously. If 1,000 clients request the exact same expensive resource at the exact same millisecond, `dedupe` forces 999 of them to wait for the 1st request to finish, and then serves the exact same response to all 1,000 clients simultaneously.
|
|
199
|
-
|
|
200
|
-
### `compress()`
|
|
201
|
-
A highly optimized payload compression middleware natively supporting `gzip`, `deflate`, and `brotli`. Automatically compresses responses based on the client's `Accept-Encoding` header.
|
|
202
|
-
|
|
203
|
-
### `timeout(ms)`
|
|
204
|
-
Automatically times out any request that hangs longer than the specified milliseconds, returning a clean 503 response. Crucial for preventing stalled requests from exhausting the Node.js event loop or database connection pools.
|
|
108
|
+
### `backpressure(options?)`
|
|
109
|
+
Monitors the Node.js Event Loop delay in real-time, shedding load when overloaded.
|
|
205
110
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
ms: number
|
|
209
|
-
message?: string
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
import { timeout } from 'exisjs/middleware'
|
|
215
|
-
|
|
216
|
-
@Gateway({
|
|
217
|
-
middleware: [timeout(10000)] // 10 second global timeout
|
|
218
|
-
})
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
### `backpressure(options)`
|
|
222
|
-
Monitors the Node.js Event Loop Delay in real-time. If the event loop gets too backed up (e.g., CPU is pegged at 100%), it will start returning 503 Service Unavailable to new requests until the CPU catches its breath.
|
|
111
|
+
### `ipFilter(options)`
|
|
112
|
+
Fast CIDR-based IP whitelist/blacklist filter.
|
|
223
113
|
|
|
224
114
|
---
|
|
225
115
|
|
|
226
116
|
## Utility Middleware
|
|
227
117
|
|
|
228
|
-
### `cors(options)`
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
```typescript
|
|
232
|
-
import { cors } from 'exisjs/middleware'
|
|
233
|
-
|
|
234
|
-
app.use(cors({
|
|
235
|
-
origin: ['https://myapp.com', /localhost:\d+/],
|
|
236
|
-
credentials: true,
|
|
237
|
-
methods: ['GET', 'POST']
|
|
238
|
-
}))
|
|
239
|
-
```
|
|
118
|
+
### `cors(options?)`
|
|
119
|
+
Cross-Origin Resource Sharing handler supporting preflight, dynamic origin matching, and credential headers.
|
|
240
120
|
|
|
241
121
|
### `requestId()`
|
|
242
|
-
Injects a unique `X-Request-Id` into every incoming request and
|
|
122
|
+
Injects a unique `X-Request-Id` into every incoming request and outgoing response header.
|
|
243
123
|
|
|
244
|
-
### `requestLogger(
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
```typescript
|
|
248
|
-
import { requestLogger } from 'exisjs/middleware'
|
|
249
|
-
|
|
250
|
-
app.use(requestLogger({ level: 'info' }))
|
|
251
|
-
```
|
|
124
|
+
### `requestLogger(options?)`
|
|
125
|
+
High-performance request logger powered by Pino.
|
|
252
126
|
|
|
253
127
|
### `serveStatic(root, options?)`
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
```typescript
|
|
257
|
-
import { serveStatic } from 'exisjs/middleware'
|
|
258
|
-
|
|
259
|
-
app.use('/public', serveStatic('./public', { maxAge: 86400 }))
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
## Architectural Middleware
|
|
265
|
-
|
|
266
|
-
ExisJS provides utility wrappers that convert NestJS-style architectural patterns into standard Express middlewares, bridging the gap between OOP metadata and pure functional execution.
|
|
267
|
-
|
|
268
|
-
### `guard(fn)`
|
|
269
|
-
Wraps an authorization or validation function. If the guard returns `false`, it throws an automatic `403 Forbidden` response.
|
|
270
|
-
|
|
271
|
-
```typescript
|
|
272
|
-
import { guard } from 'exisjs/middleware'
|
|
273
|
-
|
|
274
|
-
const RequireAdmin = guard((req) => req.user?.role === 'admin')
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### `pipe(fn)`
|
|
278
|
-
A synchronous transformation function. Takes the incoming request data, transforms it, and overwrites the body before passing it down the chain.
|
|
279
|
-
|
|
280
|
-
### `intercept(fn)`
|
|
281
|
-
Wraps the entire request-response lifecycle. Interceptors can manipulate the response right before it gets sent to the client. Highly useful for standardizing JSON response shapes.
|
|
282
|
-
|
|
283
|
-
```typescript
|
|
284
|
-
import { intercept } from 'exisjs/middleware'
|
|
285
|
-
|
|
286
|
-
// Standardize all responses to { data: <payload> }
|
|
287
|
-
const WrapResponse = intercept((req, res, data) => ({
|
|
288
|
-
data
|
|
289
|
-
}))
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
### `catchError(handler)`
|
|
293
|
-
An exception filter wrapper. Catches any errors thrown by the route or previous middlewares and handles them gracefully.
|
|
294
|
-
|
|
295
|
-
```typescript
|
|
296
|
-
import { catchError } from 'exisjs/middleware'
|
|
297
|
-
|
|
298
|
-
const HandlePrismaErrors = catchError((err, req, res) => {
|
|
299
|
-
if (err.code === 'P2002') {
|
|
300
|
-
return res.status(409).json({ error: 'Unique constraint failed' })
|
|
301
|
-
}
|
|
302
|
-
throw err // Pass to default error handler
|
|
303
|
-
})
|
|
304
|
-
```
|
|
128
|
+
Static file server supporting streaming and caching headers.
|
|
@@ -160,12 +160,9 @@ type Profile = ResolveSchema<typeof ProfileSchema>
|
|
|
160
160
|
|
|
161
161
|
---
|
|
162
162
|
|
|
163
|
-
##
|
|
163
|
+
## OpenAPI Generation
|
|
164
164
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
### OpenAPI Generation
|
|
168
|
-
The `TexEngine` automatically converts validation schemas into strictly compliant OpenAPI/Swagger JSON schemas when attached to routes. This powers the zero-config ExisJS Swagger integration without any manual YAML authoring.
|
|
165
|
+
The `TexEngine` automatically converts validation schemas into strictly compliant OpenAPI/Swagger JSON schemas when attached to routes. This powers zero-config Swagger documentation once `@exisjs/swagger` is added.
|
|
169
166
|
|
|
170
167
|
---
|
|
171
168
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/error/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIrD,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,aAAa,EAAE,OAAO,CAAA;IACtC,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAA;gBAG/B,OAAO,EAAE,MAAM,EACf,UAAU,SAAM,EAChB,IAAI,SAAmB,EACvB,OAAO,CAAC,EAAE,OAAO;IAenB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAIhE,MAAM,CAAC,YAAY,CAAC,OAAO,SAAiB,GAAG,SAAS;IAIxD,MAAM,CAAC,SAAS,CAAC,OAAO,SAAc,GAAG,SAAS;IAIlD,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAa,GAAG,SAAS;IAIjD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI3C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAInE,MAAM,CAAC,eAAe,CAAC,OAAO,SAAsB,GAAG,SAAS;IAIhE,MAAM,CAAC,QAAQ,CAAC,OAAO,SAA0B,GAAG,SAAS;IAI7D,MAAM,CAAC,kBAAkB,CAAC,OAAO,SAAwB,GAAG,SAAS;IAIrE,MAAM,CAAC,cAAc,CAAC,OAAO,SAAoB,GAAG,SAAS;IAI7D,MAAM,IAAI,MAAM;CAUjB;AAED,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIvD;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,OAAO,SAAiB;CAIrC;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAc;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,QAAQ,SAAa;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAAa;CAIjC;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIhE;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAsB;CAI1C;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAA0B;CAI9C;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,OAAO,SAAwB;CAI5C;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,SAAoB;CAIxC;AAGD,eAAO,MAAM,aAAa,kBAAY,CAAA;AACtC,eAAO,MAAM,mBAAmB,wBAAkB,CAAA;AAClD,eAAO,MAAM,qBAAqB,0BAAoB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,sBAAsB,2BAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,2BAA2B,gCAA0B,CAAA;AAClE,eAAO,MAAM,uBAAuB,4BAAsB,CAAA;AA6G1D,wBAAgB,kBAAkB,CAAC,KAAK,UAAQ,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/error/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIrD,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,aAAa,EAAE,OAAO,CAAA;IACtC,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAA;gBAG/B,OAAO,EAAE,MAAM,EACf,UAAU,SAAM,EAChB,IAAI,SAAmB,EACvB,OAAO,CAAC,EAAE,OAAO;IAenB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAIhE,MAAM,CAAC,YAAY,CAAC,OAAO,SAAiB,GAAG,SAAS;IAIxD,MAAM,CAAC,SAAS,CAAC,OAAO,SAAc,GAAG,SAAS;IAIlD,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAa,GAAG,SAAS;IAIjD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI3C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAInE,MAAM,CAAC,eAAe,CAAC,OAAO,SAAsB,GAAG,SAAS;IAIhE,MAAM,CAAC,QAAQ,CAAC,OAAO,SAA0B,GAAG,SAAS;IAI7D,MAAM,CAAC,kBAAkB,CAAC,OAAO,SAAwB,GAAG,SAAS;IAIrE,MAAM,CAAC,cAAc,CAAC,OAAO,SAAoB,GAAG,SAAS;IAI7D,MAAM,IAAI,MAAM;CAUjB;AAED,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIvD;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,OAAO,SAAiB;CAIrC;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAc;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,QAAQ,SAAa;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAAa;CAIjC;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIhE;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAsB;CAI1C;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAA0B;CAI9C;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,OAAO,SAAwB;CAI5C;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,SAAoB;CAIxC;AAGD,eAAO,MAAM,aAAa,kBAAY,CAAA;AACtC,eAAO,MAAM,mBAAmB,wBAAkB,CAAA;AAClD,eAAO,MAAM,qBAAqB,0BAAoB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,sBAAsB,2BAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,2BAA2B,gCAA0B,CAAA;AAClE,eAAO,MAAM,uBAAuB,4BAAsB,CAAA;AA6G1D,wBAAgB,kBAAkB,CAAC,KAAK,UAAQ,GAAG,YAAY,CAuH9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIjD"}
|
package/dist/error/errors.js
CHANGED
|
@@ -281,6 +281,22 @@ function createErrorHandler(isDev = false) {
|
|
|
281
281
|
'Validation Error: ' +
|
|
282
282
|
yupErrors.map((e) => `${e.path}: ${e.message}`).join(', ');
|
|
283
283
|
}
|
|
284
|
+
// Normalize Tex ValidatorError
|
|
285
|
+
else if (err.name === 'ValidatorError' &&
|
|
286
|
+
'errors' in err &&
|
|
287
|
+
Array.isArray(err.errors)) {
|
|
288
|
+
const texErrors = err.errors;
|
|
289
|
+
res.status(400).json({
|
|
290
|
+
statusCode: 400,
|
|
291
|
+
error: 'Bad Request',
|
|
292
|
+
message: 'Validation Error',
|
|
293
|
+
errors: texErrors.reduce((acc, e) => {
|
|
294
|
+
acc[e.path] = e.message;
|
|
295
|
+
return acc;
|
|
296
|
+
}, {}),
|
|
297
|
+
});
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
284
300
|
res.status(400).json({
|
|
285
301
|
statusCode: 400,
|
|
286
302
|
error: 'Bad Request',
|