@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,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;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export function createSsmSecretRepository(opts) {
|
|
2
|
+
const { pathPrefix, region, withDecryption = true } = opts;
|
|
3
|
+
const cacheTtl = opts.cacheTtlMs ?? 300_000;
|
|
4
|
+
// Closure-owned state — no module globals
|
|
5
|
+
const cache = new Map();
|
|
6
|
+
let ssmClient = null;
|
|
7
|
+
async function requireSsm() {
|
|
8
|
+
try {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
10
|
+
return await new Function('specifier', 'return import(specifier)')('@aws-sdk/client-ssm');
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new Error('SSM secret repository requires @aws-sdk/client-ssm to be installed');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function getClient() {
|
|
17
|
+
if (ssmClient)
|
|
18
|
+
return ssmClient;
|
|
19
|
+
const { SSMClient } = await requireSsm();
|
|
20
|
+
ssmClient = new SSMClient({ region: region ?? process.env.AWS_REGION ?? 'us-east-1' });
|
|
21
|
+
return ssmClient;
|
|
22
|
+
}
|
|
23
|
+
function stripPrefix(name) {
|
|
24
|
+
return name.startsWith(pathPrefix) ? name.slice(pathPrefix.length) : name;
|
|
25
|
+
}
|
|
26
|
+
function getCached(key) {
|
|
27
|
+
const entry = cache.get(key);
|
|
28
|
+
if (!entry)
|
|
29
|
+
return null;
|
|
30
|
+
if (entry.expiresAt <= Date.now()) {
|
|
31
|
+
cache.delete(key);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return entry.value;
|
|
35
|
+
}
|
|
36
|
+
function setCache(key, value) {
|
|
37
|
+
cache.set(key, { value, expiresAt: Date.now() + cacheTtl });
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
name: 'ssm',
|
|
41
|
+
async initialize() {
|
|
42
|
+
const client = await getClient();
|
|
43
|
+
const { GetParametersByPathCommand } = await requireSsm();
|
|
44
|
+
let nextToken;
|
|
45
|
+
do {
|
|
46
|
+
const cmd = new GetParametersByPathCommand({
|
|
47
|
+
Path: pathPrefix,
|
|
48
|
+
Recursive: true,
|
|
49
|
+
WithDecryption: withDecryption,
|
|
50
|
+
NextToken: nextToken,
|
|
51
|
+
});
|
|
52
|
+
const resp = await client.send(cmd);
|
|
53
|
+
for (const param of resp.Parameters ?? []) {
|
|
54
|
+
if (param.Name && param.Value) {
|
|
55
|
+
setCache(stripPrefix(param.Name), param.Value);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
nextToken = resp.NextToken;
|
|
59
|
+
} while (nextToken);
|
|
60
|
+
},
|
|
61
|
+
async get(key) {
|
|
62
|
+
const cached = getCached(key);
|
|
63
|
+
if (cached !== null)
|
|
64
|
+
return cached;
|
|
65
|
+
const client = await getClient();
|
|
66
|
+
const { GetParameterCommand } = await requireSsm();
|
|
67
|
+
try {
|
|
68
|
+
const cmd = new GetParameterCommand({
|
|
69
|
+
Name: pathPrefix + key,
|
|
70
|
+
WithDecryption: withDecryption,
|
|
71
|
+
});
|
|
72
|
+
const resp = await client.send(cmd);
|
|
73
|
+
const value = resp.Parameter?.Value ?? null;
|
|
74
|
+
if (value !== null)
|
|
75
|
+
setCache(key, value);
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (err.name === 'ParameterNotFound')
|
|
80
|
+
return null;
|
|
81
|
+
throw err;
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
async getMany(keys) {
|
|
85
|
+
const result = new Map();
|
|
86
|
+
const uncached = [];
|
|
87
|
+
for (const key of keys) {
|
|
88
|
+
const cached = getCached(key);
|
|
89
|
+
if (cached !== null) {
|
|
90
|
+
result.set(key, cached);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
uncached.push(key);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (uncached.length > 0) {
|
|
97
|
+
const client = await getClient();
|
|
98
|
+
const { GetParametersCommand } = await requireSsm();
|
|
99
|
+
// GetParameters supports max 10 names per call
|
|
100
|
+
for (let i = 0; i < uncached.length; i += 10) {
|
|
101
|
+
const batch = uncached.slice(i, i + 10);
|
|
102
|
+
const cmd = new GetParametersCommand({
|
|
103
|
+
Names: batch.map(k => pathPrefix + k),
|
|
104
|
+
WithDecryption: withDecryption,
|
|
105
|
+
});
|
|
106
|
+
const resp = await client.send(cmd);
|
|
107
|
+
for (const param of resp.Parameters ?? []) {
|
|
108
|
+
if (param.Name && param.Value) {
|
|
109
|
+
const key = stripPrefix(param.Name);
|
|
110
|
+
setCache(key, param.Value);
|
|
111
|
+
result.set(key, param.Value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
},
|
|
118
|
+
async refresh() {
|
|
119
|
+
cache.clear();
|
|
120
|
+
await this.initialize?.();
|
|
121
|
+
},
|
|
122
|
+
async destroy() {
|
|
123
|
+
cache.clear();
|
|
124
|
+
ssmClient = null;
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ISecretRepository, ResolvedSecrets, SecretSchema, SecretStoreType } from '../../../packages/bunshot-core/src/index.js';
|
|
2
|
+
import { frameworkSecretSchema } from './frameworkSecretSchema';
|
|
3
|
+
/** Infrastructure options for secret store resolution — equivalent to StoreInfra */
|
|
4
|
+
export interface SecretStoreInfra {
|
|
5
|
+
readonly prefix?: string;
|
|
6
|
+
readonly pathPrefix?: string;
|
|
7
|
+
readonly region?: string;
|
|
8
|
+
readonly directory?: string;
|
|
9
|
+
readonly extension?: string;
|
|
10
|
+
readonly cacheTtlMs?: number;
|
|
11
|
+
readonly withDecryption?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type SecretRepoFactories<T> = Record<SecretStoreType, (infra: SecretStoreInfra) => T | Promise<T>>;
|
|
14
|
+
export declare function resolveSecretRepo<T>(factories: SecretRepoFactories<T>, storeType: SecretStoreType, infra: SecretStoreInfra): T | Promise<T>;
|
|
15
|
+
export interface EnvSecretStoreConfig {
|
|
16
|
+
provider: 'env';
|
|
17
|
+
prefix?: string;
|
|
18
|
+
schema?: SecretSchema;
|
|
19
|
+
}
|
|
20
|
+
export interface SsmSecretStoreConfig {
|
|
21
|
+
provider: 'ssm';
|
|
22
|
+
pathPrefix: string;
|
|
23
|
+
region?: string;
|
|
24
|
+
schema?: SecretSchema;
|
|
25
|
+
}
|
|
26
|
+
export interface FileSecretStoreConfig {
|
|
27
|
+
provider: 'file';
|
|
28
|
+
directory: string;
|
|
29
|
+
schema?: SecretSchema;
|
|
30
|
+
}
|
|
31
|
+
export interface RegisteredSecretRepository {
|
|
32
|
+
provider: ISecretRepository;
|
|
33
|
+
schema?: SecretSchema;
|
|
34
|
+
}
|
|
35
|
+
export type SecretStoreConfig = EnvSecretStoreConfig | SsmSecretStoreConfig | FileSecretStoreConfig;
|
|
36
|
+
export type SecretStoreInput = ISecretRepository | SecretStoreConfig | RegisteredSecretRepository | undefined;
|
|
37
|
+
type MergeSchemas<A extends SecretSchema, B extends SecretSchema | undefined> = B extends SecretSchema ? A & B : A;
|
|
38
|
+
type SecretRepoFactory<K extends SecretStoreType> = (config: Extract<SecretStoreConfig, {
|
|
39
|
+
provider: K;
|
|
40
|
+
}>) => Promise<ISecretRepository> | ISecretRepository;
|
|
41
|
+
export type SecretRepositoryFactories = {
|
|
42
|
+
[K in SecretStoreType]: SecretRepoFactory<K>;
|
|
43
|
+
};
|
|
44
|
+
export declare const secretRepositoryFactories: SecretRepositoryFactories;
|
|
45
|
+
export interface ResolvedSecretBundle<S extends SecretSchema | undefined = undefined> {
|
|
46
|
+
readonly provider: ISecretRepository;
|
|
47
|
+
readonly framework: ResolvedSecrets<typeof frameworkSecretSchema>;
|
|
48
|
+
readonly app: S extends SecretSchema ? ResolvedSecrets<S> : null;
|
|
49
|
+
readonly merged: ResolvedSecrets<MergeSchemas<typeof frameworkSecretSchema, S>>;
|
|
50
|
+
}
|
|
51
|
+
export declare function resolveSecretRepo_fromInput(input: SecretStoreInput): Promise<ISecretRepository>;
|
|
52
|
+
export declare function resolveSecretBundle<S extends SecretSchema | undefined = undefined>(input: SecretStoreInput): Promise<ResolvedSecretBundle<S>>;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { frameworkSecretSchema } from './frameworkSecretSchema';
|
|
2
|
+
import { createEnvSecretRepository } from './providers/envProvider';
|
|
3
|
+
import { resolveSecrets } from './resolveSecrets';
|
|
4
|
+
export function resolveSecretRepo(factories, storeType, infra) {
|
|
5
|
+
const factory = factories[storeType];
|
|
6
|
+
if (!factory)
|
|
7
|
+
throw new Error(`[secrets] Unsupported store type: ${storeType}`);
|
|
8
|
+
return factory(infra);
|
|
9
|
+
}
|
|
10
|
+
export const secretRepositoryFactories = {
|
|
11
|
+
env: config => createEnvSecretRepository({ prefix: config.prefix }),
|
|
12
|
+
ssm: async (config) => {
|
|
13
|
+
const { createSsmSecretRepository } = await import('./providers/ssmProvider');
|
|
14
|
+
return createSsmSecretRepository({
|
|
15
|
+
pathPrefix: config.pathPrefix,
|
|
16
|
+
region: config.region,
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
file: async (config) => {
|
|
20
|
+
const { createFileSecretRepository } = await import('./providers/fileProvider');
|
|
21
|
+
return createFileSecretRepository({ directory: config.directory });
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
function isSecretRepository(value) {
|
|
25
|
+
if (!value || typeof value !== 'object')
|
|
26
|
+
return false;
|
|
27
|
+
return 'name' in value && 'get' in value && 'getMany' in value;
|
|
28
|
+
}
|
|
29
|
+
function isRegisteredSecretRepository(value) {
|
|
30
|
+
if (!value || typeof value !== 'object' || !('provider' in value))
|
|
31
|
+
return false;
|
|
32
|
+
const provider = value.provider;
|
|
33
|
+
return !!provider && isSecretRepository(provider);
|
|
34
|
+
}
|
|
35
|
+
function getAppSecretSchema(input) {
|
|
36
|
+
if (!input || isSecretRepository(input))
|
|
37
|
+
return undefined;
|
|
38
|
+
if (isRegisteredSecretRepository(input))
|
|
39
|
+
return input.schema;
|
|
40
|
+
return input.schema;
|
|
41
|
+
}
|
|
42
|
+
function mergeSecretSchemas(frameworkSchema, appSchema) {
|
|
43
|
+
if (!appSchema) {
|
|
44
|
+
return frameworkSchema;
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
...frameworkSchema,
|
|
48
|
+
...appSchema,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function pickResolvedSecrets(resolved, schema) {
|
|
52
|
+
const picked = {};
|
|
53
|
+
for (const key of Object.keys(schema)) {
|
|
54
|
+
picked[key] = resolved[key];
|
|
55
|
+
}
|
|
56
|
+
return Object.freeze(picked);
|
|
57
|
+
}
|
|
58
|
+
export async function resolveSecretRepo_fromInput(input) {
|
|
59
|
+
if (!input)
|
|
60
|
+
return createEnvSecretRepository();
|
|
61
|
+
if (isSecretRepository(input))
|
|
62
|
+
return input;
|
|
63
|
+
if (isRegisteredSecretRepository(input))
|
|
64
|
+
return input.provider;
|
|
65
|
+
const factory = secretRepositoryFactories[input.provider];
|
|
66
|
+
if (!factory) {
|
|
67
|
+
throw new Error(`[secrets] Unsupported provider type: ${input.provider}`);
|
|
68
|
+
}
|
|
69
|
+
return await factory(input);
|
|
70
|
+
}
|
|
71
|
+
export async function resolveSecretBundle(input) {
|
|
72
|
+
const provider = await resolveSecretRepo_fromInput(input);
|
|
73
|
+
const appSchema = getAppSecretSchema(input);
|
|
74
|
+
const mergedSchema = mergeSecretSchemas(frameworkSecretSchema, appSchema);
|
|
75
|
+
const merged = await resolveSecrets(provider, mergedSchema);
|
|
76
|
+
return {
|
|
77
|
+
provider,
|
|
78
|
+
framework: pickResolvedSecrets(merged, frameworkSecretSchema),
|
|
79
|
+
app: (appSchema
|
|
80
|
+
? pickResolvedSecrets(merged, appSchema)
|
|
81
|
+
: null),
|
|
82
|
+
merged,
|
|
83
|
+
};
|
|
84
|
+
}
|