@lastshotlabs/bunshot 0.0.25 → 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/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
- package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
- 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/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
- package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
- package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
- 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/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
- package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
- 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/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
- package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
- 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 -7
- 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/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
- package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
- 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 +19 -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/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
- package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
- 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/packages/bunshot-core/src/captcha.d.ts +16 -0
- 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/packages/bunshot-core/src/errors.d.ts +13 -0
- package/dist/packages/bunshot-core/src/errors.js +22 -0
- 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 +23 -8
- 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/src/framework/lib/captcha.js +40 -0
- 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 +14 -9
- 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/src/framework/middleware/captcha.d.ts +9 -0
- package/dist/src/framework/middleware/captcha.js +37 -0
- package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
- package/dist/src/framework/middleware/errorHandler.js +16 -0
- 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 -19
- 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 -11
- 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/src/framework/routes/jobs.js +315 -0
- package/dist/src/framework/routes/metrics.d.ts +10 -0
- package/dist/src/framework/routes/metrics.js +57 -0
- package/dist/src/framework/routes/uploads.d.ts +14 -0
- 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/src/lib/authConfig.js +179 -0
- package/dist/{lib → src/lib}/context.d.ts +6 -7
- 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 +40 -10
- package/dist/src/testing.d.ts +34 -0
- package/dist/src/testing.js +93 -0
- package/package.json +62 -25
- package/dist/adapters/memoryAuth.d.ts +0 -46
- package/dist/adapters/memoryAuth.js +0 -634
- 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 -307
- package/dist/adapters/sqliteAuth.d.ts +0 -49
- package/dist/adapters/sqliteAuth.js +0 -707
- package/dist/app.d.ts +0 -456
- package/dist/app.js +0 -548
- 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 -98
- package/dist/index.js +0 -77
- package/dist/lib/HttpError.d.ts +0 -9
- package/dist/lib/HttpError.js +0 -14
- package/dist/lib/appConfig.d.ts +0 -162
- package/dist/lib/appConfig.js +0 -83
- package/dist/lib/auditLog.d.ts +0 -52
- package/dist/lib/auditLog.js +0 -201
- package/dist/lib/authAdapter.d.ts +0 -176
- package/dist/lib/authAdapter.js +0 -7
- package/dist/lib/authRateLimit.d.ts +0 -13
- package/dist/lib/authRateLimit.js +0 -81
- package/dist/lib/clientIp.d.ts +0 -14
- 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 -13
- package/dist/lib/emailVerification.js +0 -86
- package/dist/lib/fingerprint.js +0 -36
- package/dist/lib/idempotency.js +0 -182
- package/dist/lib/jwt.d.ts +0 -2
- package/dist/lib/jwt.js +0 -24
- package/dist/lib/logger.d.ts +0 -1
- package/dist/lib/logger.js +0 -7
- package/dist/lib/metrics.d.ts +0 -14
- package/dist/lib/mfaChallenge.d.ts +0 -42
- package/dist/lib/mfaChallenge.js +0 -293
- 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 -90
- 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 -91
- package/dist/lib/roles.d.ts +0 -7
- package/dist/lib/roles.js +0 -49
- package/dist/lib/session.d.ts +0 -39
- package/dist/lib/session.js +0 -535
- package/dist/lib/tenant.d.ts +0 -15
- package/dist/lib/tenant.js +0 -65
- package/dist/lib/upload.js +0 -87
- package/dist/lib/ws.d.ts +0 -22
- package/dist/lib/ws.js +0 -89
- 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/csrf.js +0 -125
- package/dist/middleware/errorHandler.js +0 -13
- package/dist/middleware/identify.d.ts +0 -3
- package/dist/middleware/identify.js +0 -95
- 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/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 -48
- 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 -11
- package/dist/routes/auth.js +0 -605
- 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/jobs.js +0 -272
- package/dist/routes/metrics.d.ts +0 -7
- package/dist/routes/metrics.js +0 -52
- package/dist/routes/mfa.d.ts +0 -5
- package/dist/routes/mfa.js +0 -620
- package/dist/routes/oauth.d.ts +0 -2
- package/dist/routes/oauth.js +0 -514
- package/dist/routes/uploads.d.ts +0 -2
- package/dist/routes/uploads.js +0 -135
- 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 -27
- package/dist/services/auth.js +0 -159
- package/dist/ws/index.d.ts +0 -10
- package/dist/ws/index.js +0 -38
- 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 -779
- package/docs/sections/auth-flow/overview.md +0 -10
- package/docs/sections/auth-security-examples/full.md +0 -365
- 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 -127
- 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/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 -199
- package/docs/sections/versioning/full.md +0 -85
- package/docs/sections/webhook-auth/full.md +0 -100
- package/docs/sections/websocket/full.md +0 -184
- 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-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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Middleware mounting — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Handles the framework middleware stack: request ID, validation formatter,
|
|
5
|
+
* metrics collection, request logging, secure headers, CORS, bot protection,
|
|
6
|
+
* rate limiting, and tenant resolution.
|
|
7
|
+
*/
|
|
8
|
+
import type { MetricsState } from './lib/metrics';
|
|
9
|
+
import type { LogLevel, RequestLogEntry } from './middleware/requestLogger';
|
|
10
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
11
|
+
import type { MiddlewareHandler } from 'hono';
|
|
12
|
+
import type { AppEnv, ValidationErrorFormatter } from '../../packages/bunshot-core/src/index.js';
|
|
13
|
+
export interface SecurityConfig {
|
|
14
|
+
cors?: string | string[];
|
|
15
|
+
headers?: {
|
|
16
|
+
contentSecurityPolicy?: string;
|
|
17
|
+
permissionsPolicy?: string;
|
|
18
|
+
};
|
|
19
|
+
rateLimit?: {
|
|
20
|
+
windowMs: number;
|
|
21
|
+
max: number;
|
|
22
|
+
};
|
|
23
|
+
botProtection?: {
|
|
24
|
+
blockList?: string[];
|
|
25
|
+
fingerprintRateLimit?: boolean;
|
|
26
|
+
};
|
|
27
|
+
trustProxy?: false | number;
|
|
28
|
+
signing?: unknown;
|
|
29
|
+
captcha?: unknown;
|
|
30
|
+
}
|
|
31
|
+
export interface LoggingConfig {
|
|
32
|
+
enabled?: boolean;
|
|
33
|
+
onLog?: (entry: RequestLogEntry) => void | Promise<void>;
|
|
34
|
+
level?: LogLevel;
|
|
35
|
+
excludePaths?: (string | RegExp)[];
|
|
36
|
+
excludeMethods?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface MetricsConfig {
|
|
39
|
+
enabled?: boolean;
|
|
40
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
41
|
+
excludePaths?: (string | RegExp)[];
|
|
42
|
+
normalizePath?: (path: string) => string;
|
|
43
|
+
queues?: string[];
|
|
44
|
+
unsafePublic?: boolean;
|
|
45
|
+
}
|
|
46
|
+
export interface TenancyConfig {
|
|
47
|
+
resolution: 'header' | 'subdomain' | 'path';
|
|
48
|
+
headerName?: string;
|
|
49
|
+
pathSegment?: number;
|
|
50
|
+
onResolve?: (tenantId: string) => Promise<Record<string, unknown> | null>;
|
|
51
|
+
cacheTtlMs?: number;
|
|
52
|
+
cacheMaxSize?: number;
|
|
53
|
+
exemptPaths?: string[];
|
|
54
|
+
rejectionStatus?: 403 | 404;
|
|
55
|
+
}
|
|
56
|
+
export interface MountMiddlewareConfig {
|
|
57
|
+
security: SecurityConfig;
|
|
58
|
+
logging?: LoggingConfig;
|
|
59
|
+
metrics?: MetricsConfig;
|
|
60
|
+
metricsState?: MetricsState;
|
|
61
|
+
tenancy?: TenancyConfig;
|
|
62
|
+
validation?: {
|
|
63
|
+
formatError?: ValidationErrorFormatter;
|
|
64
|
+
};
|
|
65
|
+
middleware?: MiddlewareHandler<AppEnv>[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Mount all framework middleware on the Hono app in the correct order.
|
|
69
|
+
*
|
|
70
|
+
* Order:
|
|
71
|
+
* 1. Request ID
|
|
72
|
+
* 2. Validation error formatter (context variable)
|
|
73
|
+
* 3. Metrics collection (if enabled)
|
|
74
|
+
* 4. Request logging (if enabled)
|
|
75
|
+
* 5. Secure headers
|
|
76
|
+
* 6. Custom security headers
|
|
77
|
+
* 7. CORS
|
|
78
|
+
* 8. Bot protection (if configured)
|
|
79
|
+
* 9. Rate limiting
|
|
80
|
+
*
|
|
81
|
+
* Plugin middleware and tenant resolution are mounted separately
|
|
82
|
+
* (after this function returns) to maintain correct ordering.
|
|
83
|
+
*/
|
|
84
|
+
export declare function mountFrameworkMiddleware(app: OpenAPIHono<AppEnv>, config: MountMiddlewareConfig): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* Mount tenant resolution middleware. Called after plugin middleware phase
|
|
87
|
+
* so tenant context is available in routes but plugins can set up auth first.
|
|
88
|
+
*/
|
|
89
|
+
export declare function mountTenantMiddleware(app: OpenAPIHono<AppEnv>, tenancy: TenancyConfig, carrier?: {
|
|
90
|
+
cache: import('./middleware/tenant').TenantResolutionCache | null;
|
|
91
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { rateLimit } from './middleware/rateLimit';
|
|
2
|
+
import { requestId } from './middleware/requestId';
|
|
3
|
+
import { requestLogger } from './middleware/requestLogger';
|
|
4
|
+
import { cors } from 'hono/cors';
|
|
5
|
+
import { secureHeaders } from 'hono/secure-headers';
|
|
6
|
+
import { HEADER_CSRF_TOKEN, HEADER_REFRESH_TOKEN, HEADER_REQUEST_ID, HEADER_USER_TOKEN, defaultValidationErrorFormatter, } from '../../packages/bunshot-core/src/index.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Implementation
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Mount all framework middleware on the Hono app in the correct order.
|
|
12
|
+
*
|
|
13
|
+
* Order:
|
|
14
|
+
* 1. Request ID
|
|
15
|
+
* 2. Validation error formatter (context variable)
|
|
16
|
+
* 3. Metrics collection (if enabled)
|
|
17
|
+
* 4. Request logging (if enabled)
|
|
18
|
+
* 5. Secure headers
|
|
19
|
+
* 6. Custom security headers
|
|
20
|
+
* 7. CORS
|
|
21
|
+
* 8. Bot protection (if configured)
|
|
22
|
+
* 9. Rate limiting
|
|
23
|
+
*
|
|
24
|
+
* Plugin middleware and tenant resolution are mounted separately
|
|
25
|
+
* (after this function returns) to maintain correct ordering.
|
|
26
|
+
*/
|
|
27
|
+
export async function mountFrameworkMiddleware(app, config) {
|
|
28
|
+
const { security: securityConfig = {} } = config;
|
|
29
|
+
app.use(requestId);
|
|
30
|
+
// Set the validation error formatter on context so defaultHook and onError both pick it up
|
|
31
|
+
const validationFormatter = config.validation?.formatError ?? defaultValidationErrorFormatter;
|
|
32
|
+
app.use('*', async (c, next) => {
|
|
33
|
+
c.set('validationErrorFormatter', validationFormatter);
|
|
34
|
+
await next();
|
|
35
|
+
});
|
|
36
|
+
// Metrics collection middleware (before requestLogger so it captures all requests)
|
|
37
|
+
if (config.metrics?.enabled) {
|
|
38
|
+
const metricsAuth = config.metrics.auth ?? 'none';
|
|
39
|
+
if (metricsAuth === 'none' && !config.metrics.unsafePublic) {
|
|
40
|
+
if (process.env.NODE_ENV === 'production') {
|
|
41
|
+
throw new Error('[security] metrics.auth is required in production. Set metrics.auth or explicitly set unsafePublic: true with auth: "none".');
|
|
42
|
+
}
|
|
43
|
+
console.warn('[security] /metrics is enabled without auth. Configure metrics.auth for production.');
|
|
44
|
+
}
|
|
45
|
+
const { metricsCollector } = await import('./middleware/metrics');
|
|
46
|
+
app.use(metricsCollector({
|
|
47
|
+
state: config.metricsState ??
|
|
48
|
+
(() => {
|
|
49
|
+
throw new Error('metricsState is required when metrics are enabled');
|
|
50
|
+
})(),
|
|
51
|
+
excludePaths: config.metrics.excludePaths,
|
|
52
|
+
normalizePath: config.metrics.normalizePath,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
// Request logging
|
|
56
|
+
const loggingConfig = config.logging ?? {};
|
|
57
|
+
if (loggingConfig.enabled !== false) {
|
|
58
|
+
app.use(requestLogger({
|
|
59
|
+
onLog: loggingConfig.onLog,
|
|
60
|
+
level: loggingConfig.level,
|
|
61
|
+
excludePaths: loggingConfig.excludePaths,
|
|
62
|
+
excludeMethods: loggingConfig.excludeMethods,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
// Secure headers
|
|
66
|
+
const headerOpts = {};
|
|
67
|
+
if (securityConfig.headers?.contentSecurityPolicy) {
|
|
68
|
+
headerOpts['Content-Security-Policy'] = securityConfig.headers.contentSecurityPolicy;
|
|
69
|
+
}
|
|
70
|
+
if (securityConfig.headers?.permissionsPolicy) {
|
|
71
|
+
headerOpts['Permissions-Policy'] = securityConfig.headers.permissionsPolicy;
|
|
72
|
+
}
|
|
73
|
+
app.use(secureHeaders());
|
|
74
|
+
if (Object.keys(headerOpts).length > 0) {
|
|
75
|
+
app.use(async (c, next) => {
|
|
76
|
+
await next();
|
|
77
|
+
for (const [k, v] of Object.entries(headerOpts)) {
|
|
78
|
+
c.res.headers.set(k, v);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// CORS
|
|
83
|
+
const corsOrigins = securityConfig.cors ?? '*';
|
|
84
|
+
if (corsOrigins === '*' && process.env.NODE_ENV === 'production') {
|
|
85
|
+
console.warn('[security] CORS is set to wildcard (*) in production. Configure security.cors with specific origins to restrict cross-origin access.');
|
|
86
|
+
}
|
|
87
|
+
const corsAllowHeaders = [
|
|
88
|
+
'Content-Type',
|
|
89
|
+
'Authorization',
|
|
90
|
+
HEADER_USER_TOKEN,
|
|
91
|
+
HEADER_REFRESH_TOKEN,
|
|
92
|
+
HEADER_CSRF_TOKEN,
|
|
93
|
+
];
|
|
94
|
+
app.use(cors({
|
|
95
|
+
origin: corsOrigins,
|
|
96
|
+
allowHeaders: corsAllowHeaders,
|
|
97
|
+
exposeHeaders: ['x-cache', HEADER_REQUEST_ID],
|
|
98
|
+
credentials: true,
|
|
99
|
+
}));
|
|
100
|
+
// Bot protection
|
|
101
|
+
const botCfg = securityConfig.botProtection ?? {};
|
|
102
|
+
if ((botCfg.blockList?.length ?? 0) > 0) {
|
|
103
|
+
const { botProtection } = await import('./middleware/botProtection');
|
|
104
|
+
app.use(botProtection({ blockList: botCfg.blockList }));
|
|
105
|
+
}
|
|
106
|
+
// Rate limiting
|
|
107
|
+
const rlConfig = securityConfig.rateLimit ?? { windowMs: 60_000, max: 100 };
|
|
108
|
+
app.use(rateLimit({ ...rlConfig, fingerprintLimit: botCfg.fingerprintRateLimit ?? false }));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Mount tenant resolution middleware. Called after plugin middleware phase
|
|
112
|
+
* so tenant context is available in routes but plugins can set up auth first.
|
|
113
|
+
*/
|
|
114
|
+
export async function mountTenantMiddleware(app, tenancy, carrier) {
|
|
115
|
+
if (!tenancy.onResolve) {
|
|
116
|
+
if (process.env.NODE_ENV === 'production') {
|
|
117
|
+
throw new Error('[security] Tenancy is configured without an onResolve callback. ' +
|
|
118
|
+
'In production, onResolve is required to validate tenant IDs and prevent cross-tenant access. ' +
|
|
119
|
+
'Provide tenancy.onResolve or remove the tenancy config.');
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.warn('[security] Tenancy is configured without an onResolve callback — ' +
|
|
123
|
+
'tenant IDs will be trusted without validation. This is unsafe in production.');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const { createTenantMiddleware } = await import('./middleware/tenant');
|
|
127
|
+
app.use(createTenantMiddleware(tenancy, carrier));
|
|
128
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional endpoint mounting — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Mounts the jobs status endpoint, /metrics endpoint, and upload presigned-URL
|
|
5
|
+
* endpoint when each is enabled in the app config.
|
|
6
|
+
*/
|
|
7
|
+
import type { MetricsState } from './lib/metrics';
|
|
8
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
9
|
+
import type { MiddlewareHandler } from 'hono';
|
|
10
|
+
import type { AppEnv } from '../../packages/bunshot-core/src/index.js';
|
|
11
|
+
export interface JobsConfig {
|
|
12
|
+
/** Enable the job status endpoint. Default: false. */
|
|
13
|
+
statusEndpoint?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Auth protection for job endpoints.
|
|
16
|
+
* - `"userAuth"` — requires authenticated user session (cookie/token).
|
|
17
|
+
* - `"none"` — no auth (not recommended for production).
|
|
18
|
+
* - `MiddlewareHandler[]` — custom middleware stack (e.g., `[userAuth, requireRole("admin")]`).
|
|
19
|
+
*
|
|
20
|
+
* Default: `"none"`. You must explicitly configure auth.
|
|
21
|
+
*/
|
|
22
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
23
|
+
/** Required roles for accessing job endpoints. Only works when auth includes userAuth. */
|
|
24
|
+
roles?: string[];
|
|
25
|
+
/** Whitelist of queue names exposed. Default: [] (nothing exposed). */
|
|
26
|
+
allowedQueues?: string[];
|
|
27
|
+
/** When using userAuth, restrict job visibility to the user who created it. Default: false. */
|
|
28
|
+
scopeToUser?: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Explicitly acknowledge that jobs endpoint is public in production.
|
|
31
|
+
* Set to true only when auth is "none" and you understand the risk.
|
|
32
|
+
* Without this, createApp throws in production when auth is "none".
|
|
33
|
+
*/
|
|
34
|
+
unsafePublic?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface MetricsConfig {
|
|
37
|
+
/** Enable the /metrics endpoint. Default: false (must be explicitly enabled). */
|
|
38
|
+
enabled?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Auth protection for the /metrics endpoint.
|
|
41
|
+
* - `"userAuth"` — requires authenticated user session.
|
|
42
|
+
* - `"none"` — no auth (default — logs a production warning).
|
|
43
|
+
* - `MiddlewareHandler[]` — custom middleware stack.
|
|
44
|
+
*/
|
|
45
|
+
auth?: 'userAuth' | 'none' | MiddlewareHandler<AppEnv>[];
|
|
46
|
+
/** Paths to exclude from metrics collection. Strings use prefix matching. */
|
|
47
|
+
excludePaths?: (string | RegExp)[];
|
|
48
|
+
/** Custom path normalizer to prevent high-cardinality labels. */
|
|
49
|
+
normalizePath?: (path: string) => string;
|
|
50
|
+
/** BullMQ queue names to report depth gauges for. */
|
|
51
|
+
queues?: string[];
|
|
52
|
+
/**
|
|
53
|
+
* Explicitly acknowledge that metrics endpoint is public in production.
|
|
54
|
+
* Set to true only when auth is "none" and you understand the risk.
|
|
55
|
+
* Without this, createApp throws in production when auth is "none".
|
|
56
|
+
*/
|
|
57
|
+
unsafePublic?: boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface PresignedUrlConfig {
|
|
60
|
+
expirySeconds?: number;
|
|
61
|
+
path?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface UploadConfig {
|
|
64
|
+
storage: import('./lib/storageAdapter').StorageAdapter;
|
|
65
|
+
maxFileSize?: number;
|
|
66
|
+
maxFiles?: number;
|
|
67
|
+
allowedMimeTypes?: string[];
|
|
68
|
+
keyPrefix?: string;
|
|
69
|
+
generateKey?: (file: File, ctx: {
|
|
70
|
+
userId?: string;
|
|
71
|
+
tenantId?: string;
|
|
72
|
+
}) => string;
|
|
73
|
+
tenantScopedKeys?: boolean;
|
|
74
|
+
presignedUrls?: boolean | PresignedUrlConfig;
|
|
75
|
+
/**
|
|
76
|
+
* TTL in seconds for upload registry entries across all backends.
|
|
77
|
+
* Default: 2592000 (30 days).
|
|
78
|
+
*/
|
|
79
|
+
registryTtlSeconds?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Authorization callback for upload read/delete operations.
|
|
82
|
+
* Called when registry ownership check fails or key is not in registry.
|
|
83
|
+
*/
|
|
84
|
+
authorization?: {
|
|
85
|
+
authorize?: (input: {
|
|
86
|
+
action: 'read' | 'delete';
|
|
87
|
+
key: string;
|
|
88
|
+
userId?: string;
|
|
89
|
+
tenantId?: string;
|
|
90
|
+
}) => boolean | Promise<boolean>;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Allow operations on keys not in the upload registry.
|
|
94
|
+
* When false (default), operations on unknown keys return 404.
|
|
95
|
+
* When true, requires an authorize callback — denies if absent.
|
|
96
|
+
*/
|
|
97
|
+
allowExternalKeys?: boolean;
|
|
98
|
+
}
|
|
99
|
+
export declare function mountOptionalEndpoints(app: OpenAPIHono<AppEnv>, coreRoutesDir: string, jobs: JobsConfig | undefined, metrics: MetricsConfig | undefined, upload: UploadConfig | undefined, metricsState: MetricsState, resolvedSecrets: {
|
|
100
|
+
redisHost?: string;
|
|
101
|
+
redisUser?: string;
|
|
102
|
+
redisPassword?: string;
|
|
103
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createQueueFactory } from '../lib/queue';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Implementation
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
export async function mountOptionalEndpoints(app, coreRoutesDir, jobs, metrics, upload, metricsState, resolvedSecrets) {
|
|
6
|
+
const needsQueueFactory = !!jobs?.statusEndpoint || !!metrics?.queues?.length;
|
|
7
|
+
const queueFactory = needsQueueFactory
|
|
8
|
+
? (() => {
|
|
9
|
+
if (!resolvedSecrets.redisHost) {
|
|
10
|
+
throw new Error('[queue] Jobs/metrics queue helpers require REDIS_HOST via the Bunshot secret bundle at startup.');
|
|
11
|
+
}
|
|
12
|
+
return createQueueFactory({
|
|
13
|
+
host: resolvedSecrets.redisHost,
|
|
14
|
+
user: resolvedSecrets.redisUser,
|
|
15
|
+
password: resolvedSecrets.redisPassword,
|
|
16
|
+
});
|
|
17
|
+
})()
|
|
18
|
+
: undefined;
|
|
19
|
+
if (jobs?.statusEndpoint) {
|
|
20
|
+
const jobsAuth = jobs.auth ?? 'none';
|
|
21
|
+
if (jobsAuth === 'none' && !jobs.unsafePublic) {
|
|
22
|
+
if (process.env.NODE_ENV === 'production') {
|
|
23
|
+
throw new Error('[security] jobs.auth is required in production. Set jobs.auth or explicitly set unsafePublic: true with auth: "none".');
|
|
24
|
+
}
|
|
25
|
+
console.warn('[security] /jobs is enabled without auth. Configure jobs.auth for production.');
|
|
26
|
+
}
|
|
27
|
+
const { createJobsRouter } = await import(`${coreRoutesDir}/jobs`);
|
|
28
|
+
app.route('/', createJobsRouter(jobs, queueFactory));
|
|
29
|
+
}
|
|
30
|
+
if (metrics?.enabled) {
|
|
31
|
+
const { createMetricsRouter } = await import(`${coreRoutesDir}/metrics`);
|
|
32
|
+
app.route('/', createMetricsRouter({
|
|
33
|
+
auth: metrics.auth,
|
|
34
|
+
queues: metrics.queues,
|
|
35
|
+
unsafePublic: metrics.unsafePublic,
|
|
36
|
+
}, metricsState, queueFactory));
|
|
37
|
+
}
|
|
38
|
+
if (upload?.presignedUrls) {
|
|
39
|
+
const { createUploadsRouter } = await import(`${coreRoutesDir}/uploads`);
|
|
40
|
+
const presignConfig = upload.presignedUrls === true ? {} : upload.presignedUrls;
|
|
41
|
+
app.route('/', createUploadsRouter({
|
|
42
|
+
...presignConfig,
|
|
43
|
+
authorization: upload.authorization,
|
|
44
|
+
allowExternalKeys: upload.allowExternalKeys,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import type { AppEnv } from '../../packages/bunshot-core/src/index.js';
|
|
3
|
+
export interface VersioningConfig {
|
|
4
|
+
/**
|
|
5
|
+
* Version identifiers in ascending order, e.g. `["v1", "v2"]`.
|
|
6
|
+
* Each version needs a matching subdirectory under `routesDir` (e.g. `routes/v1/`).
|
|
7
|
+
*/
|
|
8
|
+
versions: string[];
|
|
9
|
+
/**
|
|
10
|
+
* Subdirectory name for routes shared across all versions. Shared route schemas
|
|
11
|
+
* receive unprefixed names since they are version-agnostic. Default: `"shared"`.
|
|
12
|
+
* Set `false` to disable shared route discovery.
|
|
13
|
+
*/
|
|
14
|
+
sharedDir?: string | false;
|
|
15
|
+
/**
|
|
16
|
+
* Which version `/docs` and `/openapi.json` redirect to.
|
|
17
|
+
* Defaults to the last version in the array (i.e. the latest).
|
|
18
|
+
*/
|
|
19
|
+
defaultVersion?: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function mountRoutes(app: OpenAPIHono<AppEnv>, routesDir: string, versioning: VersioningConfig | string[] | undefined, appName: string, openApiVersion: string): Promise<void>;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route discovery and mounting — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Handles both versioned (routes/v1/, routes/v2/, ...) and non-versioned
|
|
5
|
+
* (routes/**) discovery. Each versioned sub-app gets its own OpenAPI spec,
|
|
6
|
+
* Scalar docs, and schema stripping pass.
|
|
7
|
+
*/
|
|
8
|
+
import { stripUnreferencedSchemas } from './lib/stripUnreferencedSchemas';
|
|
9
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
10
|
+
import { Scalar } from '@scalar/hono-api-reference';
|
|
11
|
+
import { defaultHook } from '../../packages/bunshot-core/src/index.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Helpers
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
function registerSecuritySchemes(registry) {
|
|
16
|
+
registry.registerComponent('securitySchemes', 'cookieAuth', {
|
|
17
|
+
type: 'apiKey',
|
|
18
|
+
in: 'cookie',
|
|
19
|
+
name: 'token',
|
|
20
|
+
description: 'Session cookie set automatically on login/register.',
|
|
21
|
+
});
|
|
22
|
+
registry.registerComponent('securitySchemes', 'userToken', {
|
|
23
|
+
type: 'apiKey',
|
|
24
|
+
in: 'header',
|
|
25
|
+
name: 'x-user-token',
|
|
26
|
+
description: 'JWT session token passed as the x-user-token request header (alternative to the session cookie).',
|
|
27
|
+
});
|
|
28
|
+
registry.registerComponent('securitySchemes', 'bearerAuth', {
|
|
29
|
+
type: 'http',
|
|
30
|
+
scheme: 'bearer',
|
|
31
|
+
description: 'API key passed as Authorization: Bearer <token>. Required on all endpoints unless bearer auth is disabled in CreateAppConfig or the path is in the bypass list.',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Implementation
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
export async function mountRoutes(app, routesDir, versioning, appName, openApiVersion) {
|
|
38
|
+
if (versioning) {
|
|
39
|
+
await mountVersionedRoutes(app, routesDir, versioning, appName, openApiVersion);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
await mountFlatRoutes(app, routesDir, appName, openApiVersion);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function mountVersionedRoutes(app, routesDir, versioning, appName, openApiVersion) {
|
|
46
|
+
const { versions, sharedDir = 'shared', defaultVersion = versions[versions.length - 1], } = Array.isArray(versioning) ? { versions: versioning } : versioning;
|
|
47
|
+
// Import shared routes with no prefix — schemas stay unprefixed (version-agnostic)
|
|
48
|
+
let sharedMods = [];
|
|
49
|
+
if (sharedDir !== false) {
|
|
50
|
+
const sharedRoutesDir = `${routesDir}/${sharedDir}`;
|
|
51
|
+
const sharedFiles = [];
|
|
52
|
+
try {
|
|
53
|
+
const sharedGlob = new Bun.Glob('**/*.ts');
|
|
54
|
+
for await (const file of sharedGlob.scan({ cwd: sharedRoutesDir })) {
|
|
55
|
+
sharedFiles.push(file);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// sharedDir doesn't exist — fine
|
|
60
|
+
}
|
|
61
|
+
sharedMods = await Promise.all(sharedFiles.map(async (file) => ({ file, mod: await import(`${sharedRoutesDir}/${file}`) })));
|
|
62
|
+
}
|
|
63
|
+
// For each version: import routes, mount on isolated OpenAPIHono
|
|
64
|
+
for (const version of versions) {
|
|
65
|
+
const vApp = new OpenAPIHono({ defaultHook });
|
|
66
|
+
const versionRoutesDir = `${routesDir}/${version}`;
|
|
67
|
+
const versionFiles = [];
|
|
68
|
+
try {
|
|
69
|
+
const versionGlob = new Bun.Glob('**/*.ts');
|
|
70
|
+
for await (const file of versionGlob.scan({ cwd: versionRoutesDir })) {
|
|
71
|
+
versionFiles.push(file);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// version dir doesn't exist — fine
|
|
76
|
+
}
|
|
77
|
+
// Import all version route files in parallel
|
|
78
|
+
const versionMods = await Promise.all(versionFiles.map(async (file) => ({ file, mod: await import(`${versionRoutesDir}/${file}`) })));
|
|
79
|
+
// Mount version-specific routes (sorted by priority)
|
|
80
|
+
versionMods
|
|
81
|
+
.sort((a, b) => (a.mod.priority ?? Infinity) - (b.mod.priority ?? Infinity))
|
|
82
|
+
.forEach(({ mod }) => {
|
|
83
|
+
if (mod.router)
|
|
84
|
+
vApp.route('/', mod.router);
|
|
85
|
+
});
|
|
86
|
+
// Mount shared routes on this versioned app
|
|
87
|
+
for (const { mod } of sharedMods) {
|
|
88
|
+
if (mod.router)
|
|
89
|
+
vApp.route('/', mod.router);
|
|
90
|
+
}
|
|
91
|
+
registerSecuritySchemes(vApp.openAPIRegistry);
|
|
92
|
+
// Serve per-version spec stripped of schemas from other versions
|
|
93
|
+
vApp.get('/openapi.json', c => {
|
|
94
|
+
const spec = vApp.getOpenAPIDocument({
|
|
95
|
+
openapi: '3.0.0',
|
|
96
|
+
info: { title: `${appName} ${version.toUpperCase()}`, version: openApiVersion },
|
|
97
|
+
});
|
|
98
|
+
return c.json(stripUnreferencedSchemas(spec));
|
|
99
|
+
});
|
|
100
|
+
// Per-version Scalar docs
|
|
101
|
+
vApp.get('/docs', Scalar({ url: `/${version}/openapi.json` }));
|
|
102
|
+
// Mount versioned app under /v1, /v2, etc.
|
|
103
|
+
app.route(`/${version}`, vApp);
|
|
104
|
+
}
|
|
105
|
+
// Root /docs → version selector page
|
|
106
|
+
app.get('/docs', c => {
|
|
107
|
+
const links = versions
|
|
108
|
+
.map(v => `<li><a href="/${v}/docs" style="font-size:1.1em">${v.toUpperCase()}</a></li>`)
|
|
109
|
+
.join('\n');
|
|
110
|
+
const html = `<!DOCTYPE html>
|
|
111
|
+
<html lang="en">
|
|
112
|
+
<head><meta charset="utf-8"><title>${appName} — API Docs</title>
|
|
113
|
+
<style>body{font-family:sans-serif;padding:2rem}ul{list-style:none;padding:0}li{margin:.5rem 0}</style>
|
|
114
|
+
</head>
|
|
115
|
+
<body>
|
|
116
|
+
<h1>${appName}</h1>
|
|
117
|
+
<h2>API Documentation</h2>
|
|
118
|
+
<ul>${links}</ul>
|
|
119
|
+
</body></html>`;
|
|
120
|
+
return c.html(html);
|
|
121
|
+
});
|
|
122
|
+
// Root /openapi.json → 302 to default version (no merged spec exists)
|
|
123
|
+
app.get('/openapi.json', c => c.redirect(`/${defaultVersion}/openapi.json`, 302));
|
|
124
|
+
}
|
|
125
|
+
async function mountFlatRoutes(app, routesDir, appName, openApiVersion) {
|
|
126
|
+
const serviceGlob = new Bun.Glob('**/*.ts');
|
|
127
|
+
const serviceFiles = [];
|
|
128
|
+
for await (const file of serviceGlob.scan({ cwd: routesDir })) {
|
|
129
|
+
serviceFiles.push(file);
|
|
130
|
+
}
|
|
131
|
+
const serviceMods = await Promise.all(serviceFiles.map(async (file) => ({
|
|
132
|
+
file,
|
|
133
|
+
mod: await import(`${routesDir}/${file}`),
|
|
134
|
+
})));
|
|
135
|
+
serviceMods
|
|
136
|
+
.sort((a, b) => (a.mod.priority ?? Infinity) - (b.mod.priority ?? Infinity))
|
|
137
|
+
.forEach(({ mod }) => {
|
|
138
|
+
if (mod.router)
|
|
139
|
+
app.route('/', mod.router);
|
|
140
|
+
});
|
|
141
|
+
registerSecuritySchemes(app.openAPIRegistry);
|
|
142
|
+
app.doc('/openapi.json', { openapi: '3.0.0', info: { title: appName, version: openApiVersion } });
|
|
143
|
+
app.get('/docs', Scalar({ url: '/openapi.json' }));
|
|
144
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ICronRegistryRepository } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
import type { RepoFactories } from '../../../packages/bunshot-core/src/index.js';
|
|
3
|
+
export declare function createMemoryCronRegistry(): ICronRegistryRepository;
|
|
4
|
+
export declare function createRedisCronRegistry(getRedis: () => {
|
|
5
|
+
get(key: string): Promise<string | null>;
|
|
6
|
+
set(key: string, value: string): Promise<unknown>;
|
|
7
|
+
}, appName: string): ICronRegistryRepository;
|
|
8
|
+
export declare function createSqliteCronRegistry(getDb: () => {
|
|
9
|
+
run(sql: string, params?: unknown[]): void;
|
|
10
|
+
query<T>(sql: string): {
|
|
11
|
+
all(...args: unknown[]): T[];
|
|
12
|
+
};
|
|
13
|
+
}): ICronRegistryRepository;
|
|
14
|
+
export declare function createMongoCronRegistry(getConn: () => {
|
|
15
|
+
models: Record<string, unknown>;
|
|
16
|
+
model(name: string, schema: unknown): unknown;
|
|
17
|
+
}, getMg: () => {
|
|
18
|
+
Schema: new (def: object, opts?: object) => unknown;
|
|
19
|
+
}, appName: string): ICronRegistryRepository;
|
|
20
|
+
type PgPool = {
|
|
21
|
+
query<R extends Record<string, unknown> = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<{
|
|
22
|
+
rows: R[];
|
|
23
|
+
rowCount: number | null;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
export declare function createPostgresCronRegistry(pool: PgPool, appName: string): ICronRegistryRepository;
|
|
27
|
+
export declare const cronRegistryFactories: RepoFactories<ICronRegistryRepository>;
|
|
28
|
+
export {};
|