@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,148 @@
|
|
|
1
|
+
import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest } from '../../../bunshot-core/src/index.js';
|
|
2
|
+
import { sha256 as hashToken } from '../../../bunshot-core/src/index.js';
|
|
3
|
+
export function createMemoryDeletionCancelTokenRepository() {
|
|
4
|
+
const tokens = new Map();
|
|
5
|
+
return {
|
|
6
|
+
async store(hash, userId, jobId, ttl) {
|
|
7
|
+
evictExpired(tokens);
|
|
8
|
+
evictOldest(tokens, DEFAULT_MAX_ENTRIES);
|
|
9
|
+
tokens.set(hash, { userId, jobId, expiresAt: Date.now() + ttl * 1000 });
|
|
10
|
+
},
|
|
11
|
+
async consume(hash) {
|
|
12
|
+
const entry = tokens.get(hash);
|
|
13
|
+
if (!entry || entry.expiresAt <= Date.now()) {
|
|
14
|
+
tokens.delete(hash);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
tokens.delete(hash);
|
|
18
|
+
return { userId: entry.userId, jobId: entry.jobId };
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// SQLite repository factory
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
export function createSqliteDeletionCancelTokenRepository(db) {
|
|
26
|
+
let initialized = false;
|
|
27
|
+
function init() {
|
|
28
|
+
if (initialized)
|
|
29
|
+
return;
|
|
30
|
+
db.run(`CREATE TABLE IF NOT EXISTS auth_deletion_cancel_tokens (
|
|
31
|
+
tokenHash TEXT PRIMARY KEY,
|
|
32
|
+
userId TEXT NOT NULL,
|
|
33
|
+
jobId TEXT NOT NULL,
|
|
34
|
+
expiresAt INTEGER NOT NULL
|
|
35
|
+
)`);
|
|
36
|
+
db.run('CREATE INDEX IF NOT EXISTS idx_auth_deletion_cancel_tokens_expiresAt ON auth_deletion_cancel_tokens(expiresAt)');
|
|
37
|
+
initialized = true;
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
async store(hash, userId, jobId, ttl) {
|
|
41
|
+
init();
|
|
42
|
+
const expiresAt = Date.now() + ttl * 1000;
|
|
43
|
+
db.run(`INSERT INTO auth_deletion_cancel_tokens (tokenHash, userId, jobId, expiresAt)
|
|
44
|
+
VALUES (?, ?, ?, ?)
|
|
45
|
+
ON CONFLICT(tokenHash) DO UPDATE SET userId = excluded.userId, jobId = excluded.jobId, expiresAt = excluded.expiresAt`, [hash, userId, jobId, expiresAt]);
|
|
46
|
+
},
|
|
47
|
+
async consume(hash) {
|
|
48
|
+
init();
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const row = db
|
|
51
|
+
.query('SELECT userId, jobId FROM auth_deletion_cancel_tokens WHERE tokenHash = ? AND expiresAt > ?')
|
|
52
|
+
.get(hash, now);
|
|
53
|
+
db.run('DELETE FROM auth_deletion_cancel_tokens WHERE tokenHash = ?', [hash]);
|
|
54
|
+
if (!row)
|
|
55
|
+
return null;
|
|
56
|
+
return { userId: row.userId, jobId: row.jobId };
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Redis repository factory
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
|
|
64
|
+
async function redisGetDel(redis, key) {
|
|
65
|
+
if (typeof redis.getdel === 'function') {
|
|
66
|
+
try {
|
|
67
|
+
return await redis.getdel(key);
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
const msg = err?.message ?? '';
|
|
71
|
+
if (!/unknown command|ERR unknown command/i.test(msg))
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
|
|
76
|
+
return result ?? null;
|
|
77
|
+
}
|
|
78
|
+
export function createRedisDeletionCancelTokenRepository(getRedis, appName) {
|
|
79
|
+
return {
|
|
80
|
+
async store(hash, userId, jobId, ttl) {
|
|
81
|
+
await getRedis().set(`delcancel:${appName}:${hash}`, JSON.stringify({ userId, jobId }), 'EX', ttl);
|
|
82
|
+
},
|
|
83
|
+
async consume(hash) {
|
|
84
|
+
const raw = await redisGetDel(getRedis(), `delcancel:${appName}:${hash}`);
|
|
85
|
+
if (!raw)
|
|
86
|
+
return null;
|
|
87
|
+
return JSON.parse(raw);
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function createMongoDeletionCancelTokenRepository(conn, mg) {
|
|
92
|
+
function getModel() {
|
|
93
|
+
if (conn.models['DeletionCancelToken'])
|
|
94
|
+
return conn.models['DeletionCancelToken'];
|
|
95
|
+
const { Schema } = mg;
|
|
96
|
+
const schema = new Schema({
|
|
97
|
+
token: { type: String, required: true, unique: true },
|
|
98
|
+
userId: { type: String, required: true },
|
|
99
|
+
jobId: { type: String, required: true },
|
|
100
|
+
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
101
|
+
}, { collection: 'deletion_cancel_tokens' });
|
|
102
|
+
return conn.model('DeletionCancelToken', schema);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
async store(hash, userId, jobId, ttl) {
|
|
106
|
+
await getModel().create({
|
|
107
|
+
token: hash,
|
|
108
|
+
userId,
|
|
109
|
+
jobId,
|
|
110
|
+
expiresAt: new Date(Date.now() + ttl * 1000),
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
async consume(hash) {
|
|
114
|
+
const doc = await getModel()
|
|
115
|
+
.findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
|
|
116
|
+
.lean();
|
|
117
|
+
if (!doc)
|
|
118
|
+
return null;
|
|
119
|
+
return { userId: doc.userId, jobId: doc.jobId };
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export const deletionCancelTokenFactories = {
|
|
124
|
+
memory: () => createMemoryDeletionCancelTokenRepository(),
|
|
125
|
+
sqlite: infra => createSqliteDeletionCancelTokenRepository(infra.getSqliteDb()),
|
|
126
|
+
redis: infra => createRedisDeletionCancelTokenRepository(infra.getRedis, infra.appName),
|
|
127
|
+
mongo: infra => {
|
|
128
|
+
const { conn, mg } = infra.getMongo();
|
|
129
|
+
return createMongoDeletionCancelTokenRepository(conn, mg);
|
|
130
|
+
},
|
|
131
|
+
postgres: () => {
|
|
132
|
+
throw new Error('[bunshot-auth] postgres store is not yet supported for deletionCancelToken repository');
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
// ---------------------------------------------------------------------------
|
|
136
|
+
// Public API
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
export const createDeletionCancelToken = async (repo, userId, jobId, gracePeriodSeconds) => {
|
|
139
|
+
const token = crypto.randomUUID();
|
|
140
|
+
const hash = hashToken(token);
|
|
141
|
+
const ttl = gracePeriodSeconds + 300;
|
|
142
|
+
await repo.store(hash, userId, jobId, ttl);
|
|
143
|
+
return token;
|
|
144
|
+
};
|
|
145
|
+
export const consumeDeletionCancelToken = async (repo, token) => {
|
|
146
|
+
const hash = hashToken(token);
|
|
147
|
+
return repo.consume(hash);
|
|
148
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in email templates with variable substitution.
|
|
3
|
+
*
|
|
4
|
+
* Templates use {{variableName}} placeholders. Unknown variables are left as-is.
|
|
5
|
+
* All templates use inline CSS only — no external CDN dependencies.
|
|
6
|
+
*/
|
|
7
|
+
export interface EmailTemplate {
|
|
8
|
+
subject: string;
|
|
9
|
+
html: string;
|
|
10
|
+
text: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TemplateVariables {
|
|
13
|
+
[key: string]: string | number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Render a template by replacing {{variableName}} placeholders with the
|
|
17
|
+
* provided values. Unknown variables are left as-is in the output.
|
|
18
|
+
*
|
|
19
|
+
* HTML body values are escaped to prevent XSS. Subject and text fields
|
|
20
|
+
* are plain text and are not escaped.
|
|
21
|
+
*/
|
|
22
|
+
export declare function renderTemplate(template: EmailTemplate, vars: TemplateVariables): EmailTemplate;
|
|
23
|
+
export declare const templates: Record<string, EmailTemplate>;
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Built-in email templates with variable substitution.
|
|
3
|
+
*
|
|
4
|
+
* Templates use {{variableName}} placeholders. Unknown variables are left as-is.
|
|
5
|
+
* All templates use inline CSS only — no external CDN dependencies.
|
|
6
|
+
*/
|
|
7
|
+
function escapeHtml(str) {
|
|
8
|
+
return str
|
|
9
|
+
.replace(/&/g, '&')
|
|
10
|
+
.replace(/</g, '<')
|
|
11
|
+
.replace(/>/g, '>')
|
|
12
|
+
.replace(/"/g, '"')
|
|
13
|
+
.replace(/'/g, ''');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Render a template by replacing {{variableName}} placeholders with the
|
|
17
|
+
* provided values. Unknown variables are left as-is in the output.
|
|
18
|
+
*
|
|
19
|
+
* HTML body values are escaped to prevent XSS. Subject and text fields
|
|
20
|
+
* are plain text and are not escaped.
|
|
21
|
+
*/
|
|
22
|
+
export function renderTemplate(template, vars) {
|
|
23
|
+
const replace = (str, escape) => str.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
24
|
+
const value = vars[key];
|
|
25
|
+
if (value === undefined)
|
|
26
|
+
return match;
|
|
27
|
+
const strValue = String(value);
|
|
28
|
+
return escape ? escapeHtml(strValue) : strValue;
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
subject: replace(template.subject, false),
|
|
32
|
+
html: replace(template.html, true),
|
|
33
|
+
text: replace(template.text, false),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Shared HTML shell
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
function htmlShell(bodyContent) {
|
|
40
|
+
return `<!DOCTYPE html>
|
|
41
|
+
<html lang="en">
|
|
42
|
+
<head>
|
|
43
|
+
<meta charset="UTF-8" />
|
|
44
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
45
|
+
<title>Email</title>
|
|
46
|
+
</head>
|
|
47
|
+
<body style="margin:0;padding:0;background-color:#f4f4f5;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;">
|
|
48
|
+
<table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f4f5;padding:40px 0;">
|
|
49
|
+
<tr>
|
|
50
|
+
<td align="center">
|
|
51
|
+
<table width="560" cellpadding="0" cellspacing="0" style="max-width:560px;width:100%;background-color:#ffffff;border-radius:8px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,0.08);">
|
|
52
|
+
<tr>
|
|
53
|
+
<td style="padding:40px 48px;">
|
|
54
|
+
${bodyContent}
|
|
55
|
+
</td>
|
|
56
|
+
</tr>
|
|
57
|
+
<tr>
|
|
58
|
+
<td style="padding:24px 48px;background-color:#f9fafb;border-top:1px solid #e5e7eb;">
|
|
59
|
+
<p style="margin:0;font-size:12px;color:#9ca3af;text-align:center;">
|
|
60
|
+
This email was sent by {{appName}}. If you did not request this, you can safely ignore it.
|
|
61
|
+
</p>
|
|
62
|
+
</td>
|
|
63
|
+
</tr>
|
|
64
|
+
</table>
|
|
65
|
+
</td>
|
|
66
|
+
</tr>
|
|
67
|
+
</table>
|
|
68
|
+
</body>
|
|
69
|
+
</html>`;
|
|
70
|
+
}
|
|
71
|
+
function ctaButton(href, label) {
|
|
72
|
+
return `<a href="${href}" style="display:inline-block;padding:12px 24px;background-color:#18181b;color:#ffffff;text-decoration:none;border-radius:6px;font-size:14px;font-weight:600;letter-spacing:0.01em;">${label}</a>`;
|
|
73
|
+
}
|
|
74
|
+
function heading(text) {
|
|
75
|
+
return `<h1 style="margin:0 0 8px 0;font-size:22px;font-weight:700;color:#111827;line-height:1.3;">${text}</h1>`;
|
|
76
|
+
}
|
|
77
|
+
function subtext(text) {
|
|
78
|
+
return `<p style="margin:0 0 24px 0;font-size:14px;color:#6b7280;line-height:1.6;">${text}</p>`;
|
|
79
|
+
}
|
|
80
|
+
function appNameHeading() {
|
|
81
|
+
return `<p style="margin:0 0 24px 0;font-size:13px;font-weight:600;color:#6b7280;text-transform:uppercase;letter-spacing:0.05em;">{{appName}}</p>`;
|
|
82
|
+
}
|
|
83
|
+
function linkFallback(href) {
|
|
84
|
+
return `<p style="margin:24px 0 0 0;font-size:12px;color:#9ca3af;">If the button doesn't work, copy and paste this link:<br /><a href="${href}" style="color:#6b7280;word-break:break-all;">${href}</a></p>`;
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// Built-in templates
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
export const templates = {
|
|
90
|
+
/**
|
|
91
|
+
* Email verification
|
|
92
|
+
* Variables: {{appName}}, {{verificationLink}}, {{expiryMinutes}}
|
|
93
|
+
*/
|
|
94
|
+
emailVerification: {
|
|
95
|
+
subject: 'Verify your email',
|
|
96
|
+
html: htmlShell(`
|
|
97
|
+
${appNameHeading()}
|
|
98
|
+
${heading('Verify your email address')}
|
|
99
|
+
${subtext('Click the button below to verify your email address. This link expires in {{expiryMinutes}} minutes.')}
|
|
100
|
+
${ctaButton('{{verificationLink}}', 'Verify Email')}
|
|
101
|
+
${linkFallback('{{verificationLink}}')}
|
|
102
|
+
`),
|
|
103
|
+
text: `Verify your email address
|
|
104
|
+
|
|
105
|
+
Hi,
|
|
106
|
+
|
|
107
|
+
Please verify your email address for {{appName}} by visiting the link below.
|
|
108
|
+
|
|
109
|
+
{{verificationLink}}
|
|
110
|
+
|
|
111
|
+
This link expires in {{expiryMinutes}} minutes.
|
|
112
|
+
|
|
113
|
+
If you did not create an account, you can safely ignore this email.`,
|
|
114
|
+
},
|
|
115
|
+
/**
|
|
116
|
+
* Password reset
|
|
117
|
+
* Variables: {{appName}}, {{resetLink}}, {{expiryMinutes}}
|
|
118
|
+
*/
|
|
119
|
+
passwordReset: {
|
|
120
|
+
subject: 'Reset your password',
|
|
121
|
+
html: htmlShell(`
|
|
122
|
+
${appNameHeading()}
|
|
123
|
+
${heading('Reset your password')}
|
|
124
|
+
${subtext('We received a request to reset your password. Click the button below to choose a new one. This link expires in {{expiryMinutes}} minutes.')}
|
|
125
|
+
${ctaButton('{{resetLink}}', 'Reset Password')}
|
|
126
|
+
${linkFallback('{{resetLink}}')}
|
|
127
|
+
`),
|
|
128
|
+
text: `Reset your password
|
|
129
|
+
|
|
130
|
+
Hi,
|
|
131
|
+
|
|
132
|
+
We received a request to reset your password for {{appName}}.
|
|
133
|
+
|
|
134
|
+
Visit the link below to choose a new password:
|
|
135
|
+
|
|
136
|
+
{{resetLink}}
|
|
137
|
+
|
|
138
|
+
This link expires in {{expiryMinutes}} minutes.
|
|
139
|
+
|
|
140
|
+
If you did not request a password reset, you can safely ignore this email.`,
|
|
141
|
+
},
|
|
142
|
+
/**
|
|
143
|
+
* Magic link sign-in
|
|
144
|
+
* Variables: {{appName}}, {{magicLink}}, {{expiryMinutes}}
|
|
145
|
+
*/
|
|
146
|
+
magicLink: {
|
|
147
|
+
subject: 'Your sign-in link',
|
|
148
|
+
html: htmlShell(`
|
|
149
|
+
${appNameHeading()}
|
|
150
|
+
${heading('Your sign-in link')}
|
|
151
|
+
${subtext('Click the button below to sign in to {{appName}}. This link expires in {{expiryMinutes}} minutes and can only be used once.')}
|
|
152
|
+
${ctaButton('{{magicLink}}', 'Sign In')}
|
|
153
|
+
${linkFallback('{{magicLink}}')}
|
|
154
|
+
`),
|
|
155
|
+
text: `Your sign-in link for {{appName}}
|
|
156
|
+
|
|
157
|
+
Hi,
|
|
158
|
+
|
|
159
|
+
Use the link below to sign in to {{appName}}. This link expires in {{expiryMinutes}} minutes and can only be used once.
|
|
160
|
+
|
|
161
|
+
{{magicLink}}
|
|
162
|
+
|
|
163
|
+
If you did not request this, you can safely ignore this email.`,
|
|
164
|
+
},
|
|
165
|
+
/**
|
|
166
|
+
* Email OTP (MFA)
|
|
167
|
+
* Variables: {{appName}}, {{code}}, {{expiryMinutes}}
|
|
168
|
+
*/
|
|
169
|
+
emailOtp: {
|
|
170
|
+
subject: 'Your verification code',
|
|
171
|
+
html: htmlShell(`
|
|
172
|
+
${appNameHeading()}
|
|
173
|
+
${heading('Your verification code')}
|
|
174
|
+
${subtext('Enter the code below to complete your sign-in. It expires in {{expiryMinutes}} minutes.')}
|
|
175
|
+
<div style="margin:0 0 24px 0;padding:20px;background-color:#f9fafb;border-radius:6px;text-align:center;border:1px solid #e5e7eb;">
|
|
176
|
+
<span style="font-size:36px;font-weight:700;color:#111827;letter-spacing:0.15em;font-family:'Courier New',Courier,monospace;">{{code}}</span>
|
|
177
|
+
</div>
|
|
178
|
+
<p style="margin:0;font-size:13px;color:#9ca3af;">Do not share this code with anyone. {{appName}} will never ask for your code.</p>
|
|
179
|
+
`),
|
|
180
|
+
text: `Your verification code for {{appName}}
|
|
181
|
+
|
|
182
|
+
Your verification code is:
|
|
183
|
+
|
|
184
|
+
{{code}}
|
|
185
|
+
|
|
186
|
+
This code expires in {{expiryMinutes}} minutes. Do not share it with anyone.
|
|
187
|
+
|
|
188
|
+
If you did not request this, you can safely ignore this email.`,
|
|
189
|
+
},
|
|
190
|
+
/**
|
|
191
|
+
* Welcome email (sent after registration)
|
|
192
|
+
* Variables: {{appName}}, {{identifier}}
|
|
193
|
+
*/
|
|
194
|
+
welcomeEmail: {
|
|
195
|
+
subject: 'Welcome to {{appName}}',
|
|
196
|
+
html: htmlShell(`
|
|
197
|
+
${appNameHeading()}
|
|
198
|
+
${heading('Welcome to {{appName}}')}
|
|
199
|
+
${subtext("Your account has been created for <strong>{{identifier}}</strong>. You're all set to get started.")}
|
|
200
|
+
<p style="margin:0;font-size:14px;color:#6b7280;line-height:1.6;">If you have any questions, don't hesitate to reach out to our support team.</p>
|
|
201
|
+
`),
|
|
202
|
+
text: `Welcome to {{appName}}
|
|
203
|
+
|
|
204
|
+
Hi {{identifier}},
|
|
205
|
+
|
|
206
|
+
Your account has been created. You're all set to get started.
|
|
207
|
+
|
|
208
|
+
If you have any questions, don't hesitate to reach out to our support team.
|
|
209
|
+
|
|
210
|
+
— The {{appName}} Team`,
|
|
211
|
+
},
|
|
212
|
+
/**
|
|
213
|
+
* Account deletion scheduled (with cancel link)
|
|
214
|
+
* Variables: {{appName}}, {{cancelLink}}, {{gracePeriodHours}}
|
|
215
|
+
*/
|
|
216
|
+
accountDeletion: {
|
|
217
|
+
subject: 'Account deletion scheduled',
|
|
218
|
+
html: htmlShell(`
|
|
219
|
+
${appNameHeading()}
|
|
220
|
+
${heading('Your account is scheduled for deletion')}
|
|
221
|
+
${subtext('Your {{appName}} account has been scheduled for deletion. If this was a mistake, click the button below to cancel within {{gracePeriodHours}} hours.')}
|
|
222
|
+
${ctaButton('{{cancelLink}}', 'Cancel Deletion')}
|
|
223
|
+
${linkFallback('{{cancelLink}}')}
|
|
224
|
+
<p style="margin:24px 0 0 0;font-size:13px;color:#ef4444;font-weight:500;">After {{gracePeriodHours}} hours, your account and all associated data will be permanently deleted and cannot be recovered.</p>
|
|
225
|
+
`),
|
|
226
|
+
text: `Your account is scheduled for deletion
|
|
227
|
+
|
|
228
|
+
Hi,
|
|
229
|
+
|
|
230
|
+
Your {{appName}} account has been scheduled for deletion. If this was a mistake, visit the link below to cancel within {{gracePeriodHours}} hours.
|
|
231
|
+
|
|
232
|
+
{{cancelLink}}
|
|
233
|
+
|
|
234
|
+
After {{gracePeriodHours}} hours, your account and all associated data will be permanently deleted and cannot be recovered.
|
|
235
|
+
|
|
236
|
+
If you intended to delete your account, no action is needed.`,
|
|
237
|
+
},
|
|
238
|
+
/**
|
|
239
|
+
* Organization invitation
|
|
240
|
+
* Variables: {{appName}}, {{orgName}}, {{invitationLink}}, {{expiryDays}}
|
|
241
|
+
*/
|
|
242
|
+
orgInvitation: {
|
|
243
|
+
subject: "You've been invited to join {{orgName}}",
|
|
244
|
+
html: htmlShell(`
|
|
245
|
+
${appNameHeading()}
|
|
246
|
+
${heading("You've been invited to join {{orgName}}")}
|
|
247
|
+
${subtext("You've been invited to join <strong>{{orgName}}</strong> on {{appName}}. Click the button below to accept your invitation. This invite expires in {{expiryDays}} days.")}
|
|
248
|
+
${ctaButton('{{invitationLink}}', 'Accept Invitation')}
|
|
249
|
+
${linkFallback('{{invitationLink}}')}
|
|
250
|
+
`),
|
|
251
|
+
text: `You've been invited to join {{orgName}}
|
|
252
|
+
|
|
253
|
+
Hi,
|
|
254
|
+
|
|
255
|
+
You've been invited to join {{orgName}} on {{appName}}.
|
|
256
|
+
|
|
257
|
+
Accept your invitation here:
|
|
258
|
+
|
|
259
|
+
{{invitationLink}}
|
|
260
|
+
|
|
261
|
+
This invite expires in {{expiryDays}} days.
|
|
262
|
+
|
|
263
|
+
If you were not expecting this invitation, you can safely ignore this email.`,
|
|
264
|
+
},
|
|
265
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RepoFactories } from '../../../bunshot-core/src/index.js';
|
|
2
|
+
import type { AuthResolvedConfig } from '../config/authConfig';
|
|
3
|
+
import type { RedisLike } from '../types/redis';
|
|
4
|
+
export interface IVerificationTokenRepository {
|
|
5
|
+
create(hash: string, userId: string, email: string, ttl: number): Promise<void>;
|
|
6
|
+
get(hash: string): Promise<{
|
|
7
|
+
userId: string;
|
|
8
|
+
email: string;
|
|
9
|
+
} | null>;
|
|
10
|
+
delete(hash: string): Promise<void>;
|
|
11
|
+
consume(hash: string): Promise<{
|
|
12
|
+
userId: string;
|
|
13
|
+
email: string;
|
|
14
|
+
} | null>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createMemoryVerificationTokenRepository(): IVerificationTokenRepository;
|
|
17
|
+
export declare function createSqliteVerificationTokenRepository(db: import('bun:sqlite').Database): IVerificationTokenRepository;
|
|
18
|
+
export declare function createRedisVerificationTokenRepository(getRedis: () => RedisLike, appName: string): IVerificationTokenRepository;
|
|
19
|
+
export declare function createMongoVerificationTokenRepository(conn: import('mongoose').Connection, mg: typeof import('mongoose')): IVerificationTokenRepository;
|
|
20
|
+
export declare const verificationTokenFactories: RepoFactories<IVerificationTokenRepository>;
|
|
21
|
+
export declare const createVerificationToken: (repo: IVerificationTokenRepository, userId: string, email: string, config: AuthResolvedConfig) => Promise<string>;
|
|
22
|
+
export declare const getVerificationToken: (repo: IVerificationTokenRepository, token: string) => Promise<{
|
|
23
|
+
userId: string;
|
|
24
|
+
email: string;
|
|
25
|
+
} | null>;
|
|
26
|
+
export declare const deleteVerificationToken: (repo: IVerificationTokenRepository, token: string) => Promise<void>;
|
|
27
|
+
export declare const consumeVerificationToken: (repo: IVerificationTokenRepository, token: string) => Promise<{
|
|
28
|
+
userId: string;
|
|
29
|
+
email: string;
|
|
30
|
+
} | null>;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { DEFAULT_MAX_ENTRIES, evictExpired, evictOldest, sha256 } from '../../../bunshot-core/src/index.js';
|
|
2
|
+
export function createMemoryVerificationTokenRepository() {
|
|
3
|
+
const tokens = new Map();
|
|
4
|
+
return {
|
|
5
|
+
async create(hash, userId, email, ttl) {
|
|
6
|
+
evictExpired(tokens);
|
|
7
|
+
evictOldest(tokens, DEFAULT_MAX_ENTRIES);
|
|
8
|
+
tokens.set(hash, { userId, email, expiresAt: Date.now() + ttl * 1000 });
|
|
9
|
+
},
|
|
10
|
+
async get(hash) {
|
|
11
|
+
const entry = tokens.get(hash);
|
|
12
|
+
if (!entry || entry.expiresAt <= Date.now()) {
|
|
13
|
+
tokens.delete(hash);
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return { userId: entry.userId, email: entry.email };
|
|
17
|
+
},
|
|
18
|
+
async delete(hash) {
|
|
19
|
+
tokens.delete(hash);
|
|
20
|
+
},
|
|
21
|
+
async consume(hash) {
|
|
22
|
+
const entry = tokens.get(hash);
|
|
23
|
+
if (!entry || entry.expiresAt <= Date.now()) {
|
|
24
|
+
tokens.delete(hash);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
tokens.delete(hash);
|
|
28
|
+
return { userId: entry.userId, email: entry.email };
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// SQLite repository factory
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
export function createSqliteVerificationTokenRepository(db) {
|
|
36
|
+
let initialized = false;
|
|
37
|
+
function init() {
|
|
38
|
+
if (initialized)
|
|
39
|
+
return;
|
|
40
|
+
db.run(`CREATE TABLE IF NOT EXISTS auth_verification_tokens (
|
|
41
|
+
tokenHash TEXT PRIMARY KEY,
|
|
42
|
+
userId TEXT NOT NULL,
|
|
43
|
+
email TEXT NOT NULL,
|
|
44
|
+
expiresAt INTEGER NOT NULL
|
|
45
|
+
)`);
|
|
46
|
+
db.run('CREATE INDEX IF NOT EXISTS idx_auth_verification_tokens_expiresAt ON auth_verification_tokens(expiresAt)');
|
|
47
|
+
initialized = true;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
async create(hash, userId, email, ttl) {
|
|
51
|
+
init();
|
|
52
|
+
const expiresAt = Date.now() + ttl * 1000;
|
|
53
|
+
db.run(`INSERT INTO auth_verification_tokens (tokenHash, userId, email, expiresAt)
|
|
54
|
+
VALUES (?, ?, ?, ?)
|
|
55
|
+
ON CONFLICT(tokenHash) DO UPDATE SET userId = excluded.userId, email = excluded.email, expiresAt = excluded.expiresAt`, [hash, userId, email, expiresAt]);
|
|
56
|
+
},
|
|
57
|
+
async get(hash) {
|
|
58
|
+
init();
|
|
59
|
+
const now = Date.now();
|
|
60
|
+
const row = db
|
|
61
|
+
.query('SELECT userId, email FROM auth_verification_tokens WHERE tokenHash = ? AND expiresAt > ?')
|
|
62
|
+
.get(hash, now);
|
|
63
|
+
return row ? { userId: row.userId, email: row.email } : null;
|
|
64
|
+
},
|
|
65
|
+
async delete(hash) {
|
|
66
|
+
init();
|
|
67
|
+
db.run('DELETE FROM auth_verification_tokens WHERE tokenHash = ?', [hash]);
|
|
68
|
+
},
|
|
69
|
+
async consume(hash) {
|
|
70
|
+
init();
|
|
71
|
+
const now = Date.now();
|
|
72
|
+
const row = db
|
|
73
|
+
.query('SELECT userId, email FROM auth_verification_tokens WHERE tokenHash = ? AND expiresAt > ?')
|
|
74
|
+
.get(hash, now);
|
|
75
|
+
db.run('DELETE FROM auth_verification_tokens WHERE tokenHash = ?', [hash]);
|
|
76
|
+
if (!row)
|
|
77
|
+
return null;
|
|
78
|
+
return { userId: row.userId, email: row.email };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Redis repository factory
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/** Atomically GET+DEL a key. Uses native GETDEL (Redis >= 6.2) with a Lua fallback. */
|
|
86
|
+
async function redisGetDel(redis, key) {
|
|
87
|
+
if (typeof redis.getdel === 'function') {
|
|
88
|
+
try {
|
|
89
|
+
return await redis.getdel(key);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
const msg = err?.message ?? '';
|
|
93
|
+
if (!/unknown command|ERR unknown command/i.test(msg))
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const result = await redis.eval("local v = redis.call('GET', KEYS[1])\nif v then redis.call('DEL', KEYS[1]) end\nreturn v", 1, key);
|
|
98
|
+
return result ?? null;
|
|
99
|
+
}
|
|
100
|
+
export function createRedisVerificationTokenRepository(getRedis, appName) {
|
|
101
|
+
return {
|
|
102
|
+
async create(hash, userId, email, ttl) {
|
|
103
|
+
await getRedis().set(`verify:${appName}:${hash}`, JSON.stringify({ userId, email }), 'EX', ttl);
|
|
104
|
+
},
|
|
105
|
+
async get(hash) {
|
|
106
|
+
const raw = await getRedis().get(`verify:${appName}:${hash}`);
|
|
107
|
+
if (!raw)
|
|
108
|
+
return null;
|
|
109
|
+
return JSON.parse(raw);
|
|
110
|
+
},
|
|
111
|
+
async delete(hash) {
|
|
112
|
+
await getRedis().del(`verify:${appName}:${hash}`);
|
|
113
|
+
},
|
|
114
|
+
async consume(hash) {
|
|
115
|
+
const raw = await redisGetDel(getRedis(), `verify:${appName}:${hash}`);
|
|
116
|
+
if (!raw)
|
|
117
|
+
return null;
|
|
118
|
+
return JSON.parse(raw);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function createMongoVerificationTokenRepository(conn, mg) {
|
|
123
|
+
function getModel() {
|
|
124
|
+
if (conn.models['EmailVerification'])
|
|
125
|
+
return conn.models['EmailVerification'];
|
|
126
|
+
const { Schema } = mg;
|
|
127
|
+
const schema = new Schema({
|
|
128
|
+
token: { type: String, required: true, unique: true },
|
|
129
|
+
userId: { type: String, required: true },
|
|
130
|
+
email: { type: String, required: true },
|
|
131
|
+
expiresAt: { type: Date, required: true, index: { expireAfterSeconds: 0 } },
|
|
132
|
+
}, { collection: 'email_verifications' });
|
|
133
|
+
return conn.model('EmailVerification', schema);
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
async create(hash, userId, email, ttl) {
|
|
137
|
+
await getModel().create({
|
|
138
|
+
token: hash,
|
|
139
|
+
userId,
|
|
140
|
+
email,
|
|
141
|
+
expiresAt: new Date(Date.now() + ttl * 1000),
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
async get(hash) {
|
|
145
|
+
const doc = await getModel()
|
|
146
|
+
.findOne({ token: hash, expiresAt: { $gt: new Date() } })
|
|
147
|
+
.lean();
|
|
148
|
+
if (!doc)
|
|
149
|
+
return null;
|
|
150
|
+
return { userId: doc.userId, email: doc.email };
|
|
151
|
+
},
|
|
152
|
+
async delete(hash) {
|
|
153
|
+
await getModel().deleteOne({ token: hash });
|
|
154
|
+
},
|
|
155
|
+
async consume(hash) {
|
|
156
|
+
const doc = await getModel()
|
|
157
|
+
.findOneAndDelete({ token: hash, expiresAt: { $gt: new Date() } })
|
|
158
|
+
.lean();
|
|
159
|
+
if (!doc)
|
|
160
|
+
return null;
|
|
161
|
+
return { userId: doc.userId, email: doc.email };
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export const verificationTokenFactories = {
|
|
166
|
+
memory: () => createMemoryVerificationTokenRepository(),
|
|
167
|
+
sqlite: infra => createSqliteVerificationTokenRepository(infra.getSqliteDb()),
|
|
168
|
+
redis: infra => createRedisVerificationTokenRepository(infra.getRedis, infra.appName),
|
|
169
|
+
mongo: infra => {
|
|
170
|
+
const { conn, mg } = infra.getMongo();
|
|
171
|
+
return createMongoVerificationTokenRepository(conn, mg);
|
|
172
|
+
},
|
|
173
|
+
postgres: () => {
|
|
174
|
+
throw new Error('[bunshot-auth] postgres store is not yet supported for verificationToken repository');
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
// ---------------------------------------------------------------------------
|
|
178
|
+
// Public API
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
export const createVerificationToken = async (repo, userId, email, config) => {
|
|
181
|
+
const bytes = new Uint8Array(32);
|
|
182
|
+
crypto.getRandomValues(bytes);
|
|
183
|
+
const token = Buffer.from(bytes).toString('base64url');
|
|
184
|
+
const hash = sha256(token);
|
|
185
|
+
const ttl = config.emailVerification?.tokenExpiry ?? 86400;
|
|
186
|
+
await repo.create(hash, userId, email, ttl);
|
|
187
|
+
return token;
|
|
188
|
+
};
|
|
189
|
+
export const getVerificationToken = async (repo, token) => {
|
|
190
|
+
const hash = sha256(token);
|
|
191
|
+
return repo.get(hash);
|
|
192
|
+
};
|
|
193
|
+
export const deleteVerificationToken = async (repo, token) => {
|
|
194
|
+
const hash = sha256(token);
|
|
195
|
+
await repo.delete(hash);
|
|
196
|
+
};
|
|
197
|
+
export const consumeVerificationToken = async (repo, token) => {
|
|
198
|
+
const hash = sha256(token);
|
|
199
|
+
return repo.consume(hash);
|
|
200
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isProd(): boolean;
|