@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
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { createRoute } from '../lib/createRoute';
|
|
2
|
+
import { generateUploadKeyFromFilename, getStorageAdapter } from '../lib/upload';
|
|
3
|
+
import { deleteUploadRecord, getUploadRecord, registerUpload } from '../lib/uploadRegistry';
|
|
4
|
+
import { createPresignedUrl } from '../../lib/signing';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { createRouter, getBunshotCtx, getRouteAuth } from '../../../packages/bunshot-core/src/index.js';
|
|
7
|
+
const tags = ['Uploads'];
|
|
8
|
+
async function checkUploadAccess(action, key, userId, tenantId, config, app) {
|
|
9
|
+
const record = await getUploadRecord(key, app);
|
|
10
|
+
const authorize = config.authorization?.authorize;
|
|
11
|
+
const allowExternalKeys = config.allowExternalKeys ?? false;
|
|
12
|
+
if (record) {
|
|
13
|
+
// If the registry record has a tenantId, the requester must match — period.
|
|
14
|
+
if (record.tenantId && record.tenantId !== tenantId) {
|
|
15
|
+
return { allowed: false, notFound: false };
|
|
16
|
+
}
|
|
17
|
+
// Owner match → allow
|
|
18
|
+
if (record.ownerUserId && record.ownerUserId === userId) {
|
|
19
|
+
return { allowed: true, notFound: false };
|
|
20
|
+
}
|
|
21
|
+
// No owner or owner mismatch → try callback
|
|
22
|
+
if (authorize) {
|
|
23
|
+
const ok = await authorize({
|
|
24
|
+
action,
|
|
25
|
+
key,
|
|
26
|
+
userId: userId ?? undefined,
|
|
27
|
+
tenantId: tenantId ?? undefined,
|
|
28
|
+
});
|
|
29
|
+
return { allowed: ok, notFound: false };
|
|
30
|
+
}
|
|
31
|
+
return { allowed: false, notFound: false };
|
|
32
|
+
}
|
|
33
|
+
// Record not in registry
|
|
34
|
+
if (allowExternalKeys) {
|
|
35
|
+
if (authorize) {
|
|
36
|
+
const ok = await authorize({
|
|
37
|
+
action,
|
|
38
|
+
key,
|
|
39
|
+
userId: userId ?? undefined,
|
|
40
|
+
tenantId: tenantId ?? undefined,
|
|
41
|
+
});
|
|
42
|
+
return { allowed: ok, notFound: false };
|
|
43
|
+
}
|
|
44
|
+
return { allowed: false, notFound: false };
|
|
45
|
+
}
|
|
46
|
+
return { allowed: false, notFound: true };
|
|
47
|
+
}
|
|
48
|
+
export const createUploadsRouter = (config) => {
|
|
49
|
+
const router = createRouter();
|
|
50
|
+
const basePath = (config.path ?? '/uploads').replace(/\/$/, '');
|
|
51
|
+
router.use(`${basePath}/*`, async (c, next) => getRouteAuth(getBunshotCtx(c)).userAuth(c, next));
|
|
52
|
+
const BLOCKED_MIME_TYPES = new Set([
|
|
53
|
+
'application/x-executable',
|
|
54
|
+
'application/x-sh',
|
|
55
|
+
'application/x-msdownload',
|
|
56
|
+
'text/html',
|
|
57
|
+
'application/x-httpd-php',
|
|
58
|
+
'application/javascript',
|
|
59
|
+
'text/javascript',
|
|
60
|
+
]);
|
|
61
|
+
const presignRoute = createRoute({
|
|
62
|
+
method: 'post',
|
|
63
|
+
path: `${basePath}/presign`,
|
|
64
|
+
tags,
|
|
65
|
+
summary: 'Generate presigned upload URL',
|
|
66
|
+
request: {
|
|
67
|
+
body: {
|
|
68
|
+
content: {
|
|
69
|
+
'application/json': {
|
|
70
|
+
schema: z.object({
|
|
71
|
+
filename: z
|
|
72
|
+
.string()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe('Original filename (used to derive the storage key extension)'),
|
|
75
|
+
mimeType: z.string().optional().describe('MIME type of the file'),
|
|
76
|
+
expirySeconds: z
|
|
77
|
+
.number()
|
|
78
|
+
.int()
|
|
79
|
+
.positive()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('URL expiry in seconds'),
|
|
82
|
+
maxBytes: z
|
|
83
|
+
.number()
|
|
84
|
+
.int()
|
|
85
|
+
.positive()
|
|
86
|
+
.max(100 * 1024 * 1024)
|
|
87
|
+
.optional()
|
|
88
|
+
.describe('Maximum allowed file size in bytes (client-enforced via Content-Length header). Defaults to 10MB. Maximum: 100MB.'),
|
|
89
|
+
}),
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
responses: {
|
|
95
|
+
200: {
|
|
96
|
+
description: 'Presigned URL generated',
|
|
97
|
+
content: {
|
|
98
|
+
'application/json': {
|
|
99
|
+
schema: z.object({ url: z.string(), key: z.string(), maxBytes: z.number().optional() }),
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
400: {
|
|
104
|
+
description: 'File type not allowed',
|
|
105
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
106
|
+
},
|
|
107
|
+
501: {
|
|
108
|
+
description: 'Not implemented by adapter',
|
|
109
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
router.openapi(presignRoute, async (c) => {
|
|
114
|
+
const bunshotCtx = c.get('bunshotCtx');
|
|
115
|
+
const adapter = getStorageAdapter(bunshotCtx);
|
|
116
|
+
if (!adapter?.presignPut) {
|
|
117
|
+
return c.json({ error: 'Presigned URLs not supported by the configured storage adapter' }, 501);
|
|
118
|
+
}
|
|
119
|
+
const { filename, mimeType, expirySeconds, maxBytes } = c.req.valid('json');
|
|
120
|
+
if (mimeType && BLOCKED_MIME_TYPES.has(mimeType)) {
|
|
121
|
+
return c.json({ error: 'File type not allowed.' }, 400);
|
|
122
|
+
}
|
|
123
|
+
const app = bunshotCtx.app;
|
|
124
|
+
const userId = c.get('authUserId') ?? undefined;
|
|
125
|
+
const tenantId = c.get('tenantId') ?? undefined;
|
|
126
|
+
// Server-generates the key — client cannot control the storage path
|
|
127
|
+
const key = generateUploadKeyFromFilename(filename, { userId, tenantId }, undefined, bunshotCtx);
|
|
128
|
+
const expiry = expirySeconds ?? (typeof config.expirySeconds === 'number' ? config.expirySeconds : 3600);
|
|
129
|
+
const url = await adapter.presignPut(key, { expirySeconds: expiry, mimeType });
|
|
130
|
+
// Register the upload for ownership tracking
|
|
131
|
+
await registerUpload({
|
|
132
|
+
key,
|
|
133
|
+
ownerUserId: userId,
|
|
134
|
+
tenantId,
|
|
135
|
+
mimeType,
|
|
136
|
+
bucket: c.get('uploadBucket') ?? undefined,
|
|
137
|
+
createdAt: Date.now(),
|
|
138
|
+
}, app);
|
|
139
|
+
return c.json({ url, key, ...(maxBytes !== undefined ? { maxBytes } : {}) }, 200);
|
|
140
|
+
});
|
|
141
|
+
const presignGetRoute = createRoute({
|
|
142
|
+
method: 'get',
|
|
143
|
+
path: `${basePath}/presign/:key{.+}`,
|
|
144
|
+
tags,
|
|
145
|
+
summary: 'Generate presigned download URL',
|
|
146
|
+
request: {
|
|
147
|
+
params: z.object({ key: z.string() }),
|
|
148
|
+
query: z.object({
|
|
149
|
+
expiry: z.string().optional().describe('URL expiry in seconds (default: 3600)'),
|
|
150
|
+
}),
|
|
151
|
+
},
|
|
152
|
+
responses: {
|
|
153
|
+
200: {
|
|
154
|
+
description: 'Presigned download URL',
|
|
155
|
+
content: {
|
|
156
|
+
'application/json': {
|
|
157
|
+
schema: z.object({
|
|
158
|
+
url: z.string(),
|
|
159
|
+
expiresAt: z.number().describe('Unix timestamp (seconds) when the URL expires'),
|
|
160
|
+
}),
|
|
161
|
+
},
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
403: {
|
|
165
|
+
description: 'Forbidden — not the owner or unauthorized',
|
|
166
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
167
|
+
},
|
|
168
|
+
404: {
|
|
169
|
+
description: 'Key not found in upload registry',
|
|
170
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
171
|
+
},
|
|
172
|
+
501: {
|
|
173
|
+
description: 'Not implemented',
|
|
174
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
router.openapi(presignGetRoute, async (c) => {
|
|
179
|
+
const { key } = c.req.valid('param');
|
|
180
|
+
const { expiry: expiryStr } = c.req.valid('query');
|
|
181
|
+
const userId = c.get('authUserId');
|
|
182
|
+
const tenantId = c.get('tenantId');
|
|
183
|
+
const app = c.get('bunshotCtx').app;
|
|
184
|
+
const { allowed, notFound } = await checkUploadAccess('read', key, userId, tenantId, config, app);
|
|
185
|
+
if (notFound)
|
|
186
|
+
return c.json({ error: 'Not found' }, 404);
|
|
187
|
+
if (!allowed)
|
|
188
|
+
return c.json({ error: 'Forbidden' }, 403);
|
|
189
|
+
const expirySeconds = expiryStr
|
|
190
|
+
? parseInt(expiryStr, 10)
|
|
191
|
+
: typeof config.expirySeconds === 'number'
|
|
192
|
+
? config.expirySeconds
|
|
193
|
+
: 3600;
|
|
194
|
+
const signingCfg = c.get('bunshotCtx').signing;
|
|
195
|
+
if (signingCfg?.presignedUrls) {
|
|
196
|
+
const secret = signingCfg.secret ?? null;
|
|
197
|
+
if (!secret)
|
|
198
|
+
return c.json({ error: 'Signing secret not configured' }, 501);
|
|
199
|
+
const defaultExpiry = typeof signingCfg.presignedUrls === 'object'
|
|
200
|
+
? (signingCfg.presignedUrls.defaultExpiry ?? expirySeconds)
|
|
201
|
+
: expirySeconds;
|
|
202
|
+
const base = new URL(c.req.url);
|
|
203
|
+
base.pathname = `${basePath}/download/${key}`;
|
|
204
|
+
base.search = '';
|
|
205
|
+
const url = createPresignedUrl(base.toString(), key, { method: 'GET', expiry: defaultExpiry }, secret);
|
|
206
|
+
const expiresAt = Math.floor(Date.now() / 1000) + defaultExpiry;
|
|
207
|
+
return c.json({ url, expiresAt }, 200);
|
|
208
|
+
}
|
|
209
|
+
// Fallback: adapter.presignGet (S3 only)
|
|
210
|
+
const adapter = getStorageAdapter(c.get('bunshotCtx'));
|
|
211
|
+
if (!adapter?.presignGet) {
|
|
212
|
+
return c.json({
|
|
213
|
+
error: 'Presigned download URLs not supported. Enable signing.presignedUrls or use an S3 adapter.',
|
|
214
|
+
}, 501);
|
|
215
|
+
}
|
|
216
|
+
const url = await adapter.presignGet(key, { expirySeconds });
|
|
217
|
+
const expiresAt = Math.floor(Date.now() / 1000) + expirySeconds;
|
|
218
|
+
return c.json({ url, expiresAt }, 200);
|
|
219
|
+
});
|
|
220
|
+
const deleteRoute = createRoute({
|
|
221
|
+
method: 'delete',
|
|
222
|
+
path: `${basePath}/:key{.+}`,
|
|
223
|
+
tags,
|
|
224
|
+
summary: 'Delete an uploaded file',
|
|
225
|
+
request: {
|
|
226
|
+
params: z.object({ key: z.string() }),
|
|
227
|
+
},
|
|
228
|
+
responses: {
|
|
229
|
+
204: { description: 'Deleted' },
|
|
230
|
+
403: {
|
|
231
|
+
description: 'Forbidden — not the owner or unauthorized',
|
|
232
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
233
|
+
},
|
|
234
|
+
404: {
|
|
235
|
+
description: 'Key not found in upload registry',
|
|
236
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
237
|
+
},
|
|
238
|
+
500: {
|
|
239
|
+
description: 'No storage adapter configured',
|
|
240
|
+
content: { 'application/json': { schema: z.object({ error: z.string() }) } },
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
});
|
|
244
|
+
router.openapi(deleteRoute, async (c) => {
|
|
245
|
+
const adapter = getStorageAdapter(c.get('bunshotCtx'));
|
|
246
|
+
if (!adapter)
|
|
247
|
+
return c.json({ error: 'No storage adapter configured' }, 500);
|
|
248
|
+
const { key } = c.req.valid('param');
|
|
249
|
+
const userId = c.get('authUserId');
|
|
250
|
+
const tenantId = c.get('tenantId');
|
|
251
|
+
const app = c.get('bunshotCtx').app;
|
|
252
|
+
const { allowed, notFound } = await checkUploadAccess('delete', key, userId, tenantId, config, app);
|
|
253
|
+
if (notFound)
|
|
254
|
+
return c.json({ error: 'Not found' }, 404);
|
|
255
|
+
if (!allowed)
|
|
256
|
+
return c.json({ error: 'Forbidden' }, 403);
|
|
257
|
+
await adapter.delete(key);
|
|
258
|
+
await deleteUploadRecord(key, app);
|
|
259
|
+
return c.body(null, 204);
|
|
260
|
+
});
|
|
261
|
+
return router;
|
|
262
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin lifecycle execution — extracted from createApp().
|
|
3
|
+
*
|
|
4
|
+
* Handles plugin dependency validation, topological sorting,
|
|
5
|
+
* and execution of the three framework lifecycle phases.
|
|
6
|
+
*/
|
|
7
|
+
import type { OpenAPIHono } from '@hono/zod-openapi';
|
|
8
|
+
import type { AppEnv, BunshotEventBus, BunshotPlugin } from '../../packages/bunshot-core/src/index.js';
|
|
9
|
+
import type { FrameworkConfig } from './createInfrastructure';
|
|
10
|
+
/**
|
|
11
|
+
* Validate the plugin dependency graph and return plugins in topological order.
|
|
12
|
+
* Throws on circular dependencies, missing dependencies, lifecycle-less plugins,
|
|
13
|
+
* and cross-phase dependency violations.
|
|
14
|
+
*/
|
|
15
|
+
export declare function validateAndSortPlugins(plugins: BunshotPlugin[]): BunshotPlugin[];
|
|
16
|
+
/**
|
|
17
|
+
* Run the setupMiddleware phase for all sorted plugins.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runPluginMiddleware(sortedPlugins: BunshotPlugin[], app: OpenAPIHono<AppEnv>, frameworkConfig: FrameworkConfig, bus: BunshotEventBus): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Run the setupRoutes phase for all sorted plugins.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runPluginRoutes(sortedPlugins: BunshotPlugin[], app: OpenAPIHono<AppEnv>, frameworkConfig: FrameworkConfig, bus: BunshotEventBus): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Run the setupPost phase for all sorted plugins.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runPluginPost(sortedPlugins: BunshotPlugin[], app: OpenAPIHono<AppEnv>, frameworkConfig: FrameworkConfig, bus: BunshotEventBus): Promise<void>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Topological sort
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
function topologicalSort(plugins) {
|
|
5
|
+
const nameToPlugin = new Map(plugins.map(p => [p.name, p]));
|
|
6
|
+
const completed = new Set();
|
|
7
|
+
const inProgress = new Set();
|
|
8
|
+
const result = [];
|
|
9
|
+
function visit(name, path) {
|
|
10
|
+
if (completed.has(name))
|
|
11
|
+
return;
|
|
12
|
+
if (inProgress.has(name)) {
|
|
13
|
+
const cycleStart = path.indexOf(name);
|
|
14
|
+
const cycle = [...path.slice(cycleStart), name];
|
|
15
|
+
throw new Error(`[bunshot] Circular plugin dependency detected: ${cycle.join(' → ')}`);
|
|
16
|
+
}
|
|
17
|
+
const plugin = nameToPlugin.get(name);
|
|
18
|
+
if (!plugin) {
|
|
19
|
+
throw new Error(`[bunshot] Plugin dependency "${name}" not found (required by "${path[path.length - 1] ?? 'root'}").`);
|
|
20
|
+
}
|
|
21
|
+
inProgress.add(name);
|
|
22
|
+
for (const dep of plugin.dependencies ?? []) {
|
|
23
|
+
visit(dep, [...path, name]);
|
|
24
|
+
}
|
|
25
|
+
inProgress.delete(name);
|
|
26
|
+
completed.add(name);
|
|
27
|
+
result.push(plugin);
|
|
28
|
+
}
|
|
29
|
+
for (const plugin of plugins) {
|
|
30
|
+
visit(plugin.name, []);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Plugin validation
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
function getEarliestPhase(p) {
|
|
38
|
+
if (p.setupMiddleware)
|
|
39
|
+
return 0;
|
|
40
|
+
if (p.setupRoutes)
|
|
41
|
+
return 1;
|
|
42
|
+
if (p.setupPost)
|
|
43
|
+
return 2;
|
|
44
|
+
return 3; // setup-only (standalone)
|
|
45
|
+
}
|
|
46
|
+
const PHASE_NAMES = ['setupMiddleware', 'setupRoutes', 'setupPost', 'setup-only (standalone)'];
|
|
47
|
+
/**
|
|
48
|
+
* Validate the plugin dependency graph and return plugins in topological order.
|
|
49
|
+
* Throws on circular dependencies, missing dependencies, lifecycle-less plugins,
|
|
50
|
+
* and cross-phase dependency violations.
|
|
51
|
+
*/
|
|
52
|
+
export function validateAndSortPlugins(plugins) {
|
|
53
|
+
if (plugins.length === 0)
|
|
54
|
+
return [];
|
|
55
|
+
const pluginNames = new Set(plugins.map(p => p.name));
|
|
56
|
+
const nameToPlugin = new Map(plugins.map(p => [p.name, p]));
|
|
57
|
+
for (const plugin of plugins) {
|
|
58
|
+
// Validate all declared dependencies are present
|
|
59
|
+
for (const dep of plugin.dependencies ?? []) {
|
|
60
|
+
if (!pluginNames.has(dep)) {
|
|
61
|
+
throw new Error(`[bunshot] Plugin "${plugin.name}" declares dependency "${dep}" but it is not in the plugins array.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Each plugin must define at least one lifecycle method
|
|
65
|
+
if (!plugin.setupMiddleware && !plugin.setupRoutes && !plugin.setupPost && !plugin.setup) {
|
|
66
|
+
throw new Error(`[bunshot] Plugin "${plugin.name}" must define at least one of: setupMiddleware, setupRoutes, setupPost, or setup.`);
|
|
67
|
+
}
|
|
68
|
+
// setup()-only plugins are standalone-only — the framework skips them
|
|
69
|
+
if (!plugin.setupMiddleware && !plugin.setupRoutes && !plugin.setupPost && plugin.setup) {
|
|
70
|
+
console.info(`[bunshot] Plugin "${plugin.name}" defines only setup() — standalone-only, skipped by framework. Use setupMiddleware(), setupRoutes(), or setupPost() for framework integration.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Cross-phase dependency validation
|
|
74
|
+
for (const plugin of plugins) {
|
|
75
|
+
const pluginPhase = getEarliestPhase(plugin);
|
|
76
|
+
if (pluginPhase === 3)
|
|
77
|
+
continue; // standalone-only: no framework phase to validate
|
|
78
|
+
for (const depName of plugin.dependencies ?? []) {
|
|
79
|
+
const dep = nameToPlugin.get(depName);
|
|
80
|
+
const depPhase = getEarliestPhase(dep);
|
|
81
|
+
if (depPhase > pluginPhase) {
|
|
82
|
+
throw new Error(`[bunshot] Plugin "${plugin.name}" (earliest phase: ${PHASE_NAMES[pluginPhase]}) ` +
|
|
83
|
+
`depends on "${depName}" (earliest phase: ${PHASE_NAMES[depPhase]}). ` +
|
|
84
|
+
`A dependency's earliest phase must be ≤ the dependent's earliest phase.`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Topological sort — only include plugins that participate in at least one framework phase
|
|
89
|
+
const frameworkPlugins = plugins.filter(p => p.setupMiddleware || p.setupRoutes || p.setupPost);
|
|
90
|
+
return topologicalSort(frameworkPlugins);
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Plugin lifecycle execution
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
/**
|
|
96
|
+
* Run the setupMiddleware phase for all sorted plugins.
|
|
97
|
+
*/
|
|
98
|
+
export async function runPluginMiddleware(sortedPlugins, app, frameworkConfig, bus) {
|
|
99
|
+
for (const plugin of sortedPlugins) {
|
|
100
|
+
if (plugin.setupMiddleware)
|
|
101
|
+
await plugin.setupMiddleware(app, frameworkConfig, bus);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Run the setupRoutes phase for all sorted plugins.
|
|
106
|
+
*/
|
|
107
|
+
export async function runPluginRoutes(sortedPlugins, app, frameworkConfig, bus) {
|
|
108
|
+
for (const plugin of sortedPlugins) {
|
|
109
|
+
if (plugin.setupRoutes)
|
|
110
|
+
await plugin.setupRoutes(app, frameworkConfig, bus);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Run the setupPost phase for all sorted plugins.
|
|
115
|
+
*/
|
|
116
|
+
export async function runPluginPost(sortedPlugins, app, frameworkConfig, bus) {
|
|
117
|
+
for (const plugin of sortedPlugins) {
|
|
118
|
+
if (plugin.setupPost)
|
|
119
|
+
await plugin.setupPost(app, frameworkConfig, bus);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export declare const frameworkSecretSchema: {
|
|
2
|
+
readonly jwtSecret: {
|
|
3
|
+
readonly path: "JWT_SECRET";
|
|
4
|
+
readonly required: false;
|
|
5
|
+
};
|
|
6
|
+
readonly bearerToken: {
|
|
7
|
+
readonly path: "BEARER_TOKEN";
|
|
8
|
+
readonly required: false;
|
|
9
|
+
};
|
|
10
|
+
readonly dataEncryptionKey: {
|
|
11
|
+
readonly path: "BUNSHOT_DATA_ENCRYPTION_KEY";
|
|
12
|
+
readonly required: false;
|
|
13
|
+
};
|
|
14
|
+
readonly redisHost: {
|
|
15
|
+
readonly path: "REDIS_HOST";
|
|
16
|
+
readonly required: false;
|
|
17
|
+
};
|
|
18
|
+
readonly redisUser: {
|
|
19
|
+
readonly path: "REDIS_USER";
|
|
20
|
+
readonly required: false;
|
|
21
|
+
};
|
|
22
|
+
readonly redisPassword: {
|
|
23
|
+
readonly path: "REDIS_PASSWORD";
|
|
24
|
+
readonly required: false;
|
|
25
|
+
};
|
|
26
|
+
readonly mongoUser: {
|
|
27
|
+
readonly path: "MONGO_USER";
|
|
28
|
+
readonly required: false;
|
|
29
|
+
};
|
|
30
|
+
readonly mongoPassword: {
|
|
31
|
+
readonly path: "MONGO_PASSWORD";
|
|
32
|
+
readonly required: false;
|
|
33
|
+
};
|
|
34
|
+
readonly mongoHost: {
|
|
35
|
+
readonly path: "MONGO_HOST";
|
|
36
|
+
readonly required: false;
|
|
37
|
+
};
|
|
38
|
+
readonly mongoDb: {
|
|
39
|
+
readonly path: "MONGO_DB";
|
|
40
|
+
readonly required: false;
|
|
41
|
+
};
|
|
42
|
+
readonly mongoAuthUser: {
|
|
43
|
+
readonly path: "MONGO_AUTH_USER";
|
|
44
|
+
readonly required: false;
|
|
45
|
+
};
|
|
46
|
+
readonly mongoAuthPassword: {
|
|
47
|
+
readonly path: "MONGO_AUTH_PASSWORD";
|
|
48
|
+
readonly required: false;
|
|
49
|
+
};
|
|
50
|
+
readonly mongoAuthHost: {
|
|
51
|
+
readonly path: "MONGO_AUTH_HOST";
|
|
52
|
+
readonly required: false;
|
|
53
|
+
};
|
|
54
|
+
readonly mongoAuthDb: {
|
|
55
|
+
readonly path: "MONGO_AUTH_DB";
|
|
56
|
+
readonly required: false;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export const frameworkSecretSchema = {
|
|
2
|
+
// Signing & encryption
|
|
3
|
+
jwtSecret: { path: 'JWT_SECRET', required: false },
|
|
4
|
+
bearerToken: { path: 'BEARER_TOKEN', required: false },
|
|
5
|
+
dataEncryptionKey: { path: 'BUNSHOT_DATA_ENCRYPTION_KEY', required: false },
|
|
6
|
+
// Redis
|
|
7
|
+
redisHost: { path: 'REDIS_HOST', required: false },
|
|
8
|
+
redisUser: { path: 'REDIS_USER', required: false },
|
|
9
|
+
redisPassword: { path: 'REDIS_PASSWORD', required: false },
|
|
10
|
+
// Mongo (primary / single mode)
|
|
11
|
+
mongoUser: { path: 'MONGO_USER', required: false },
|
|
12
|
+
mongoPassword: { path: 'MONGO_PASSWORD', required: false },
|
|
13
|
+
mongoHost: { path: 'MONGO_HOST', required: false },
|
|
14
|
+
mongoDb: { path: 'MONGO_DB', required: false },
|
|
15
|
+
// Mongo (auth — separate mode)
|
|
16
|
+
mongoAuthUser: { path: 'MONGO_AUTH_USER', required: false },
|
|
17
|
+
mongoAuthPassword: { path: 'MONGO_AUTH_PASSWORD', required: false },
|
|
18
|
+
mongoAuthHost: { path: 'MONGO_AUTH_HOST', required: false },
|
|
19
|
+
mongoAuthDb: { path: 'MONGO_AUTH_DB', required: false },
|
|
20
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { resolveSecrets } from './resolveSecrets';
|
|
2
|
+
export { frameworkSecretSchema } from './frameworkSecretSchema';
|
|
3
|
+
export { resolveSecretBundle, resolveSecretRepo_fromInput, resolveSecretRepo, secretRepositoryFactories, } from './resolveSecretBundle';
|
|
4
|
+
export type { SecretStoreConfig, SecretRepositoryFactories, SecretStoreInput, SecretStoreInfra, SecretRepoFactories, ResolvedSecretBundle, RegisteredSecretRepository, EnvSecretStoreConfig, SsmSecretStoreConfig, FileSecretStoreConfig, } from './resolveSecretBundle';
|
|
5
|
+
export { createEnvSecretRepository } from './providers/envProvider';
|
|
6
|
+
export { createSsmSecretRepository } from './providers/ssmProvider';
|
|
7
|
+
export type { SsmProviderOptions } from './providers/ssmProvider';
|
|
8
|
+
export { createFileSecretRepository } from './providers/fileProvider';
|
|
9
|
+
export type { FileProviderOptions } from './providers/fileProvider';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Barrel export for framework secrets module
|
|
2
|
+
export { resolveSecrets } from './resolveSecrets';
|
|
3
|
+
export { frameworkSecretSchema } from './frameworkSecretSchema';
|
|
4
|
+
export { resolveSecretBundle, resolveSecretRepo_fromInput, resolveSecretRepo, secretRepositoryFactories, } from './resolveSecretBundle';
|
|
5
|
+
export { createEnvSecretRepository } from './providers/envProvider';
|
|
6
|
+
export { createSsmSecretRepository } from './providers/ssmProvider';
|
|
7
|
+
export { createFileSecretRepository } from './providers/fileProvider';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment variable secret repository.
|
|
3
|
+
*
|
|
4
|
+
* Reads secrets from process.env. Covers:
|
|
5
|
+
* - Local .env files (loaded by Bun automatically)
|
|
6
|
+
* - GitHub Actions secrets (injected as env vars in CI)
|
|
7
|
+
* - Any platform that maps secrets to environment variables
|
|
8
|
+
*
|
|
9
|
+
* Factory pattern: closure-owned prefix, no module-level state.
|
|
10
|
+
*/
|
|
11
|
+
import type { ISecretRepository } from '../../../../packages/bunshot-core/src/index.js';
|
|
12
|
+
export declare function createEnvSecretRepository(opts?: {
|
|
13
|
+
/** Optional prefix stripped from env var names (e.g., 'MYAPP_') */
|
|
14
|
+
prefix?: string;
|
|
15
|
+
}): ISecretRepository;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function createEnvSecretRepository(opts) {
|
|
2
|
+
const prefix = opts?.prefix ?? '';
|
|
3
|
+
return {
|
|
4
|
+
name: 'env',
|
|
5
|
+
async get(key) {
|
|
6
|
+
return process.env[prefix + key] ?? null;
|
|
7
|
+
},
|
|
8
|
+
async getMany(keys) {
|
|
9
|
+
const result = new Map();
|
|
10
|
+
for (const key of keys) {
|
|
11
|
+
const val = process.env[prefix + key];
|
|
12
|
+
if (val !== undefined)
|
|
13
|
+
result.set(key, val);
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ISecretRepository } from '../../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
export interface FileProviderOptions {
|
|
3
|
+
/** Directory containing secret files (e.g., '/run/secrets') */
|
|
4
|
+
directory: string;
|
|
5
|
+
/** File extension to strip when deriving key names. Default: none. */
|
|
6
|
+
extension?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createFileSecretRepository(opts: FileProviderOptions): ISecretRepository;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based secret repository.
|
|
3
|
+
*
|
|
4
|
+
* Reads secrets from individual files in a directory. Each file name is the
|
|
5
|
+
* secret key, file content is the secret value (trailing newline trimmed).
|
|
6
|
+
*
|
|
7
|
+
* Use cases:
|
|
8
|
+
* - Docker Swarm secrets mounted at /run/secrets/
|
|
9
|
+
* - Kubernetes mounted secret volumes
|
|
10
|
+
* - Any file-based secret injection
|
|
11
|
+
*
|
|
12
|
+
* Factory pattern: closure-owned cache + directory ref, no module-level state.
|
|
13
|
+
*/
|
|
14
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
15
|
+
import { join } from 'node:path';
|
|
16
|
+
export function createFileSecretRepository(opts) {
|
|
17
|
+
const { directory, extension } = opts;
|
|
18
|
+
// Closure-owned cache — populated on initialize(), keyed by secret name
|
|
19
|
+
const cache = new Map();
|
|
20
|
+
let initialized = false;
|
|
21
|
+
function stripExtension(filename) {
|
|
22
|
+
if (extension && filename.endsWith(extension)) {
|
|
23
|
+
return filename.slice(0, -extension.length);
|
|
24
|
+
}
|
|
25
|
+
return filename;
|
|
26
|
+
}
|
|
27
|
+
async function readSecret(key) {
|
|
28
|
+
const filename = extension ? key + extension : key;
|
|
29
|
+
try {
|
|
30
|
+
const content = await readFile(join(directory, filename), 'utf-8');
|
|
31
|
+
return content.replace(/\n$/, '');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
if (err.code === 'ENOENT')
|
|
35
|
+
return null;
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
name: 'file',
|
|
41
|
+
async initialize() {
|
|
42
|
+
try {
|
|
43
|
+
const files = await readdir(directory);
|
|
44
|
+
for (const file of files) {
|
|
45
|
+
const key = stripExtension(file);
|
|
46
|
+
const content = await readFile(join(directory, file), 'utf-8');
|
|
47
|
+
cache.set(key, content.replace(/\n$/, ''));
|
|
48
|
+
}
|
|
49
|
+
initialized = true;
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (err.code === 'ENOENT') {
|
|
53
|
+
throw new Error(`[secrets/file] Directory not found: ${directory}`);
|
|
54
|
+
}
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
async get(key) {
|
|
59
|
+
if (initialized)
|
|
60
|
+
return cache.get(key) ?? null;
|
|
61
|
+
return readSecret(key);
|
|
62
|
+
},
|
|
63
|
+
async getMany(keys) {
|
|
64
|
+
const result = new Map();
|
|
65
|
+
for (const key of keys) {
|
|
66
|
+
const value = initialized ? (cache.get(key) ?? null) : await readSecret(key);
|
|
67
|
+
if (value !== null)
|
|
68
|
+
result.set(key, value);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
},
|
|
72
|
+
async refresh() {
|
|
73
|
+
cache.clear();
|
|
74
|
+
initialized = false;
|
|
75
|
+
await this.initialize?.();
|
|
76
|
+
},
|
|
77
|
+
async destroy() {
|
|
78
|
+
cache.clear();
|
|
79
|
+
initialized = false;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Systems Manager Parameter Store secret repository.
|
|
3
|
+
*
|
|
4
|
+
* Batch-loads parameters by path prefix on initialize(), caches locally.
|
|
5
|
+
* Lazy SDK import — @aws-sdk/client-ssm is only loaded when this repository is used.
|
|
6
|
+
*
|
|
7
|
+
* Factory pattern: closure-owned cache + client, no module-level state.
|
|
8
|
+
*/
|
|
9
|
+
import type { ISecretRepository } from '../../../../packages/bunshot-core/src/index.js';
|
|
10
|
+
export interface SsmProviderOptions {
|
|
11
|
+
/** SSM path prefix, e.g., '/myapp/prod/' — must end with '/' */
|
|
12
|
+
pathPrefix: string;
|
|
13
|
+
/** AWS region. Defaults to AWS_REGION env var or 'us-east-1'. */
|
|
14
|
+
region?: string;
|
|
15
|
+
/** Cache TTL in milliseconds. Default: 300_000 (5 min). */
|
|
16
|
+
cacheTtlMs?: number;
|
|
17
|
+
/** Whether to decrypt SecureString params. Default: true. */
|
|
18
|
+
withDecryption?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function createSsmSecretRepository(opts: SsmProviderOptions): ISecretRepository;
|