exisjs 0.6.1 → 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 +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 +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-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/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 +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/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,117 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/integrations/openai"
|
|
3
|
-
nextTitle: "OpenAI"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Resend (Email) Integration
|
|
7
|
-
|
|
8
|
-
ExisJS provides an integration for Resend to send emails.
|
|
9
|
-
|
|
10
|
-
Just like all our other integrations, ExisJS treats the `resend` SDK as an optional dependency. You only install it if you need it, keeping your core application lightweight.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Environment Variables
|
|
15
|
-
|
|
16
|
-
The Resend plugin securely reads your API key directly from your `.env` file.
|
|
17
|
-
|
|
18
|
-
Before using the plugin, ensure you have your API key set:
|
|
19
|
-
|
|
20
|
-
```bash filename=".env"
|
|
21
|
-
RESEND_API_KEY="re_123456789"
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## Installation
|
|
27
|
-
|
|
28
|
-
ExisJS wraps the official `resend` Node.js SDK.
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
npm install resend
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Usage
|
|
37
|
-
|
|
38
|
-
Simply import the `resend` proxy from `exisjs/resend`. ExisJS will boot the client behind the scenes the first time you attempt to send an email.
|
|
39
|
-
|
|
40
|
-
#### Functional Paradigm
|
|
41
|
-
|
|
42
|
-
```typescript filename="src/http/emails/route.ts"
|
|
43
|
-
import { controller, route } from 'exisjs/router'
|
|
44
|
-
import { resend } from 'exisjs/resend'
|
|
45
|
-
|
|
46
|
-
export default controller({
|
|
47
|
-
sendWelcomeEmail: route.post('/welcome', {
|
|
48
|
-
async handle(req) {
|
|
49
|
-
const { email, name } = req.body
|
|
50
|
-
|
|
51
|
-
// The resend client lazy-loads here
|
|
52
|
-
const { data, error } = await resend.emails.send({
|
|
53
|
-
from: 'Acme <onboarding@resend.dev>',
|
|
54
|
-
to: [email],
|
|
55
|
-
subject: 'Welcome to Acme!',
|
|
56
|
-
html: `<strong>Hello ${name}, welcome aboard!</strong>`
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
if (error) {
|
|
60
|
-
return { success: false, error }
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return { success: true, data }
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
})
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
#### Class-Based (OOP) Paradigm
|
|
70
|
-
|
|
71
|
-
```typescript filename="src/http/emails/route.ts"
|
|
72
|
-
import { Controller, Post, Body } from 'exisjs/decorators'
|
|
73
|
-
import { resend } from 'exisjs/resend'
|
|
74
|
-
|
|
75
|
-
@Controller('/emails')
|
|
76
|
-
export default class EmailsController {
|
|
77
|
-
|
|
78
|
-
@Post('/welcome')
|
|
79
|
-
async sendWelcomeEmail(@Body() body: any) {
|
|
80
|
-
// The resend client automatically lazy-loads here!
|
|
81
|
-
const { data, error } = await resend.emails.send({
|
|
82
|
-
from: 'Acme <onboarding@resend.dev>',
|
|
83
|
-
to: [body.email],
|
|
84
|
-
subject: 'Welcome to Acme!',
|
|
85
|
-
html: `<strong>Hello ${body.name}, welcome aboard!</strong>`
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
if (error) {
|
|
89
|
-
return { success: false, error }
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return { success: true, data }
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Customizing Connection Options
|
|
100
|
-
|
|
101
|
-
If you need to pass custom options to the Resend Client, call `configureResend(options)` inside your `server.ts` `onStart` hook.
|
|
102
|
-
|
|
103
|
-
```typescript filename="src/http/server.ts"
|
|
104
|
-
import { exis } from 'exisjs'
|
|
105
|
-
import { configureResend } from 'exisjs/resend'
|
|
106
|
-
|
|
107
|
-
export default exis({
|
|
108
|
-
async onStart() {
|
|
109
|
-
// Inject custom fetch options or headers
|
|
110
|
-
configureResend({
|
|
111
|
-
headers: {
|
|
112
|
-
'X-Custom-Header': 'ExisJS'
|
|
113
|
-
}
|
|
114
|
-
})
|
|
115
|
-
}
|
|
116
|
-
})
|
|
117
|
-
```
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/integrations/resend"
|
|
3
|
-
nextTitle: "Resend"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# AWS S3 Integration
|
|
7
|
-
|
|
8
|
-
ExisJS provides an integration for AWS S3 via the official `@aws-sdk/client-s3` package.
|
|
9
|
-
|
|
10
|
-
You do **NOT** need to write boilerplate to initialize the AWS SDK. The S3 client is lazily initialized when you execute your first `PutObject` or `GetObject` command.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Environment Variables
|
|
15
|
-
|
|
16
|
-
The AWS S3 plugin securely reads your credentials directly from your `.env` file using the industry-standard AWS variable names.
|
|
17
|
-
|
|
18
|
-
Before using the plugin, ensure you have your credentials set:
|
|
19
|
-
|
|
20
|
-
```bash filename=".env"
|
|
21
|
-
AWS_ACCESS_KEY_ID="your_access_key"
|
|
22
|
-
AWS_SECRET_ACCESS_KEY="your_secret_key"
|
|
23
|
-
AWS_REGION="us-east-1"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Installation
|
|
29
|
-
|
|
30
|
-
ExisJS wraps the `@aws-sdk/client-s3` library.
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npm install @aws-sdk/client-s3
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Usage
|
|
39
|
-
|
|
40
|
-
Simply import the `s3` proxy from `exisjs/s3` and use standard AWS SDK commands. ExisJS will boot the client behind the scenes.
|
|
41
|
-
|
|
42
|
-
#### Functional Paradigm
|
|
43
|
-
|
|
44
|
-
```typescript filename="src/http/uploads/route.ts"
|
|
45
|
-
import { controller, route } from 'exisjs/router'
|
|
46
|
-
import { s3 } from 'exisjs/s3'
|
|
47
|
-
import { PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'
|
|
48
|
-
|
|
49
|
-
export default controller({
|
|
50
|
-
// ExisJS parses multipart/form-data when you access req.files
|
|
51
|
-
uploadFile: route.post('/', {
|
|
52
|
-
async handle(req) {
|
|
53
|
-
// req.files is automatically populated natively by ExisJS
|
|
54
|
-
const file = req.files[0]
|
|
55
|
-
|
|
56
|
-
const command = new PutObjectCommand({
|
|
57
|
-
Bucket: 'my-exis-bucket',
|
|
58
|
-
Key: file.filename,
|
|
59
|
-
Body: file.data, // Buffer
|
|
60
|
-
ContentType: file.mimetype,
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
// The s3 client lazy-loads here
|
|
64
|
-
await s3.send(command)
|
|
65
|
-
|
|
66
|
-
return { success: true, url: `https://my-exis-bucket.s3.amazonaws.com/${file.filename}` }
|
|
67
|
-
}
|
|
68
|
-
})
|
|
69
|
-
})
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
#### Class-Based (OOP) Paradigm
|
|
73
|
-
|
|
74
|
-
```typescript filename="src/http/uploads/route.ts"
|
|
75
|
-
import { Controller, Post, UploadedFile, type ExisFile } from 'exisjs/decorators'
|
|
76
|
-
import { s3 } from 'exisjs/s3'
|
|
77
|
-
import { PutObjectCommand } from '@aws-sdk/client-s3'
|
|
78
|
-
|
|
79
|
-
@Controller('/uploads')
|
|
80
|
-
export default class UploadsController {
|
|
81
|
-
|
|
82
|
-
@Post('/')
|
|
83
|
-
async uploadFile(@UploadedFile('avatar') file: ExisFile) {
|
|
84
|
-
const command = new PutObjectCommand({
|
|
85
|
-
Bucket: 'my-exis-bucket',
|
|
86
|
-
Key: file.filename,
|
|
87
|
-
Body: file.data, // Buffer
|
|
88
|
-
ContentType: file.mimetype,
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
// The s3 client automatically lazy-loads here!
|
|
92
|
-
await s3.send(command)
|
|
93
|
-
|
|
94
|
-
return { success: true, url: `https://my-exis-bucket.s3.amazonaws.com/${file.filename}` }
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Customizing Connection Options
|
|
102
|
-
|
|
103
|
-
If you need to pass custom options to the S3 Client (like a custom Endpoint URL for Cloudflare R2 or DigitalOcean Spaces), call `configureS3(options)` inside your `server.ts` `onStart` hook.
|
|
104
|
-
|
|
105
|
-
```typescript filename="src/http/server.ts"
|
|
106
|
-
import { exis } from 'exisjs'
|
|
107
|
-
import { configureS3 } from 'exisjs/s3'
|
|
108
|
-
|
|
109
|
-
export default exis({
|
|
110
|
-
async onStart() {
|
|
111
|
-
// Compatible with S3 APIs like Cloudflare R2
|
|
112
|
-
configureS3({
|
|
113
|
-
endpoint: 'https://<ACCOUNT_ID>.r2.cloudflarestorage.com',
|
|
114
|
-
forcePathStyle: true
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
<Hint>
|
|
121
|
-
Because ExisJS uses the official AWS SDK under the hood, the S3 integration works with Cloudflare R2, DigitalOcean Spaces, MinIO, and any other S3-compatible storage provider.
|
|
122
|
-
</Hint>
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
nextUrl: "/docs/integrations/s3"
|
|
3
|
-
nextTitle: "AWS S3"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Swagger OpenAPI
|
|
7
|
-
|
|
8
|
-
ExisJS comes with a native **Swagger UI & OpenAPI 3.0** generator built directly into the framework. It parses your routes, path parameters, and schema validations to generate an API explorer.
|
|
9
|
-
|
|
10
|
-
You do **not** need to maintain OpenAPI YAML files or write decorators.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Usage
|
|
15
|
-
|
|
16
|
-
To enable Swagger UI, simply import `serveSwagger` and call it inside the `onStart` hook in your `server.ts`.
|
|
17
|
-
|
|
18
|
-
```typescript filename="src/http/server.ts"
|
|
19
|
-
import { exis } from 'exisjs'
|
|
20
|
-
import { serveSwagger } from 'exisjs/swagger'
|
|
21
|
-
|
|
22
|
-
export default exis({
|
|
23
|
-
async onStart(app) {
|
|
24
|
-
// Generate and mount Swagger UI
|
|
25
|
-
serveSwagger(app, {
|
|
26
|
-
path: '/api-docs', // Defaults to '/docs'
|
|
27
|
-
title: 'My Startup API',
|
|
28
|
-
version: '1.0.0',
|
|
29
|
-
components: {
|
|
30
|
-
securitySchemes: {
|
|
31
|
-
bearerAuth: {
|
|
32
|
-
type: 'http',
|
|
33
|
-
scheme: 'bearer',
|
|
34
|
-
bearerFormat: 'JWT'
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
})
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Once your server starts, navigate to `http://localhost:4000/api-docs` to see your auto-generated Swagger UI. The raw OpenAPI JSON payload will be available at `/api-docs/json`.
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Automatic Schema Generation
|
|
48
|
-
|
|
49
|
-
ExisJS integrates with its internal `v` validator. Any validation schemas attached to your routes (whether Functional or OOP) are automatically translated into OpenAPI specifications.
|
|
50
|
-
|
|
51
|
-
#### Functional Paradigm
|
|
52
|
-
|
|
53
|
-
```typescript filename="src/http/users/route.ts"
|
|
54
|
-
import { controller, route } from 'exisjs/router'
|
|
55
|
-
import { tex } from 'exisjs/validator'
|
|
56
|
-
|
|
57
|
-
export default controller({
|
|
58
|
-
createUser: route.post('/', {
|
|
59
|
-
// This schema is automatically translated to OpenAPI request body definitions
|
|
60
|
-
body: tex.object({
|
|
61
|
-
name: tex.string(),
|
|
62
|
-
age: tex.number({ optional: true })
|
|
63
|
-
}),
|
|
64
|
-
async handle(req) {
|
|
65
|
-
return { success: true, name: req.body.name }
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
})
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
#### Class-Based (OOP) Paradigm
|
|
72
|
-
|
|
73
|
-
```typescript filename="src/http/users/route.ts"
|
|
74
|
-
import { Controller, Post, Body } from 'exisjs/decorators'
|
|
75
|
-
import { tex } from 'exisjs/validator'
|
|
76
|
-
|
|
77
|
-
const CreateUserSchema = tex.object({
|
|
78
|
-
name: tex.string(),
|
|
79
|
-
age: tex.number({ optional: true })
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
@Controller('/users')
|
|
83
|
-
export default class UsersController {
|
|
84
|
-
@Post('/', { body: CreateUserSchema })
|
|
85
|
-
async createUser(@Body() body: any) {
|
|
86
|
-
return { success: true, name: body.name }
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
When you view Swagger UI, the `POST /users` endpoint will show the JSON body required, properly displaying the string/number types and required/optional flags.
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Gateway Cascading Metadata
|
|
96
|
-
|
|
97
|
-
If you want to apply OpenAPI tags or security schemas to an entire folder of routes without decorating every endpoint, you can use ExisJS Gateways.
|
|
98
|
-
|
|
99
|
-
```typescript filename="src/http/admin/gateway.ts"
|
|
100
|
-
import { defineGateway } from 'exisjs/router'
|
|
101
|
-
|
|
102
|
-
export default defineGateway({
|
|
103
|
-
// Every route in the /admin folder automatically inherits these OpenAPI tags
|
|
104
|
-
metadata: {
|
|
105
|
-
openapi: {
|
|
106
|
-
tags: ['Admin Management API'],
|
|
107
|
-
security: ['bearerAuth']
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
})
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Now, every route under `/admin/*` will be grouped under the "Admin Management API" section in your Swagger UI.
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Adapters"
|
|
3
|
-
description: "Strict API Reference for all Serverless and Edge adapters."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Adapters (`exisjs/adapters`)
|
|
7
|
-
|
|
8
|
-
This document provides the strict API signatures and TypeScript interfaces exported by the `exisjs/adapters` module. For high-level deployment guides, see the [Adapters Guide](/docs/adapters).
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## `aws`
|
|
13
|
-
|
|
14
|
-
Converts API Gateway events into a native Node.js HTTP stream.
|
|
15
|
-
|
|
16
|
-
```typescript
|
|
17
|
-
function aws(app: App): (event: APIGatewayEvent) => Promise<APIGatewayResult>
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### `APIGatewayEvent`
|
|
21
|
-
```typescript
|
|
22
|
-
interface APIGatewayEvent {
|
|
23
|
-
httpMethod: string;
|
|
24
|
-
path: string;
|
|
25
|
-
headers: Record<string, string | undefined>;
|
|
26
|
-
body: string | null;
|
|
27
|
-
isBase64Encoded: boolean;
|
|
28
|
-
queryStringParameters?: Record<string, string | undefined>;
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### `APIGatewayResult`
|
|
33
|
-
```typescript
|
|
34
|
-
interface APIGatewayResult {
|
|
35
|
-
statusCode: number;
|
|
36
|
-
headers: Record<string, string>;
|
|
37
|
-
body: string;
|
|
38
|
-
isBase64Encoded: boolean;
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
---
|
|
43
|
-
|
|
44
|
-
## `vercel`
|
|
45
|
-
|
|
46
|
-
Provides a bridge between Vercel's Node.js Serverless runtime and ExisJS.
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
function vercel(
|
|
50
|
-
app: App,
|
|
51
|
-
options?: { cwd?: string }
|
|
52
|
-
): (req: VercelRequest, res: VercelResponse) => void | Promise<void>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### `VercelRequest` & `VercelResponse`
|
|
56
|
-
These are re-exported from `@vercel/node`. The adapter intercepts these and patches the internal socket state to satisfy the ExisJS pipeline.
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## `fetch`
|
|
61
|
-
|
|
62
|
-
The universal Web Standard adapter. Converts standard Web `Request` objects into internal HTTP pipelines and resolves back to a Web `Response`.
|
|
63
|
-
|
|
64
|
-
```typescript
|
|
65
|
-
function fetch(
|
|
66
|
-
app: App
|
|
67
|
-
): (request: Request, env?: any, ctx?: any) => Promise<Response>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
*Note: The `env` and `ctx` arguments are seamlessly injected into the ExisJS routing context, allowing you to access platform-specific bindings (e.g. Cloudflare KV).*
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## `cloudflare`
|
|
75
|
-
|
|
76
|
-
A dedicated wrapper for Cloudflare Workers that returns the expected ES Module format.
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
function cloudflare(
|
|
80
|
-
app: App
|
|
81
|
-
): { fetch: (request: Request, env: any, ctx: ExecutionContext) => Promise<Response> }
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## `bun`
|
|
87
|
-
|
|
88
|
-
A dedicated wrapper for the `Bun.serve()` configuration object.
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
function bun(
|
|
92
|
-
app: App
|
|
93
|
-
): { fetch: (request: Request) => Promise<Response> }
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## `deno`
|
|
99
|
-
|
|
100
|
-
A dedicated wrapper for `Deno.serve()`.
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
function deno(
|
|
104
|
-
app: App
|
|
105
|
-
): (request: Request) => Promise<Response>
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
---
|
|
109
|
-
|
|
110
|
-
## `netlify`
|
|
111
|
-
|
|
112
|
-
A dedicated wrapper for Netlify Edge Functions.
|
|
113
|
-
|
|
114
|
-
```typescript
|
|
115
|
-
function netlify(
|
|
116
|
-
app: App
|
|
117
|
-
): (request: Request, context: NetlifyContext) => Promise<Response>
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## `fastly`
|
|
123
|
-
|
|
124
|
-
A dedicated wrapper for Fastly Compute@Edge which binds to the global `addEventListener` fetch event.
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
function fastly(
|
|
128
|
-
app: App
|
|
129
|
-
): (event: FetchEvent) => void
|
|
130
|
-
```
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: "Authentication"
|
|
3
|
-
description: "API Reference for ExisJS Authentication utilities (`exisjs/auth`)."
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Authentication (`exisjs/auth`)
|
|
7
|
-
|
|
8
|
-
ExisJS ships with a completely native, dependency-free `auth` module that covers the most critical security implementations: Scrypt Password Hashing, JWT (JSON Web Tokens), Session Management, and Role-Based Access Control (RBAC).
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 1. Password Hashing (Scrypt)
|
|
13
|
-
|
|
14
|
-
ExisJS natively uses Node's highly secure `scrypt` algorithm to hash passwords. It automatically generates a cryptographically secure salt and stores the parameters in a single string format (`scrypt:N:r:p:keylen:salt:hash`) so you never have to manage them separately.
|
|
15
|
-
|
|
16
|
-
```typescript filename="src/services/AuthService.ts"
|
|
17
|
-
import { Password } from 'exisjs/auth'
|
|
18
|
-
|
|
19
|
-
// Hashing a new password
|
|
20
|
-
const hashedPassword = await Password.hashPassword('my-super-secret-password', {
|
|
21
|
-
cost: 16384, // Higher cost = harder to brute force, but slower to compute
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
// Verifying a login attempt
|
|
25
|
-
const isValid = await Password.verifyPassword('my-super-secret-password', hashedPassword)
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## 2. JSON Web Tokens (JWT)
|
|
31
|
-
|
|
32
|
-
You can instantly sign and verify JWTs without needing third-party libraries like `jsonwebtoken`.
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
import { JWT } from 'exisjs/auth'
|
|
36
|
-
|
|
37
|
-
// Sign a token valid for 2 hours
|
|
38
|
-
const token = JWT.signJWT(
|
|
39
|
-
{ userId: '123', role: 'admin' },
|
|
40
|
-
process.env.JWT_SECRET,
|
|
41
|
-
{ expiresIn: 2 * 60 * 60 }
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
// Verifying token returns the exact typed payload
|
|
46
|
-
const payload = JWT.verifyJWT<{ userId: string, role: string }>(token, process.env.JWT_SECRET)
|
|
47
|
-
console.log(payload.userId)
|
|
48
|
-
} catch (err) {
|
|
49
|
-
if (err.name === 'TokenExpiredError') {
|
|
50
|
-
// Handle expired token
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
## 3. Session Middleware
|
|
58
|
-
|
|
59
|
-
If you prefer stateful authentication, ExisJS provides extremely robust session middleware out of the box. It leverages signed HTTP-only cookies to track users and automatically synchronizes session state back to the store (Memory, Redis, etc.) when the request ends.
|
|
60
|
-
|
|
61
|
-
### Global Setup via Plugin (`exis.config.ts`)
|
|
62
|
-
|
|
63
|
-
Because ExisJS utilizes a file-based architecture with no manual server entry point, global middlewares like `session` should be attached using a Plugin.
|
|
64
|
-
|
|
65
|
-
```typescript filename="src/plugins/session.ts"
|
|
66
|
-
import { definePlugin } from 'exisjs/plugin'
|
|
67
|
-
import { session } from 'exisjs/auth'
|
|
68
|
-
|
|
69
|
-
export const sessionPlugin = definePlugin({
|
|
70
|
-
name: 'global-session',
|
|
71
|
-
register(app) {
|
|
72
|
-
app.use(session({
|
|
73
|
-
secret: process.env.SESSION_SECRET || 'fallback-secret-minimum-32-chars-long!',
|
|
74
|
-
cookieName: 'exis_sid',
|
|
75
|
-
ttl: 86400 * 1000, // 1 day in milliseconds
|
|
76
|
-
// store: new RedisSessionStore(...)
|
|
77
|
-
}))
|
|
78
|
-
}
|
|
79
|
-
})
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Then, natively register your plugin in `exis.config.ts`:
|
|
83
|
-
|
|
84
|
-
```typescript filename="exis.config.ts"
|
|
85
|
-
import { defineConfig } from 'exisjs/config'
|
|
86
|
-
import { sessionPlugin } from './src/plugins/session'
|
|
87
|
-
|
|
88
|
-
export default defineConfig({
|
|
89
|
-
plugins: [
|
|
90
|
-
sessionPlugin()
|
|
91
|
-
]
|
|
92
|
-
})
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
Once registered, you can read and write to `req.session` anywhere in your application!
|
|
96
|
-
|
|
97
|
-
### Functional Example
|
|
98
|
-
|
|
99
|
-
```typescript filename="src/http/auth/route.ts"
|
|
100
|
-
import { controller, route } from 'exisjs/router'
|
|
101
|
-
import { HttpError } from 'exisjs/error'
|
|
102
|
-
|
|
103
|
-
export default controller({
|
|
104
|
-
login: route.post('/login', {
|
|
105
|
-
async handle(ctx) {
|
|
106
|
-
const user = await db.users.findByEmail(ctx.body.email)
|
|
107
|
-
if (!user) throw HttpError.unauthorized('Invalid credentials')
|
|
108
|
-
|
|
109
|
-
// Login the user by attaching data to the session
|
|
110
|
-
ctx.req.session.userId = user.id
|
|
111
|
-
ctx.req.session.role = user.role
|
|
112
|
-
|
|
113
|
-
return { success: true }
|
|
114
|
-
}
|
|
115
|
-
})
|
|
116
|
-
})
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Class-Based (OOP) Example
|
|
120
|
-
|
|
121
|
-
```typescript filename="src/http/auth/route.ts"
|
|
122
|
-
import { Controller, Post, Body, Req } from 'exisjs/decorators'
|
|
123
|
-
import type { Request } from 'exisjs'
|
|
124
|
-
|
|
125
|
-
@Controller('/auth')
|
|
126
|
-
export default class AuthController {
|
|
127
|
-
|
|
128
|
-
@Post('/login')
|
|
129
|
-
async login(@Body() body: any, @Req() req: Request) {
|
|
130
|
-
const user = await db.users.findByEmail(body.email)
|
|
131
|
-
|
|
132
|
-
// Attach to session
|
|
133
|
-
req.session.userId = user.id
|
|
134
|
-
req.session.role = user.role
|
|
135
|
-
|
|
136
|
-
return { success: true }
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## 4. Role-Based Access Control (RBAC)
|
|
144
|
-
|
|
145
|
-
The `requireRole` middleware checks if the current authenticated user has the necessary permissions to access a route.
|
|
146
|
-
|
|
147
|
-
*Note: This middleware expects that `req.user.role` was populated by an earlier authentication middleware (like a JWT Verifier or a Session Restorer).*
|
|
148
|
-
|
|
149
|
-
### Functional Example
|
|
150
|
-
|
|
151
|
-
```typescript filename="src/http/admin/route.ts"
|
|
152
|
-
import { controller, route } from 'exisjs/router'
|
|
153
|
-
import { requireRole } from 'exisjs/auth'
|
|
154
|
-
|
|
155
|
-
export default controller({
|
|
156
|
-
getDashboard: route.get('/dashboard', {
|
|
157
|
-
middleware: [
|
|
158
|
-
// Only users with 'admin' or 'superadmin' roles can access this route
|
|
159
|
-
requireRole(['admin', 'superadmin'])
|
|
160
|
-
],
|
|
161
|
-
async handle() {
|
|
162
|
-
return { metrics: [] }
|
|
163
|
-
}
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Class-Based (OOP) Example
|
|
169
|
-
|
|
170
|
-
```typescript filename="src/http/admin/route.ts"
|
|
171
|
-
import { Controller, Get, Use } from 'exisjs/decorators'
|
|
172
|
-
import { requireRole } from 'exisjs/auth'
|
|
173
|
-
|
|
174
|
-
@Controller('/admin')
|
|
175
|
-
export default class AdminController {
|
|
176
|
-
|
|
177
|
-
@Get('/dashboard')
|
|
178
|
-
@Use(requireRole(['admin', 'superadmin']))
|
|
179
|
-
async getDashboard() {
|
|
180
|
-
return { metrics: [] }
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
```
|