@lastshotlabs/bunshot 0.0.27 → 0.0.28
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/.oclif.manifest.json +39 -0
- package/README.md +8282 -2147
- package/dist/cli/commands/init.js +690 -0
- package/dist/cli/index.js +6 -0
- package/dist/cli.js +4 -4
- package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
- package/dist/packages/bunshot-admin/src/index.js +11 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
- package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-admin/src/plugin.js +46 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
- package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
- package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
- package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
- package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
- package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
- package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
- package/dist/packages/bunshot-admin/src/types/config.js +37 -0
- package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
- package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
- package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
- package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
- package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
- package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
- package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
- package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
- package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
- package/dist/packages/bunshot-auth/src/index.js +23 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
- package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
- package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
- package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
- package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
- package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
- package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
- package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
- package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
- package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
- package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
- package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
- package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
- package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
- package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
- package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
- package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
- package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
- package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
- package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
- package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
- package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
- package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
- package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
- package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
- package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
- package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
- package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
- package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
- package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
- package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
- package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
- package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
- package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
- package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
- package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
- package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
- package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
- package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
- package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
- package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
- package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
- package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
- package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
- package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
- package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
- package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/plugin.js +274 -0
- package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
- package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
- package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
- package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
- package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
- package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
- package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
- package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
- package/dist/packages/bunshot-auth/src/runtime.js +11 -0
- package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
- package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
- package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
- package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
- package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
- package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
- package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
- package/dist/packages/bunshot-auth/src/testing.js +23 -0
- package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
- package/dist/packages/bunshot-auth/src/types/config.js +179 -0
- package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
- package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
- package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
- package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
- package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
- package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/types/session.js +1 -0
- package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
- package/dist/packages/bunshot-auth/src/types/store.js +1 -0
- package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
- package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
- package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
- package/dist/packages/bunshot-core/src/auditLog.js +1 -0
- package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
- package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
- package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
- package/dist/packages/bunshot-core/src/authVariables.js +4 -0
- package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
- package/dist/packages/bunshot-core/src/cache.js +21 -0
- package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
- package/dist/packages/bunshot-core/src/captcha.js +1 -0
- package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
- package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
- package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
- package/dist/packages/bunshot-core/src/clientIp.js +45 -0
- package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
- package/dist/packages/bunshot-core/src/configLock.js +7 -0
- package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
- package/dist/packages/bunshot-core/src/configValidation.js +39 -0
- package/dist/packages/bunshot-core/src/constants.js +10 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
- package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
- package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
- package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
- package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
- package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
- package/dist/packages/bunshot-core/src/context/index.js +2 -0
- package/dist/packages/bunshot-core/src/context.d.ts +40 -0
- package/dist/packages/bunshot-core/src/context.js +35 -0
- package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
- package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
- package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
- package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
- package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
- package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
- package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
- package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
- package/dist/packages/bunshot-core/src/crypto.js +74 -0
- package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
- package/dist/packages/bunshot-core/src/csrf.js +1 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
- package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
- package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
- package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
- package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
- package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
- package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
- package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
- package/dist/packages/bunshot-core/src/eventBus.js +143 -0
- package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
- package/dist/packages/bunshot-core/src/idempotency.js +1 -0
- package/dist/packages/bunshot-core/src/index.d.ts +60 -0
- package/dist/packages/bunshot-core/src/index.js +34 -0
- package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
- package/dist/packages/bunshot-core/src/mail.js +8 -0
- package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
- package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
- package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
- package/dist/packages/bunshot-core/src/pagination.js +61 -0
- package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
- package/dist/packages/bunshot-core/src/permissions.js +27 -0
- package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
- package/dist/packages/bunshot-core/src/plugin.js +1 -0
- package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
- package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
- package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
- package/dist/packages/bunshot-core/src/redis.js +1 -0
- package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
- package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
- package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
- package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
- package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
- package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
- package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
- package/dist/packages/bunshot-core/src/secrets.js +8 -0
- package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
- package/dist/packages/bunshot-core/src/signing.js +1 -0
- package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
- package/dist/packages/bunshot-core/src/sse.js +1 -0
- package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
- package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
- package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
- package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
- package/dist/packages/bunshot-core/src/storeType.js +1 -0
- package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
- package/dist/packages/bunshot-core/src/testing.js +1 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
- package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
- package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
- package/dist/packages/bunshot-core/src/userResolver.js +14 -0
- package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
- package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
- package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/index.js +5 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
- package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
- package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
- package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
- package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
- package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
- package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
- package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
- package/dist/packages/bunshot-postgres/src/connection.js +16 -0
- package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
- package/dist/packages/bunshot-postgres/src/index.js +2 -0
- package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
- package/dist/packages/bunshot-postgres/src/schema.js +105 -0
- package/dist/src/app.d.ts +230 -0
- package/dist/src/app.js +182 -0
- package/dist/src/cli/commands/init.d.ts +10 -0
- package/dist/src/cli/commands/init.js +709 -0
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +3 -0
- package/dist/src/entrypoints/mongo.d.ts +6 -0
- package/dist/src/entrypoints/mongo.js +4 -0
- package/dist/src/entrypoints/queue.d.ts +2 -0
- package/dist/src/entrypoints/queue.js +1 -0
- package/dist/src/entrypoints/redis.d.ts +1 -0
- package/dist/src/entrypoints/redis.js +1 -0
- package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
- package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
- package/dist/src/framework/adapters/memoryStorage.js +45 -0
- package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
- package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
- package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
- package/dist/src/framework/admin/bunshotAccess.js +23 -0
- package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
- package/dist/src/framework/admin/bunshotUsers.js +103 -0
- package/dist/src/framework/admin/index.d.ts +7 -0
- package/dist/src/framework/admin/index.js +21 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
- package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
- package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
- package/dist/src/framework/boundaryAdapters/index.js +1 -0
- package/dist/src/framework/boundaryAdapters.d.ts +17 -0
- package/dist/src/framework/boundaryAdapters.js +62 -0
- package/dist/src/framework/buildContext.d.ts +33 -0
- package/dist/src/framework/buildContext.js +119 -0
- package/dist/src/framework/config/schema.d.ts +447 -0
- package/dist/src/framework/config/schema.js +528 -0
- package/dist/src/framework/createInfrastructure.d.ts +76 -0
- package/dist/src/framework/createInfrastructure.js +221 -0
- package/dist/src/framework/lib/auditLog.d.ts +23 -0
- package/dist/src/framework/lib/auditLog.js +416 -0
- package/dist/src/framework/lib/captcha.d.ts +11 -0
- package/dist/{lib → src/framework/lib}/captcha.js +13 -10
- package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
- package/dist/src/framework/lib/createRoute.d.ts +1 -0
- package/dist/src/framework/lib/createRoute.js +2 -0
- package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
- package/dist/src/framework/lib/idempotency.js +74 -0
- package/dist/src/framework/lib/logger.d.ts +3 -0
- package/dist/src/framework/lib/logger.js +14 -0
- package/dist/src/framework/lib/metrics.d.ts +34 -0
- package/dist/{lib → src/framework/lib}/metrics.js +49 -57
- package/dist/src/framework/lib/pagination.d.ts +42 -0
- package/dist/src/framework/lib/pagination.js +51 -0
- package/dist/src/framework/lib/redisTransport.d.ts +38 -0
- package/dist/src/framework/lib/redisTransport.js +107 -0
- package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
- package/dist/src/framework/lib/resolveUserId.js +5 -0
- package/dist/src/framework/lib/sseCollision.d.ts +6 -0
- package/dist/src/framework/lib/sseCollision.js +26 -0
- package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
- package/dist/src/framework/lib/storageAdapter.js +1 -0
- package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
- package/dist/src/framework/lib/tenant.d.ts +21 -0
- package/dist/src/framework/lib/tenant.js +70 -0
- package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
- package/dist/src/framework/lib/upload.js +132 -0
- package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
- package/dist/src/framework/lib/uploadRegistry.js +34 -0
- package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/validate.js +2 -2
- package/dist/src/framework/lib/ws.d.ts +19 -0
- package/dist/src/framework/lib/ws.js +130 -0
- package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
- package/dist/src/framework/lib/wsHeartbeat.js +53 -0
- package/dist/src/framework/lib/wsMessages.d.ts +25 -0
- package/dist/src/framework/lib/wsMessages.js +45 -0
- package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
- package/dist/src/framework/lib/wsNamespace.js +19 -0
- package/dist/src/framework/lib/wsPresence.d.ts +17 -0
- package/dist/src/framework/lib/wsPresence.js +84 -0
- package/dist/src/framework/lib/wsTransport.d.ts +38 -0
- package/dist/src/framework/lib/wsTransport.js +9 -0
- package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
- package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
- package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
- package/dist/src/framework/middleware/auditLog.js +42 -0
- package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
- package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
- package/dist/src/framework/middleware/cacheResponse.js +126 -0
- package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
- package/dist/src/framework/middleware/index.js +1 -0
- package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
- package/dist/src/framework/middleware/metrics.d.ts +12 -0
- package/dist/src/framework/middleware/metrics.js +26 -0
- package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
- package/dist/src/framework/middleware/rateLimit.js +22 -0
- package/dist/src/framework/middleware/requestId.d.ts +3 -0
- package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
- package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
- package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
- package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
- package/dist/src/framework/middleware/tenant.d.ts +14 -0
- package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
- package/dist/src/framework/middleware/upload.d.ts +5 -0
- package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
- package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
- package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
- package/dist/src/framework/models/AuditLog.d.ts +21 -0
- package/dist/src/framework/models/AuditLog.js +31 -0
- package/dist/src/framework/mountMiddleware.d.ts +91 -0
- package/dist/src/framework/mountMiddleware.js +128 -0
- package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
- package/dist/src/framework/mountOptionalEndpoints.js +47 -0
- package/dist/src/framework/mountRoutes.d.ts +21 -0
- package/dist/src/framework/mountRoutes.js +144 -0
- package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
- package/dist/src/framework/persistence/cronRegistry.js +139 -0
- package/dist/src/framework/persistence/idempotency.d.ts +26 -0
- package/dist/src/framework/persistence/idempotency.js +178 -0
- package/dist/src/framework/persistence/index.d.ts +6 -0
- package/dist/src/framework/persistence/index.js +8 -0
- package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
- package/dist/src/framework/persistence/storeInfra.js +1 -0
- package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
- package/dist/src/framework/persistence/uploadRegistry.js +235 -0
- package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
- package/dist/src/framework/persistence/wsMessages.js +296 -0
- package/dist/src/framework/preloadSchemas.d.ts +24 -0
- package/dist/src/framework/preloadSchemas.js +42 -0
- package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
- package/dist/src/framework/registerBoundaryAdapters.js +46 -0
- package/dist/src/framework/routes/admin.d.ts +9 -0
- package/dist/src/framework/routes/admin.js +361 -0
- package/dist/src/framework/routes/health.d.ts +1 -0
- package/dist/src/framework/routes/health.js +21 -0
- package/dist/src/framework/routes/home.d.ts +1 -0
- package/dist/src/framework/routes/home.js +18 -0
- package/dist/src/framework/routes/jobs.d.ts +3 -0
- package/dist/{routes → src/framework/routes}/jobs.js +128 -103
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
- package/dist/src/framework/routes/uploads.js +262 -0
- package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
- package/dist/src/framework/runPluginLifecycle.js +121 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
- package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
- package/dist/src/framework/secrets/index.d.ts +9 -0
- package/dist/src/framework/secrets/index.js +7 -0
- package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
- package/dist/src/framework/secrets/providers/envProvider.js +18 -0
- package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
- package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
- package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
- package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
- package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
- package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
- package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
- package/dist/src/framework/secrets/resolveSecrets.js +34 -0
- package/dist/src/framework/sse/index.d.ts +21 -0
- package/dist/src/framework/sse/index.js +109 -0
- package/dist/src/framework/ws/index.d.ts +11 -0
- package/dist/src/framework/ws/index.js +8 -0
- package/dist/src/index.d.ts +87 -0
- package/dist/src/index.js +58 -0
- package/dist/src/lib/appConfig.d.ts +7 -0
- package/dist/src/lib/appConfig.js +27 -0
- package/dist/src/lib/appMeta.d.ts +7 -0
- package/dist/src/lib/appMeta.js +3 -0
- package/dist/src/lib/authConfig.d.ts +532 -0
- package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
- package/dist/{lib → src/lib}/context.d.ts +6 -12
- package/dist/{lib → src/lib}/context.js +5 -5
- package/dist/src/lib/logger.d.ts +1 -0
- package/dist/src/lib/logger.js +1 -0
- package/dist/src/lib/mongo.d.ts +58 -0
- package/dist/src/lib/mongo.js +96 -0
- package/dist/src/lib/queue.d.ts +72 -0
- package/dist/src/lib/queue.js +152 -0
- package/dist/src/lib/redis.d.ts +28 -0
- package/dist/src/lib/redis.js +72 -0
- package/dist/{lib → src/lib}/signing.d.ts +2 -2
- package/dist/src/lib/signing.js +210 -0
- package/dist/src/lib/signingConfig.d.ts +40 -0
- package/dist/src/lib/signingConfig.js +28 -0
- package/dist/src/server.d.ts +146 -0
- package/dist/src/server.js +469 -0
- package/dist/src/shared/lib/HttpError.d.ts +1 -0
- package/dist/src/shared/lib/HttpError.js +2 -0
- package/dist/src/shared/lib/constants.d.ts +10 -0
- package/dist/src/shared/lib/crypto.d.ts +43 -0
- package/dist/src/shared/lib/crypto.js +74 -0
- package/dist/src/shared/lib/signing.d.ts +52 -0
- package/dist/{lib → src/shared/lib}/signing.js +35 -8
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +60 -24
- package/dist/adapters/memoryAuth.d.ts +0 -52
- package/dist/adapters/memoryAuth.js +0 -749
- package/dist/adapters/memoryStorage.d.ts +0 -3
- package/dist/adapters/memoryStorage.js +0 -44
- package/dist/adapters/mongoAuth.d.ts +0 -2
- package/dist/adapters/mongoAuth.js +0 -403
- package/dist/adapters/sqliteAuth.d.ts +0 -72
- package/dist/adapters/sqliteAuth.js +0 -858
- package/dist/app.d.ts +0 -559
- package/dist/app.js +0 -651
- package/dist/entrypoints/mongo.d.ts +0 -5
- package/dist/entrypoints/mongo.js +0 -4
- package/dist/entrypoints/queue.d.ts +0 -2
- package/dist/entrypoints/queue.js +0 -1
- package/dist/entrypoints/redis.d.ts +0 -1
- package/dist/entrypoints/redis.js +0 -1
- package/dist/index.d.ts +0 -117
- package/dist/index.js +0 -88
- package/dist/lib/appConfig.d.ts +0 -275
- package/dist/lib/auditLog.d.ts +0 -58
- package/dist/lib/auditLog.js +0 -218
- package/dist/lib/authAdapter.d.ts +0 -246
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -117
- package/dist/lib/clientIp.d.ts +0 -14
- package/dist/lib/credentialStuffing.d.ts +0 -31
- package/dist/lib/credentialStuffing.js +0 -77
- package/dist/lib/crypto.d.ts +0 -11
- package/dist/lib/crypto.js +0 -22
- package/dist/lib/deletionCancelToken.d.ts +0 -12
- package/dist/lib/deletionCancelToken.js +0 -88
- package/dist/lib/emailVerification.d.ts +0 -19
- package/dist/lib/emailVerification.js +0 -129
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwks.d.ts +0 -25
- package/dist/lib/jwks.js +0 -51
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -111
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -55
- package/dist/lib/mfaChallenge.js +0 -398
- package/dist/lib/mongo.d.ts +0 -39
- package/dist/lib/mongo.js +0 -124
- package/dist/lib/oauth.d.ts +0 -40
- package/dist/lib/oauth.js +0 -101
- package/dist/lib/oauthCode.d.ts +0 -15
- package/dist/lib/oauthCode.js +0 -95
- package/dist/lib/pagination.d.ts +0 -119
- package/dist/lib/pagination.js +0 -166
- package/dist/lib/queue.d.ts +0 -37
- package/dist/lib/queue.js +0 -117
- package/dist/lib/redis.d.ts +0 -9
- package/dist/lib/redis.js +0 -61
- package/dist/lib/resetPassword.d.ts +0 -12
- package/dist/lib/resetPassword.js +0 -93
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/saml.d.ts +0 -25
- package/dist/lib/saml.js +0 -64
- package/dist/lib/securityEvents.d.ts +0 -28
- package/dist/lib/securityEvents.js +0 -26
- package/dist/lib/session.d.ts +0 -49
- package/dist/lib/session.js +0 -597
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -112
- package/dist/lib/uploadRegistry.d.ts +0 -18
- package/dist/lib/uploadRegistry.js +0 -83
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -96
- package/dist/lib/wsHeartbeat.d.ts +0 -12
- package/dist/lib/wsHeartbeat.js +0 -57
- package/dist/lib/wsMessages.d.ts +0 -40
- package/dist/lib/wsMessages.js +0 -330
- package/dist/lib/wsPresence.d.ts +0 -25
- package/dist/lib/wsPresence.js +0 -99
- package/dist/middleware/auditLog.js +0 -39
- package/dist/middleware/bearerAuth.d.ts +0 -2
- package/dist/middleware/bearerAuth.js +0 -11
- package/dist/middleware/cacheResponse.d.ts +0 -15
- package/dist/middleware/cacheResponse.js +0 -178
- package/dist/middleware/captcha.js +0 -36
- package/dist/middleware/csrf.js +0 -129
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -122
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/metrics.d.ts +0 -9
- package/dist/middleware/metrics.js +0 -26
- package/dist/middleware/rateLimit.js +0 -22
- package/dist/middleware/requestId.d.ts +0 -3
- package/dist/middleware/scimAuth.d.ts +0 -8
- package/dist/middleware/scimAuth.js +0 -29
- package/dist/middleware/tenant.d.ts +0 -5
- package/dist/middleware/upload.d.ts +0 -5
- package/dist/middleware/userAuth.d.ts +0 -3
- package/dist/middleware/userAuth.js +0 -6
- package/dist/models/AuditLog.d.ts +0 -30
- package/dist/models/AuditLog.js +0 -39
- package/dist/models/AuthUser.js +0 -55
- package/dist/models/Group.d.ts +0 -21
- package/dist/models/Group.js +0 -28
- package/dist/models/GroupMembership.js +0 -25
- package/dist/models/TenantRole.d.ts +0 -15
- package/dist/models/TenantRole.js +0 -23
- package/dist/routes/auth.d.ts +0 -12
- package/dist/routes/auth.js +0 -744
- package/dist/routes/groups.js +0 -346
- package/dist/routes/health.d.ts +0 -1
- package/dist/routes/health.js +0 -22
- package/dist/routes/home.d.ts +0 -1
- package/dist/routes/home.js +0 -16
- package/dist/routes/jobs.d.ts +0 -2
- package/dist/routes/m2m.d.ts +0 -2
- package/dist/routes/m2m.js +0 -72
- package/dist/routes/metrics.d.ts +0 -8
- package/dist/routes/metrics.js +0 -55
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -628
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -520
- package/dist/routes/oidc.d.ts +0 -2
- package/dist/routes/oidc.js +0 -29
- package/dist/routes/passkey.d.ts +0 -1
- package/dist/routes/passkey.js +0 -157
- package/dist/routes/saml.d.ts +0 -2
- package/dist/routes/saml.js +0 -86
- package/dist/routes/scim.d.ts +0 -2
- package/dist/routes/scim.js +0 -255
- package/dist/routes/uploads.js +0 -227
- package/dist/schemas/auth.js +0 -30
- package/dist/server.d.ts +0 -57
- package/dist/server.js +0 -112
- package/dist/services/auth.d.ts +0 -29
- package/dist/services/auth.js +0 -238
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -39
- package/docs/sections/adding-middleware/full.md +0 -35
- package/docs/sections/adding-models/full.md +0 -125
- package/docs/sections/adding-models/overview.md +0 -13
- package/docs/sections/adding-routes/full.md +0 -182
- package/docs/sections/adding-routes/overview.md +0 -23
- package/docs/sections/auth-flow/full.md +0 -790
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -388
- package/docs/sections/authentication/full.md +0 -130
- package/docs/sections/authentication/overview.md +0 -5
- package/docs/sections/cli/full.md +0 -42
- package/docs/sections/configuration/full.md +0 -172
- package/docs/sections/configuration/overview.md +0 -18
- package/docs/sections/configuration-example/full.md +0 -117
- package/docs/sections/configuration-example/overview.md +0 -30
- package/docs/sections/documentation/full.md +0 -171
- package/docs/sections/environment-variables/full.md +0 -55
- package/docs/sections/exports/full.md +0 -123
- package/docs/sections/extending-context/full.md +0 -59
- package/docs/sections/header.md +0 -3
- package/docs/sections/installation/full.md +0 -6
- package/docs/sections/jobs/full.md +0 -140
- package/docs/sections/jobs/overview.md +0 -15
- package/docs/sections/logging/full.md +0 -83
- package/docs/sections/metrics/full.md +0 -131
- package/docs/sections/mongodb-connections/full.md +0 -45
- package/docs/sections/mongodb-connections/overview.md +0 -7
- package/docs/sections/multi-tenancy/full.md +0 -66
- package/docs/sections/multi-tenancy/overview.md +0 -15
- package/docs/sections/oauth/full.md +0 -189
- package/docs/sections/oauth/overview.md +0 -16
- package/docs/sections/package-development/full.md +0 -7
- package/docs/sections/pagination/full.md +0 -93
- package/docs/sections/passkey-login/full.md +0 -90
- package/docs/sections/passkey-login/overview.md +0 -1
- package/docs/sections/peer-dependencies/full.md +0 -47
- package/docs/sections/quick-start/full.md +0 -43
- package/docs/sections/response-caching/full.md +0 -117
- package/docs/sections/response-caching/overview.md +0 -13
- package/docs/sections/roles/full.md +0 -225
- package/docs/sections/roles/overview.md +0 -14
- package/docs/sections/running-without-redis/full.md +0 -16
- package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
- package/docs/sections/signing/full.md +0 -203
- package/docs/sections/stack/full.md +0 -10
- package/docs/sections/uploads/full.md +0 -208
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -196
- package/docs/sections/websocket/overview.md +0 -5
- package/docs/sections/websocket-rooms/full.md +0 -102
- package/docs/sections/websocket-rooms/overview.md +0 -5
- /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
- /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
- /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
- /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
- /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
- /package/dist/{lib → src/shared/lib}/constants.js +0 -0
package/dist/services/auth.js
DELETED
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { getAuthAdapter } from "../lib/authAdapter";
|
|
2
|
-
import { HttpError } from "../lib/HttpError";
|
|
3
|
-
import { signToken, verifyToken } from "../lib/jwt";
|
|
4
|
-
import { createSession, deleteSession, getActiveSessionCount, evictOldestSession, deleteUserSessions, setRefreshToken, getSessionByRefreshToken, rotateRefreshToken } from "../lib/session";
|
|
5
|
-
import { getDefaultRole, getPrimaryField, getEmailVerificationConfig, getMaxSessions, getRefreshTokenConfig, getAccessTokenExpiry, getMfaConfig, getMfaEmailOtpConfig, getMfaWebAuthnConfig, getMfaWebAuthnPasskeyMfaBypass } from "../lib/appConfig";
|
|
6
|
-
import { getSuspended } from "../lib/suspension";
|
|
7
|
-
import { createVerificationToken } from "../lib/emailVerification";
|
|
8
|
-
import { createMfaChallenge } from "../lib/mfaChallenge";
|
|
9
|
-
import { generateEmailOtpCode, generateWebAuthnAuthenticationOptions } from "./mfa";
|
|
10
|
-
import { emitSecurityEvent } from "../lib/securityEvents";
|
|
11
|
-
async function createSessionWithRefreshToken(userId, sessionId, metadata) {
|
|
12
|
-
const rtConfig = getRefreshTokenConfig();
|
|
13
|
-
const expirySeconds = rtConfig ? getAccessTokenExpiry() : undefined;
|
|
14
|
-
const token = await signToken({ sub: userId, sid: sessionId }, expirySeconds);
|
|
15
|
-
while (await getActiveSessionCount(userId) >= getMaxSessions()) {
|
|
16
|
-
await evictOldestSession(userId);
|
|
17
|
-
}
|
|
18
|
-
await createSession(userId, token, sessionId, metadata);
|
|
19
|
-
let refreshToken;
|
|
20
|
-
if (rtConfig) {
|
|
21
|
-
refreshToken = crypto.randomUUID();
|
|
22
|
-
await setRefreshToken(sessionId, refreshToken);
|
|
23
|
-
}
|
|
24
|
-
return { token, refreshToken, sessionId };
|
|
25
|
-
}
|
|
26
|
-
/** Create a session for a user (used internally and by MFA verify). */
|
|
27
|
-
export const createSessionForUser = async (userId, metadata) => {
|
|
28
|
-
const sessionId = crypto.randomUUID();
|
|
29
|
-
return createSessionWithRefreshToken(userId, sessionId, metadata);
|
|
30
|
-
};
|
|
31
|
-
export const register = async (identifier, password, metadata) => {
|
|
32
|
-
try {
|
|
33
|
-
const hashed = await Bun.password.hash(password);
|
|
34
|
-
const adapter = getAuthAdapter();
|
|
35
|
-
const user = await adapter.create(identifier, hashed);
|
|
36
|
-
const role = getDefaultRole();
|
|
37
|
-
if (role)
|
|
38
|
-
await adapter.setRoles(user.id, [role]);
|
|
39
|
-
const sessionId = crypto.randomUUID();
|
|
40
|
-
const { token, refreshToken } = await createSessionWithRefreshToken(user.id, sessionId, metadata);
|
|
41
|
-
const evConfig = getEmailVerificationConfig();
|
|
42
|
-
if (evConfig && getPrimaryField() === "email") {
|
|
43
|
-
try {
|
|
44
|
-
const verificationToken = await createVerificationToken(user.id, identifier);
|
|
45
|
-
await evConfig.onSend(identifier, verificationToken);
|
|
46
|
-
}
|
|
47
|
-
catch (e) {
|
|
48
|
-
console.error("[email-verification] Failed to send verification email:", e);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
emitSecurityEvent({ eventType: "auth.register.success", severity: "info", timestamp: new Date().toISOString(), userId: user.id });
|
|
52
|
-
return { token, userId: user.id, email: identifier, refreshToken };
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
emitSecurityEvent({ eventType: "auth.register.failure", severity: "warn", timestamp: new Date().toISOString() });
|
|
56
|
-
throw err;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
// Pre-computed dummy hash so non-existent-user login takes the same time as wrong-password login
|
|
60
|
-
const DUMMY_HASH = await Bun.password.hash("dummy-timing-safe-placeholder");
|
|
61
|
-
export const login = async (identifier, password, metadata) => {
|
|
62
|
-
const adapter = getAuthAdapter();
|
|
63
|
-
const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
|
|
64
|
-
const user = await findFn(identifier);
|
|
65
|
-
// Always verify against a hash to prevent timing-based user enumeration
|
|
66
|
-
const hashToVerify = user?.passwordHash ?? DUMMY_HASH;
|
|
67
|
-
const passwordValid = await Bun.password.verify(password, hashToVerify);
|
|
68
|
-
if (!user || !passwordValid) {
|
|
69
|
-
emitSecurityEvent({ eventType: "auth.login.failure", severity: "warn", timestamp: new Date().toISOString(), meta: { identifier } });
|
|
70
|
-
throw new HttpError(401, "Invalid credentials");
|
|
71
|
-
}
|
|
72
|
-
// Check suspension
|
|
73
|
-
const suspensionStatus = await getSuspended(user.id);
|
|
74
|
-
if (suspensionStatus.suspended) {
|
|
75
|
-
emitSecurityEvent({ eventType: "auth.login.blocked", severity: "critical", timestamp: new Date().toISOString(), meta: { reason: "suspended" } });
|
|
76
|
-
throw new HttpError(403, "Account suspended", "ACCOUNT_SUSPENDED");
|
|
77
|
-
}
|
|
78
|
-
// Check email verification before MFA to avoid leaking MFA status to unverified users
|
|
79
|
-
const fullUser = adapter.getUser ? await adapter.getUser(user.id) : null;
|
|
80
|
-
const googleLinked = fullUser?.providerIds?.some((id) => id.startsWith("google:")) ?? false;
|
|
81
|
-
const evConfig = getEmailVerificationConfig();
|
|
82
|
-
if (evConfig && getPrimaryField() === "email" && adapter.getEmailVerified) {
|
|
83
|
-
const verified = await adapter.getEmailVerified(user.id);
|
|
84
|
-
if (evConfig.required && !verified) {
|
|
85
|
-
throw new HttpError(403, "Email not verified");
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
// Check MFA — if enabled, return challenge token instead of session
|
|
89
|
-
if (getMfaConfig() && adapter.isMfaEnabled && await adapter.isMfaEnabled(user.id)) {
|
|
90
|
-
const methods = adapter.getMfaMethods
|
|
91
|
-
? await adapter.getMfaMethods(user.id)
|
|
92
|
-
: ["totp"];
|
|
93
|
-
// Auto-send email OTP if enabled
|
|
94
|
-
let emailOtpHash;
|
|
95
|
-
const emailOtpConfig = getMfaEmailOtpConfig();
|
|
96
|
-
if (methods.includes("emailOtp") && emailOtpConfig) {
|
|
97
|
-
const { code, hash } = generateEmailOtpCode();
|
|
98
|
-
emailOtpHash = hash;
|
|
99
|
-
const email = fullUser?.email;
|
|
100
|
-
if (email)
|
|
101
|
-
await emailOtpConfig.onSend(email, code);
|
|
102
|
-
}
|
|
103
|
-
// Generate WebAuthn authentication options if enabled
|
|
104
|
-
let webauthnChallenge;
|
|
105
|
-
let webauthnOptions;
|
|
106
|
-
const webauthnConfig = getMfaWebAuthnConfig();
|
|
107
|
-
if (methods.includes("webauthn") && webauthnConfig && adapter.getWebAuthnCredentials) {
|
|
108
|
-
const result = await generateWebAuthnAuthenticationOptions(user.id);
|
|
109
|
-
if (result) {
|
|
110
|
-
webauthnChallenge = result.challenge;
|
|
111
|
-
webauthnOptions = result.options;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
const mfaToken = await createMfaChallenge(user.id, { emailOtpHash, webauthnChallenge });
|
|
115
|
-
return { token: "", userId: user.id, mfaRequired: true, mfaToken, mfaMethods: methods, webauthnOptions };
|
|
116
|
-
}
|
|
117
|
-
const sessionId = crypto.randomUUID();
|
|
118
|
-
const { token, refreshToken } = await createSessionWithRefreshToken(user.id, sessionId, metadata);
|
|
119
|
-
emitSecurityEvent({ eventType: "auth.login.success", severity: "info", timestamp: new Date().toISOString(), userId: user.id });
|
|
120
|
-
if (evConfig && getPrimaryField() === "email" && adapter.getEmailVerified) {
|
|
121
|
-
const verified = await adapter.getEmailVerified(user.id);
|
|
122
|
-
return { token, userId: user.id, email: fullUser?.email, emailVerified: verified, googleLinked, refreshToken };
|
|
123
|
-
}
|
|
124
|
-
return { token, userId: user.id, email: fullUser?.email, googleLinked, refreshToken };
|
|
125
|
-
};
|
|
126
|
-
export const refresh = async (refreshTokenValue) => {
|
|
127
|
-
const result = await getSessionByRefreshToken(refreshTokenValue);
|
|
128
|
-
if (!result) {
|
|
129
|
-
throw new HttpError(401, "Invalid or expired refresh token");
|
|
130
|
-
}
|
|
131
|
-
const { sessionId, userId, newRefreshToken } = result;
|
|
132
|
-
// If the returned newRefreshToken differs from what was sent, we're in a grace window replay.
|
|
133
|
-
// Return the current tokens without rotating again.
|
|
134
|
-
if (newRefreshToken !== refreshTokenValue) {
|
|
135
|
-
const accessToken = await signToken({ sub: userId, sid: sessionId }, getAccessTokenExpiry());
|
|
136
|
-
return { token: accessToken, refreshToken: newRefreshToken, userId };
|
|
137
|
-
}
|
|
138
|
-
// Normal rotation: generate new refresh + access tokens
|
|
139
|
-
const newRT = crypto.randomUUID();
|
|
140
|
-
const newAccessToken = await signToken({ sub: userId, sid: sessionId }, getAccessTokenExpiry());
|
|
141
|
-
await rotateRefreshToken(sessionId, newRT, newAccessToken);
|
|
142
|
-
return { token: newAccessToken, refreshToken: newRT, userId };
|
|
143
|
-
};
|
|
144
|
-
export const deleteAccount = async (userId, password) => {
|
|
145
|
-
const adapter = getAuthAdapter();
|
|
146
|
-
if (!adapter.deleteUser) {
|
|
147
|
-
throw new HttpError(501, "Auth adapter does not support deleteUser");
|
|
148
|
-
}
|
|
149
|
-
// Verify password for credential accounts
|
|
150
|
-
if (password) {
|
|
151
|
-
const user = adapter.getUser ? await adapter.getUser(userId) : null;
|
|
152
|
-
const email = user?.email;
|
|
153
|
-
if (email) {
|
|
154
|
-
const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
|
|
155
|
-
const found = await findFn(email);
|
|
156
|
-
if (found && !(await Bun.password.verify(password, found.passwordHash))) {
|
|
157
|
-
throw new HttpError(401, "Invalid password");
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
else if (adapter.hasPassword && await adapter.hasPassword(userId)) {
|
|
162
|
-
throw new HttpError(400, "Password is required to delete a credential account");
|
|
163
|
-
}
|
|
164
|
-
// Revoke all sessions
|
|
165
|
-
await deleteUserSessions(userId);
|
|
166
|
-
// Delete the user
|
|
167
|
-
await adapter.deleteUser(userId);
|
|
168
|
-
emitSecurityEvent({ eventType: "auth.account.deleted", severity: "warn", timestamp: new Date().toISOString(), userId });
|
|
169
|
-
};
|
|
170
|
-
export const logout = async (token) => {
|
|
171
|
-
if (token) {
|
|
172
|
-
const payload = await verifyToken(token);
|
|
173
|
-
const sessionId = payload.sid;
|
|
174
|
-
if (sessionId) {
|
|
175
|
-
await deleteSession(sessionId);
|
|
176
|
-
emitSecurityEvent({ eventType: "auth.logout", severity: "info", timestamp: new Date().toISOString(), sessionId });
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
export const passkeyLogin = async (passkeyToken, assertionResponse, metadata) => {
|
|
181
|
-
const adapter = getAuthAdapter();
|
|
182
|
-
if (!adapter.findUserByWebAuthnCredentialId || !adapter.getWebAuthnCredentials) {
|
|
183
|
-
throw new HttpError(501, "Auth adapter does not support passkey login");
|
|
184
|
-
}
|
|
185
|
-
const { consumePasskeyLoginChallenge } = await import("../lib/mfaChallenge");
|
|
186
|
-
const challengeData = await consumePasskeyLoginChallenge(passkeyToken);
|
|
187
|
-
if (!challengeData) {
|
|
188
|
-
throw new HttpError(401, "Invalid or expired passkey token");
|
|
189
|
-
}
|
|
190
|
-
const credentialId = assertionResponse?.id;
|
|
191
|
-
if (!credentialId) {
|
|
192
|
-
throw new HttpError(401, "Invalid assertion response");
|
|
193
|
-
}
|
|
194
|
-
const userId = await adapter.findUserByWebAuthnCredentialId(credentialId);
|
|
195
|
-
if (!userId) {
|
|
196
|
-
throw new HttpError(401, "Invalid credentials");
|
|
197
|
-
}
|
|
198
|
-
const { verifyWebAuthn } = await import("./mfa");
|
|
199
|
-
const verified = await verifyWebAuthn(userId, assertionResponse, challengeData.webauthnChallenge);
|
|
200
|
-
if (!verified) {
|
|
201
|
-
throw new HttpError(401, "WebAuthn verification failed");
|
|
202
|
-
}
|
|
203
|
-
// Check suspension
|
|
204
|
-
const suspensionStatus = await getSuspended(userId);
|
|
205
|
-
if (suspensionStatus.suspended) {
|
|
206
|
-
throw new HttpError(403, "Account suspended", "ACCOUNT_SUSPENDED");
|
|
207
|
-
}
|
|
208
|
-
// passkeyMfaBypass=true (default): passkey with userVerification=required satisfies both factors
|
|
209
|
-
const mfaBypass = getMfaWebAuthnPasskeyMfaBypass();
|
|
210
|
-
if (!mfaBypass && getMfaConfig() && adapter.isMfaEnabled && await adapter.isMfaEnabled(userId)) {
|
|
211
|
-
const methods = adapter.getMfaMethods ? await adapter.getMfaMethods(userId) : ["totp"];
|
|
212
|
-
let emailOtpHash;
|
|
213
|
-
const emailOtpConfig = getMfaEmailOtpConfig();
|
|
214
|
-
if (methods.includes("emailOtp") && emailOtpConfig) {
|
|
215
|
-
const { generateEmailOtpCode } = await import("./mfa");
|
|
216
|
-
const { code, hash } = generateEmailOtpCode();
|
|
217
|
-
emailOtpHash = hash;
|
|
218
|
-
const fullUser = adapter.getUser ? await adapter.getUser(userId) : null;
|
|
219
|
-
if (fullUser?.email)
|
|
220
|
-
await emailOtpConfig.onSend(fullUser.email, code);
|
|
221
|
-
}
|
|
222
|
-
let webauthnChallenge2;
|
|
223
|
-
let webauthnOptions;
|
|
224
|
-
if (methods.includes("webauthn") && getMfaWebAuthnConfig()) {
|
|
225
|
-
const { generateWebAuthnAuthenticationOptions } = await import("./mfa");
|
|
226
|
-
const result = await generateWebAuthnAuthenticationOptions(userId);
|
|
227
|
-
if (result) {
|
|
228
|
-
webauthnChallenge2 = result.challenge;
|
|
229
|
-
webauthnOptions = result.options;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
const mfaToken = await createMfaChallenge(userId, { emailOtpHash, webauthnChallenge: webauthnChallenge2 });
|
|
233
|
-
return { token: "", userId, mfaRequired: true, mfaToken, mfaMethods: methods, webauthnOptions };
|
|
234
|
-
}
|
|
235
|
-
const { token, refreshToken } = await createSessionForUser(userId, metadata);
|
|
236
|
-
const fullUser = adapter.getUser ? await adapter.getUser(userId) : null;
|
|
237
|
-
return { token, userId, email: fullUser?.email, refreshToken };
|
|
238
|
-
};
|
package/dist/ws/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Server, WebSocketHandler } from "bun";
|
|
2
|
-
export type SocketData<T extends object = object> = {
|
|
3
|
-
id: string;
|
|
4
|
-
userId: string | null;
|
|
5
|
-
rooms: Set<string>;
|
|
6
|
-
} & T;
|
|
7
|
-
type BaseSocketData = SocketData<object>;
|
|
8
|
-
export declare const createWsUpgradeHandler: (server: Server<BaseSocketData>) => (req: Request) => Promise<Response | undefined>;
|
|
9
|
-
export declare const websocket: WebSocketHandler<BaseSocketData>;
|
|
10
|
-
export {};
|
package/dist/ws/index.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { verifyToken } from "../lib/jwt";
|
|
2
|
-
import { getSession } from "../lib/session";
|
|
3
|
-
import { COOKIE_TOKEN } from "../lib/constants";
|
|
4
|
-
import { trackSocket, untrackSocket } from "../lib/wsPresence";
|
|
5
|
-
import { timingSafeEqual } from "../lib/crypto";
|
|
6
|
-
export const createWsUpgradeHandler = (server) => async (req) => {
|
|
7
|
-
let userId = null;
|
|
8
|
-
try {
|
|
9
|
-
const token = req.headers.get("cookie")
|
|
10
|
-
?.match(new RegExp(`(?:^|;\\s*)${COOKIE_TOKEN}=([^;]+)`))?.[1] ?? null;
|
|
11
|
-
if (token) {
|
|
12
|
-
const payload = await verifyToken(token);
|
|
13
|
-
const sessionId = payload.sid;
|
|
14
|
-
if (sessionId) {
|
|
15
|
-
const stored = await getSession(sessionId);
|
|
16
|
-
if (timingSafeEqual(stored ?? "", token))
|
|
17
|
-
userId = payload.sub;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
catch { /* unauthenticated — userId stays null */ }
|
|
22
|
-
const upgraded = server.upgrade(req, { data: { id: crypto.randomUUID(), userId, rooms: new Set() } });
|
|
23
|
-
return upgraded ? undefined : Response.json({ error: "Upgrade failed" }, { status: 400 });
|
|
24
|
-
};
|
|
25
|
-
export const websocket = {
|
|
26
|
-
open(ws) {
|
|
27
|
-
trackSocket(ws.data.id, ws.data.userId);
|
|
28
|
-
console.log(`[ws] connected: ${ws.data.id}`);
|
|
29
|
-
ws.send(JSON.stringify({ event: "connected", id: ws.data.id }));
|
|
30
|
-
},
|
|
31
|
-
message(_ws, _message) {
|
|
32
|
-
// No-op: room actions are handled by server.ts via handleRoomActions.
|
|
33
|
-
// Override ws.handler.message in WsConfig for custom message handling.
|
|
34
|
-
},
|
|
35
|
-
close(ws) {
|
|
36
|
-
untrackSocket(ws.data.id);
|
|
37
|
-
console.log(`[ws] disconnected: ${ws.data.id}`);
|
|
38
|
-
},
|
|
39
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
## Adding Middleware
|
|
2
|
-
|
|
3
|
-
### Global (runs on every request)
|
|
4
|
-
|
|
5
|
-
Pass via `middleware` config — injected after `identify`, before route matching:
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
await createServer({
|
|
9
|
-
routesDir: import.meta.dir + "/routes",
|
|
10
|
-
app: { name: "My App", version: "1.0.0" },
|
|
11
|
-
middleware: [myMiddleware],
|
|
12
|
-
});
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Write it using core's exported types:
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
// src/middleware/tenant.ts
|
|
19
|
-
import type { MiddlewareHandler } from "hono";
|
|
20
|
-
import type { AppEnv } from "@lastshotlabs/bunshot";
|
|
21
|
-
|
|
22
|
-
export const tenantMiddleware: MiddlewareHandler<AppEnv> = async (c, next) => {
|
|
23
|
-
// c.get("userId") is available — identify has already run
|
|
24
|
-
await next();
|
|
25
|
-
};
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Per-route
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
import { userAuth, rateLimit } from "@lastshotlabs/bunshot";
|
|
32
|
-
|
|
33
|
-
router.use("/admin", userAuth);
|
|
34
|
-
router.use("/admin", rateLimit({ windowMs: 60_000, max: 10 }));
|
|
35
|
-
```
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
## Adding Models
|
|
2
|
-
|
|
3
|
-
Import `appConnection` and register models on it. This ensures your models use the correct connection whether you're on a single DB or a separate tenant DB.
|
|
4
|
-
|
|
5
|
-
`appConnection` is a lazy proxy — calling `.model()` at the top level works fine even before `connectMongo()` has been called. Mongoose buffers any queries until the connection is established.
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
// src/models/Product.ts
|
|
9
|
-
import { appConnection } from "@lastshotlabs/bunshot";
|
|
10
|
-
import { Schema } from "mongoose";
|
|
11
|
-
import type { HydratedDocument } from "mongoose";
|
|
12
|
-
|
|
13
|
-
interface IProduct {
|
|
14
|
-
name: string;
|
|
15
|
-
price: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export type ProductDocument = HydratedDocument<IProduct>;
|
|
19
|
-
|
|
20
|
-
const ProductSchema = new Schema<IProduct>({
|
|
21
|
-
name: { type: String, required: true },
|
|
22
|
-
price: { type: Number, required: true },
|
|
23
|
-
}, { timestamps: true });
|
|
24
|
-
|
|
25
|
-
export const Product = appConnection.model<IProduct>("Product", ProductSchema);
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
> **Note:** Import types (`HydratedDocument`, `Schema`, etc.) directly from `"mongoose"` — the `appConnection` and `mongoose` exports from bunshot are runtime proxies and cannot be used as TypeScript namespaces.
|
|
29
|
-
|
|
30
|
-
### Zod as Single Source of Truth
|
|
31
|
-
|
|
32
|
-
If you use Zod schemas for your OpenAPI spec (via `createRoute` or `modelSchemas`), you can derive your Mongoose schemas and DTO mappers from those same Zod definitions — so each entity is defined **once**.
|
|
33
|
-
|
|
34
|
-
#### `zodToMongoose` — Zod → Mongoose SchemaDefinition
|
|
35
|
-
|
|
36
|
-
Converts a Zod object schema into a Mongoose field definition. Business fields are auto-converted; DB-specific concerns (ObjectId refs, type overrides, subdocuments) are declared via config. The `id` field is automatically excluded since Mongoose provides `_id`.
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { appConnection, zodToMongoose } from "@lastshotlabs/bunshot";
|
|
40
|
-
import { Schema, type HydratedDocument } from "mongoose";
|
|
41
|
-
import { ProductSchema } from "../schemas/product"; // your Zod schema
|
|
42
|
-
import type { ProductDto } from "../schemas/product";
|
|
43
|
-
|
|
44
|
-
// DB interface derives from Zod DTO type
|
|
45
|
-
interface IProduct extends Omit<ProductDto, "id" | "categoryId"> {
|
|
46
|
-
user: Types.ObjectId;
|
|
47
|
-
category: Types.ObjectId;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const ProductMongoSchema = new Schema<IProduct>(
|
|
51
|
-
zodToMongoose(ProductSchema, {
|
|
52
|
-
dbFields: {
|
|
53
|
-
user: { type: Schema.Types.ObjectId, ref: "UserProfile", required: true },
|
|
54
|
-
},
|
|
55
|
-
refs: {
|
|
56
|
-
categoryId: { dbField: "category", ref: "Category" },
|
|
57
|
-
},
|
|
58
|
-
typeOverrides: {
|
|
59
|
-
createdAt: { type: Date, required: true },
|
|
60
|
-
},
|
|
61
|
-
}) as Record<string, unknown>,
|
|
62
|
-
{ timestamps: true }
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
export type ProductDocument = HydratedDocument<IProduct>;
|
|
66
|
-
export const Product = appConnection.model<IProduct>("Product", ProductMongoSchema);
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
**Config options:**
|
|
70
|
-
|
|
71
|
-
| Option | Description |
|
|
72
|
-
|---|---|
|
|
73
|
-
| `dbFields` | Fields that exist only in the DB, not in the API schema (e.g., `user` ObjectId ref) |
|
|
74
|
-
| `refs` | API fields that map to ObjectId refs: `{ accountId: { dbField: "account", ref: "Account" } }` |
|
|
75
|
-
| `typeOverrides` | Override the auto-converted Mongoose type for a field (e.g., Zod `z.string()` for dates → Mongoose `Date`) |
|
|
76
|
-
| `subdocSchemas` | Subdocument array fields: `{ items: mongooseSubSchema }` |
|
|
77
|
-
|
|
78
|
-
**Auto-conversion mapping:**
|
|
79
|
-
|
|
80
|
-
| Zod type | Mongoose type |
|
|
81
|
-
|---|---|
|
|
82
|
-
| `z.string()` | `String` |
|
|
83
|
-
| `z.number()` | `Number` |
|
|
84
|
-
| `z.boolean()` | `Boolean` |
|
|
85
|
-
| `z.date()` | `Date` |
|
|
86
|
-
| `z.enum([...])` | `String` with `enum` |
|
|
87
|
-
| `.nullable()` / `.optional()` | `required: false` |
|
|
88
|
-
|
|
89
|
-
#### `createDtoMapper` — Zod → toDto mapper
|
|
90
|
-
|
|
91
|
-
Creates a generic `toDto` function from a Zod schema. The schema defines which fields exist in the DTO; the config declares how to transform DB-specific types.
|
|
92
|
-
|
|
93
|
-
```ts
|
|
94
|
-
import { createDtoMapper } from "@lastshotlabs/bunshot";
|
|
95
|
-
import { ProductSchema, type ProductDto } from "../schemas/product";
|
|
96
|
-
|
|
97
|
-
const toDto = createDtoMapper<ProductDto>(ProductSchema, {
|
|
98
|
-
refs: { category: "categoryId" }, // ObjectId ref → string, with rename
|
|
99
|
-
dates: ["createdAt"], // Date → ISO string
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Use it
|
|
103
|
-
const product = await Product.findOne({ _id: id });
|
|
104
|
-
return product ? toDto(product) : null;
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
**Auto-handled transforms:**
|
|
108
|
-
|
|
109
|
-
| Transform | Description |
|
|
110
|
-
|---|---|
|
|
111
|
-
| `_id` → `id` | Always converted via `.toString()` |
|
|
112
|
-
| `refs` | ObjectId fields → string (`.toString()`), with DB→API field renaming |
|
|
113
|
-
| `dates` | `Date` objects → ISO strings (`.toISOString()`) |
|
|
114
|
-
| `subdocs` | Array fields mapped with a sub-mapper (for nested documents) |
|
|
115
|
-
| nullable/optional | `undefined` → `null` coercion (based on Zod schema) |
|
|
116
|
-
| everything else | Passthrough |
|
|
117
|
-
|
|
118
|
-
**Subdocument example:**
|
|
119
|
-
|
|
120
|
-
```ts
|
|
121
|
-
const itemToDto = createDtoMapper<TemplateItemDto>(TemplateItemSchema);
|
|
122
|
-
const toDto = createDtoMapper<TemplateDto>(TemplateSchema, {
|
|
123
|
-
subdocs: { items: itemToDto },
|
|
124
|
-
});
|
|
125
|
-
```
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
## Adding Models
|
|
2
|
-
|
|
3
|
-
Import `appConnection` and register Mongoose models on it. `appConnection` is a lazy proxy — `.model()` works before `connectMongo()` has been called.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
import { appConnection } from "@lastshotlabs/bunshot";
|
|
7
|
-
import { Schema, type HydratedDocument } from "mongoose";
|
|
8
|
-
|
|
9
|
-
const ProductSchema = new Schema({ name: String, price: Number }, { timestamps: true });
|
|
10
|
-
export const Product = appConnection.model("Product", ProductSchema);
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Bunshot also provides `zodToMongoose` (Zod -> Mongoose schema conversion) and `createDtoMapper` (DB document -> API DTO) to use Zod as the single source of truth for your models and OpenAPI spec.
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
## Adding Routes
|
|
2
|
-
|
|
3
|
-
Drop a file in your `routes/` directory that exports a `router` — see the [Quick Start](#quick-start) example above. Routes are auto-discovered via glob — no registration needed. Subdirectories are supported, so you can organise by feature:
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
routes/
|
|
7
|
-
products.ts
|
|
8
|
-
ingredients/
|
|
9
|
-
list.ts
|
|
10
|
-
detail.ts
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### OpenAPI Schema Registration
|
|
14
|
-
|
|
15
|
-
Import `createRoute` from `@lastshotlabs/bunshot` (not from `@hono/zod-openapi`). The wrapper automatically registers every unnamed request body and response schema as a named entry in `components/schemas`. Schemas you already named via `registerSchema` are never overwritten.
|
|
16
|
-
|
|
17
|
-
Every Zod schema that appears in your OpenAPI spec ends up as a named entry in `components/schemas` — either auto-named by the framework or explicitly named by you. There are four registration methods, each suited to a different scenario.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
### Method 1 — Route-level auto-registration (via `createRoute`)
|
|
22
|
-
|
|
23
|
-
The most common case. When you define a route with `createRoute`, every unnamed request body and response schema is automatically registered under a name derived from the HTTP method and path.
|
|
24
|
-
|
|
25
|
-
**Naming convention**
|
|
26
|
-
|
|
27
|
-
| Route | Part | Generated name |
|
|
28
|
-
|-------|------|----------------|
|
|
29
|
-
| `POST /products` | request body | `CreateProductsRequest` |
|
|
30
|
-
| `POST /products` | 201 response | `CreateProductsResponse` |
|
|
31
|
-
| `GET /products/{id}` | 200 response | `GetProductsByIdResponse` |
|
|
32
|
-
| `DELETE /products/{id}` | 404 response | `DeleteProductsByIdNotFoundError` |
|
|
33
|
-
| `PATCH /products/{id}` | request body | `UpdateProductsByIdRequest` |
|
|
34
|
-
|
|
35
|
-
HTTP methods → verbs: `GET → Get`, `POST → Create`, `PUT → Replace`, `PATCH → Update`, `DELETE → Delete`.
|
|
36
|
-
|
|
37
|
-
Status codes → suffixes: `200/201/204 → Response`, `400 → BadRequestError`, `401 → UnauthorizedError`, `403 → ForbiddenError`, `404 → NotFoundError`, `409 → ConflictError`, `422 → ValidationError`, `429 → RateLimitError`, `500 → InternalError`, `501 → NotImplementedError`, `503 → UnavailableError`. Unknown codes fall back to the number.
|
|
38
|
-
|
|
39
|
-
**Limitation:** if the same Zod object is used in two different routes, each route names it after itself — you get two identical inline shapes instead of one shared `$ref`. Use Method 2 or 3 to fix this.
|
|
40
|
-
|
|
41
|
-
---
|
|
42
|
-
|
|
43
|
-
### Method 2 — Directory / glob auto-discovery (via `modelSchemas`)
|
|
44
|
-
|
|
45
|
-
Use this when you have schemas shared across multiple routes. Point `modelSchemas` at one or more directories and Bunshot imports every `.ts` file **before** routes are loaded. Any exported Zod schema is registered automatically — same object referenced in multiple routes → same `$ref` in the spec.
|
|
46
|
-
|
|
47
|
-
**Naming:** export name with the trailing `Schema` suffix stripped (`LedgerItemSchema` → `"LedgerItem"`). Already-registered schemas are never overwritten.
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
// src/schemas/ledgerItem.ts
|
|
51
|
-
import { z } from "zod";
|
|
52
|
-
export const LedgerItemSchema = z.object({ id: z.string(), name: z.string(), amount: z.number() });
|
|
53
|
-
// → auto-registered as "LedgerItem"
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
// src/config/index.ts
|
|
58
|
-
await createServer({
|
|
59
|
-
routesDir: import.meta.dir + "/routes",
|
|
60
|
-
modelSchemas: import.meta.dir + "/schemas", // string shorthand — registration: "auto"
|
|
61
|
-
});
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
// src/routes/ledger.ts AND src/routes/ledgerDetail.ts
|
|
66
|
-
import { LedgerItemSchema } from "@schemas/ledgerItem"; // same Zod object instance
|
|
67
|
-
createRoute({ responses: { 200: { content: { "application/json": { schema: LedgerItemSchema } } } } });
|
|
68
|
-
// → $ref: "#/components/schemas/LedgerItem" in both routes
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Multiple directories and glob patterns**
|
|
72
|
-
|
|
73
|
-
```ts
|
|
74
|
-
modelSchemas: [
|
|
75
|
-
import.meta.dir + "/schemas", // dedicated schemas dir
|
|
76
|
-
import.meta.dir + "/models", // co-located with DB models
|
|
77
|
-
import.meta.dir + "/services/**/*.schema.ts", // selective glob
|
|
78
|
-
]
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**Full config object** — use when you need to set `registration` or mix paths and globs:
|
|
82
|
-
|
|
83
|
-
```ts
|
|
84
|
-
modelSchemas: {
|
|
85
|
-
paths: [import.meta.dir + "/schemas", import.meta.dir + "/models"],
|
|
86
|
-
registration: "auto", // default — auto-registers exports with suffix stripping
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**`registration: "explicit"`** — files are imported but nothing is auto-registered. Registration is left entirely to `registerSchema` / `registerSchemas` calls inside each file. Use this when you want zero magic and full name control:
|
|
91
|
-
|
|
92
|
-
```ts
|
|
93
|
-
modelSchemas: { paths: import.meta.dir + "/schemas", registration: "explicit" }
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
### Method 3 — Batch explicit registration (via `registerSchemas`)
|
|
99
|
-
|
|
100
|
-
`registerSchemas` lets you name a group of schemas all at once. Object keys become the `components/schemas` names; the same object is returned so you can destructure and export normally. No suffix stripping — names are taken as-is.
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
// src/schemas/index.ts
|
|
104
|
-
import { registerSchemas } from "@lastshotlabs/bunshot";
|
|
105
|
-
import { z } from "zod";
|
|
106
|
-
|
|
107
|
-
export const { LedgerItem, Product, ErrorResponse } = registerSchemas({
|
|
108
|
-
LedgerItem: z.object({ id: z.string(), name: z.string(), amount: z.number() }),
|
|
109
|
-
Product: z.object({ id: z.string(), price: z.number() }),
|
|
110
|
-
ErrorResponse: z.object({ error: z.string() }),
|
|
111
|
-
});
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Pair with `registration: "explicit"` in `modelSchemas` so the file is imported before routes, or call it inline at the top of any route file — route files are auto-discovered so the top-level call runs before the spec is served.
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
### Method 4 — Single explicit registration (via `registerSchema`)
|
|
119
|
-
|
|
120
|
-
`registerSchema("Name", schema)` registers one schema and returns it unchanged. Useful for a single shared type (e.g. a common error envelope) or to override the name auto-discovery would generate.
|
|
121
|
-
|
|
122
|
-
```ts
|
|
123
|
-
// src/schemas/errors.ts
|
|
124
|
-
import { registerSchema } from "@lastshotlabs/bunshot";
|
|
125
|
-
import { z } from "zod";
|
|
126
|
-
|
|
127
|
-
export const ErrorResponse = registerSchema("ErrorResponse",
|
|
128
|
-
z.object({ error: z.string() })
|
|
129
|
-
);
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Registration is idempotent — calling `registerSchema` on an already-registered schema is a no-op. This means you can safely call it in files that are also covered by `modelSchemas` auto-discovery: whichever runs first wins, and the other is silently skipped.
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
### Priority and interaction
|
|
137
|
-
|
|
138
|
-
All four methods write to the same process-global registry. The rules are simple:
|
|
139
|
-
|
|
140
|
-
1. **First write wins** — once a schema has a name, it cannot be renamed.
|
|
141
|
-
2. **`modelSchemas` files are imported before routes**, so explicit calls inside them always take precedence over what `createRoute` would generate for the same object.
|
|
142
|
-
3. **`registerSchema` / `registerSchemas` take precedence over auto-discovery** when they appear at module top level (they run at import time, before `maybeAutoRegister` inspects the export list).
|
|
143
|
-
4. **`createRoute` never overwrites** a schema already in the registry — it only fills gaps.
|
|
144
|
-
|
|
145
|
-
**Decision guide:**
|
|
146
|
-
|
|
147
|
-
| Situation | Use |
|
|
148
|
-
|-----------|-----|
|
|
149
|
-
| Route-specific, one-off schema | `createRoute` auto-registration (Method 1) |
|
|
150
|
-
| Shared across routes, happy with suffix-stripped export name | `modelSchemas` auto-discovery (Method 2) |
|
|
151
|
-
| Shared across routes, want explicit names or batch control | `registerSchemas` (Method 3) |
|
|
152
|
-
| Single shared schema or custom name override | `registerSchema` (Method 4) |
|
|
153
|
-
|
|
154
|
-
**Protected routes**
|
|
155
|
-
|
|
156
|
-
Use `withSecurity` to declare security schemes on a route without breaking `c.req.valid()` type inference. (Inlining `security` directly in `createRoute({...})` causes TypeScript to collapse the handler's input types to `never`.)
|
|
157
|
-
|
|
158
|
-
```ts
|
|
159
|
-
import { createRoute, withSecurity } from "@lastshotlabs/bunshot";
|
|
160
|
-
|
|
161
|
-
router.openapi(
|
|
162
|
-
withSecurity(
|
|
163
|
-
createRoute({ method: "get", path: "/me", ... }),
|
|
164
|
-
{ cookieAuth: [] },
|
|
165
|
-
{ userToken: [] }
|
|
166
|
-
),
|
|
167
|
-
async (c) => {
|
|
168
|
-
const userId = c.get("authUserId"); // fully typed
|
|
169
|
-
}
|
|
170
|
-
);
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Pass each security scheme as a separate object argument. The security scheme names (`cookieAuth`, `userToken`, `bearerAuth`) are registered globally by `createApp`.
|
|
174
|
-
|
|
175
|
-
**Load order:** By default, routes load in filesystem order. If a route needs to be registered before another (e.g. for Hono's first-match-wins routing), export a `priority` number — lower values load first. Routes without a `priority` load last.
|
|
176
|
-
|
|
177
|
-
```ts
|
|
178
|
-
// routes/tenants.ts — must match before generic routes
|
|
179
|
-
export const priority = 1;
|
|
180
|
-
export const router = createRouter();
|
|
181
|
-
// ...
|
|
182
|
-
```
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
## Adding Routes
|
|
2
|
-
|
|
3
|
-
Drop a file in your `routes/` directory that exports a `router` — routes are auto-discovered via glob. Subdirectories are supported.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
import { z } from "zod";
|
|
7
|
-
import { createRoute, createRouter } from "@lastshotlabs/bunshot";
|
|
8
|
-
|
|
9
|
-
export const router = createRouter();
|
|
10
|
-
|
|
11
|
-
router.openapi(
|
|
12
|
-
createRoute({
|
|
13
|
-
method: "get",
|
|
14
|
-
path: "/hello",
|
|
15
|
-
responses: {
|
|
16
|
-
200: { content: { "application/json": { schema: z.object({ message: z.string() }) } }, description: "Hello" },
|
|
17
|
-
},
|
|
18
|
-
}),
|
|
19
|
-
(c) => c.json({ message: "Hello world!" }, 200)
|
|
20
|
-
);
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Import `createRoute` from `@lastshotlabs/bunshot` (not `@hono/zod-openapi`) to get automatic OpenAPI schema registration. Four registration methods are available — route-level auto-registration, directory/glob auto-discovery via `modelSchemas`, batch explicit via `registerSchemas`, and single explicit via `registerSchema`. Use `withSecurity` to add auth requirements without breaking type inference.
|