@lastshotlabs/bunshot 0.0.27 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (742) hide show
  1. package/.oclif.manifest.json +39 -0
  2. package/README.md +8282 -2147
  3. package/dist/cli/commands/init.js +690 -0
  4. package/dist/cli/index.js +6 -0
  5. package/dist/cli.js +4 -4
  6. package/dist/packages/bunshot-admin/src/index.d.ts +15 -0
  7. package/dist/packages/bunshot-admin/src/index.js +11 -0
  8. package/dist/packages/bunshot-admin/src/lib/resourceTypes.d.ts +8 -0
  9. package/dist/packages/bunshot-admin/src/lib/resourceTypes.js +33 -0
  10. package/dist/packages/bunshot-admin/src/lib/typedRoute.d.ts +14 -0
  11. package/dist/packages/bunshot-admin/src/lib/typedRoute.js +17 -0
  12. package/dist/packages/bunshot-admin/src/plugin.d.ts +4 -0
  13. package/dist/packages/bunshot-admin/src/plugin.js +46 -0
  14. package/dist/packages/bunshot-admin/src/providers/auth0Access.d.ts +6 -0
  15. package/dist/packages/bunshot-admin/src/providers/auth0Access.js +32 -0
  16. package/dist/packages/bunshot-admin/src/routes/admin.d.ts +10 -0
  17. package/dist/packages/bunshot-admin/src/routes/admin.js +923 -0
  18. package/dist/packages/bunshot-admin/src/routes/mail.d.ts +6 -0
  19. package/dist/packages/bunshot-admin/src/routes/mail.js +114 -0
  20. package/dist/packages/bunshot-admin/src/routes/permissions.d.ts +8 -0
  21. package/dist/packages/bunshot-admin/src/routes/permissions.js +315 -0
  22. package/dist/packages/bunshot-admin/src/types/config.d.ts +16 -0
  23. package/dist/packages/bunshot-admin/src/types/config.js +37 -0
  24. package/dist/packages/bunshot-admin/src/types/env.d.ts +14 -0
  25. package/dist/packages/bunshot-admin/src/types/provider.d.ts +1 -0
  26. package/dist/packages/bunshot-admin/src/types/provider.js +4 -0
  27. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.d.ts +66 -0
  28. package/dist/packages/bunshot-auth/src/adapters/memoryAuth.js +1063 -0
  29. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.d.ts +2 -0
  30. package/dist/packages/bunshot-auth/src/adapters/mongoAuth.js +536 -0
  31. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.d.ts +88 -0
  32. package/dist/packages/bunshot-auth/src/adapters/sqliteAuth.js +1366 -0
  33. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.d.ts +2 -0
  34. package/dist/packages/bunshot-auth/src/admin/bunshotAccess.js +23 -0
  35. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.d.ts +5 -0
  36. package/dist/packages/bunshot-auth/src/admin/bunshotUsers.js +131 -0
  37. package/dist/packages/bunshot-auth/src/bootstrap.d.ts +38 -0
  38. package/dist/packages/bunshot-auth/src/bootstrap.js +384 -0
  39. package/dist/packages/bunshot-auth/src/config/appConfig.d.ts +3 -0
  40. package/dist/packages/bunshot-auth/src/config/appConfig.js +4 -0
  41. package/dist/packages/bunshot-auth/src/config/authConfig.d.ts +478 -0
  42. package/dist/packages/bunshot-auth/src/config/authConfig.js +46 -0
  43. package/dist/packages/bunshot-auth/src/config/configLock.d.ts +2 -0
  44. package/dist/packages/bunshot-auth/src/config/configLock.js +10 -0
  45. package/dist/packages/bunshot-auth/src/index.d.ts +25 -0
  46. package/dist/packages/bunshot-auth/src/index.js +23 -0
  47. package/dist/packages/bunshot-auth/src/infra/mongo.d.ts +15 -0
  48. package/dist/packages/bunshot-auth/src/infra/mongo.js +44 -0
  49. package/dist/packages/bunshot-auth/src/infra/queue.d.ts +14 -0
  50. package/dist/packages/bunshot-auth/src/infra/queue.js +27 -0
  51. package/dist/packages/bunshot-auth/src/infra/redis.d.ts +5 -0
  52. package/dist/packages/bunshot-auth/src/infra/redis.js +15 -0
  53. package/dist/packages/bunshot-auth/src/infra/signing.d.ts +7 -0
  54. package/dist/packages/bunshot-auth/src/infra/signing.js +8 -0
  55. package/dist/packages/bunshot-auth/src/lib/accountLockout.d.ts +34 -0
  56. package/dist/packages/bunshot-auth/src/lib/accountLockout.js +244 -0
  57. package/dist/packages/bunshot-auth/src/lib/adapterTiers.d.ts +1 -0
  58. package/dist/packages/bunshot-auth/src/lib/adapterTiers.js +1 -0
  59. package/dist/packages/bunshot-auth/src/lib/authAdapter.d.ts +1 -0
  60. package/dist/packages/bunshot-auth/src/lib/authAdapter.js +1 -0
  61. package/dist/packages/bunshot-auth/src/lib/authContext.d.ts +15 -0
  62. package/dist/packages/bunshot-auth/src/lib/authContext.js +1 -0
  63. package/dist/packages/bunshot-auth/src/lib/authEventBus.d.ts +4 -0
  64. package/dist/packages/bunshot-auth/src/lib/authEventBus.js +15 -0
  65. package/dist/packages/bunshot-auth/src/lib/authRateLimit.d.ts +28 -0
  66. package/dist/packages/bunshot-auth/src/lib/authRateLimit.js +205 -0
  67. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.d.ts +8 -2
  68. package/dist/{lib → packages/bunshot-auth/src/lib}/breachedPassword.js +22 -9
  69. package/dist/packages/bunshot-auth/src/lib/cache.d.ts +12 -0
  70. package/dist/packages/bunshot-auth/src/lib/cache.js +120 -0
  71. package/dist/packages/bunshot-auth/src/lib/clientIp.d.ts +4 -0
  72. package/dist/{lib → packages/bunshot-auth/src/lib}/clientIp.js +14 -7
  73. package/dist/packages/bunshot-auth/src/lib/cookieOptions.d.ts +27 -0
  74. package/dist/packages/bunshot-auth/src/lib/cookieOptions.js +33 -0
  75. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.d.ts +40 -0
  76. package/dist/packages/bunshot-auth/src/lib/credentialStuffing.js +221 -0
  77. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.d.ts +19 -0
  78. package/dist/packages/bunshot-auth/src/lib/deletionCancelToken.js +148 -0
  79. package/dist/packages/bunshot-auth/src/lib/emailTemplates.d.ts +23 -0
  80. package/dist/packages/bunshot-auth/src/lib/emailTemplates.js +265 -0
  81. package/dist/packages/bunshot-auth/src/lib/emailVerification.d.ts +30 -0
  82. package/dist/packages/bunshot-auth/src/lib/emailVerification.js +200 -0
  83. package/dist/packages/bunshot-auth/src/lib/env.d.ts +1 -0
  84. package/dist/packages/bunshot-auth/src/lib/env.js +3 -0
  85. package/dist/packages/bunshot-auth/src/lib/fingerprint.js +36 -0
  86. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.d.ts +15 -16
  87. package/dist/{lib → packages/bunshot-auth/src/lib}/groups.js +22 -34
  88. package/dist/packages/bunshot-auth/src/lib/jwks.d.ts +28 -0
  89. package/dist/packages/bunshot-auth/src/lib/jwks.js +79 -0
  90. package/dist/packages/bunshot-auth/src/lib/jwt.d.ts +12 -0
  91. package/dist/packages/bunshot-auth/src/lib/jwt.js +86 -0
  92. package/dist/{lib → packages/bunshot-auth/src/lib}/logger.js +3 -3
  93. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.d.ts +5 -4
  94. package/dist/{lib → packages/bunshot-auth/src/lib}/m2m.js +6 -10
  95. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  97. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  99. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  105. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  107. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  109. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  111. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  113. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  115. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  117. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.d.ts +7 -7
  118. package/dist/{lib → packages/bunshot-auth/src/lib}/scim.js +15 -13
  119. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  121. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  123. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  125. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.d.ts +3 -2
  126. package/dist/{lib → packages/bunshot-auth/src/lib}/suspension.js +2 -5
  127. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  129. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  131. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  132. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  133. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  135. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -8
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.d.ts +2 -2
  140. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireScope.js +6 -6
  141. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.d.ts +2 -2
  142. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireStepUp.js +8 -7
  143. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  145. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  147. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  149. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +12 -8
  150. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  151. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  153. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  154. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  155. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.d.ts +1 -1
  156. package/dist/{models → packages/bunshot-auth/src/models}/M2MClient.js +5 -5
  157. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  159. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  160. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  161. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  163. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  165. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  167. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  169. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  171. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  173. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  175. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  177. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  179. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  181. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  182. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  183. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  184. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  185. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  189. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  191. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  193. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  194. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  195. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  197. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  198. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  199. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  200. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  201. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  205. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  207. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  209. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  210. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  211. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  213. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  215. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  216. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  217. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  219. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  220. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  221. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  222. package/dist/packages/bunshot-core/src/cache.js +21 -0
  223. package/dist/{lib → packages/bunshot-core/src}/captcha.d.ts +1 -10
  224. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  225. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  227. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  228. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  229. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  230. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  231. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  232. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  233. package/dist/packages/bunshot-core/src/constants.js +10 -0
  234. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  236. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  238. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  240. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  242. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  243. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  244. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  245. package/dist/packages/bunshot-core/src/context.js +35 -0
  246. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  248. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  250. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  252. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  253. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  254. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  255. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  256. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  257. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  258. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  260. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  264. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  266. package/dist/{lib/HttpError.d.ts → packages/bunshot-core/src/errors.d.ts} +4 -1
  267. package/dist/{lib/HttpError.js → packages/bunshot-core/src/errors.js} +7 -1
  268. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  269. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  270. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  271. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  272. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  273. package/dist/packages/bunshot-core/src/index.js +34 -0
  274. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  275. package/dist/packages/bunshot-core/src/mail.js +8 -0
  276. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  278. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  279. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  280. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  281. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  282. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  283. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  284. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  286. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  287. package/dist/packages/bunshot-core/src/redis.js +1 -0
  288. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  290. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  292. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  294. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  295. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  296. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  297. package/dist/packages/bunshot-core/src/signing.js +1 -0
  298. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  299. package/dist/packages/bunshot-core/src/sse.js +1 -0
  300. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  301. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  303. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  304. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  305. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  306. package/dist/packages/bunshot-core/src/testing.js +1 -0
  307. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  309. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  310. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  311. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  313. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  315. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  316. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  317. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  319. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  321. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  323. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  325. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  333. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  335. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  336. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  337. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  338. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  339. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  340. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  341. package/dist/src/app.d.ts +230 -0
  342. package/dist/src/app.js +182 -0
  343. package/dist/src/cli/commands/init.d.ts +10 -0
  344. package/dist/src/cli/commands/init.js +709 -0
  345. package/dist/src/cli/index.d.ts +1 -0
  346. package/dist/src/cli/index.js +3 -0
  347. package/dist/src/entrypoints/mongo.d.ts +6 -0
  348. package/dist/src/entrypoints/mongo.js +4 -0
  349. package/dist/src/entrypoints/queue.d.ts +2 -0
  350. package/dist/src/entrypoints/queue.js +1 -0
  351. package/dist/src/entrypoints/redis.d.ts +1 -0
  352. package/dist/src/entrypoints/redis.js +1 -0
  353. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  354. package/dist/{adapters → src/framework/adapters}/localStorage.js +10 -10
  355. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  356. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  357. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  359. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  360. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  361. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  362. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  363. package/dist/src/framework/admin/index.d.ts +7 -0
  364. package/dist/src/framework/admin/index.js +21 -0
  365. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  367. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  368. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  369. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  370. package/dist/src/framework/boundaryAdapters.js +62 -0
  371. package/dist/src/framework/buildContext.d.ts +33 -0
  372. package/dist/src/framework/buildContext.js +119 -0
  373. package/dist/src/framework/config/schema.d.ts +447 -0
  374. package/dist/src/framework/config/schema.js +528 -0
  375. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  376. package/dist/src/framework/createInfrastructure.js +221 -0
  377. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  378. package/dist/src/framework/lib/auditLog.js +416 -0
  379. package/dist/src/framework/lib/captcha.d.ts +11 -0
  380. package/dist/{lib → src/framework/lib}/captcha.js +13 -10
  381. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  382. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  383. package/dist/src/framework/lib/createRoute.js +2 -0
  384. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  385. package/dist/src/framework/lib/idempotency.js +74 -0
  386. package/dist/src/framework/lib/logger.d.ts +3 -0
  387. package/dist/src/framework/lib/logger.js +14 -0
  388. package/dist/src/framework/lib/metrics.d.ts +34 -0
  389. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  390. package/dist/src/framework/lib/pagination.d.ts +42 -0
  391. package/dist/src/framework/lib/pagination.js +51 -0
  392. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  393. package/dist/src/framework/lib/redisTransport.js +107 -0
  394. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  395. package/dist/src/framework/lib/resolveUserId.js +5 -0
  396. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  397. package/dist/src/framework/lib/sseCollision.js +26 -0
  398. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  399. package/dist/src/framework/lib/storageAdapter.js +1 -0
  400. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  401. package/dist/src/framework/lib/tenant.d.ts +21 -0
  402. package/dist/src/framework/lib/tenant.js +70 -0
  403. package/dist/{lib → src/framework/lib}/upload.d.ts +11 -10
  404. package/dist/src/framework/lib/upload.js +132 -0
  405. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  406. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  407. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  408. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  409. package/dist/src/framework/lib/ws.d.ts +19 -0
  410. package/dist/src/framework/lib/ws.js +130 -0
  411. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  412. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  413. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  414. package/dist/src/framework/lib/wsMessages.js +45 -0
  415. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  416. package/dist/src/framework/lib/wsNamespace.js +19 -0
  417. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  418. package/dist/src/framework/lib/wsPresence.js +84 -0
  419. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  420. package/dist/src/framework/lib/wsTransport.js +9 -0
  421. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  423. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  424. package/dist/src/framework/middleware/auditLog.js +42 -0
  425. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  426. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  427. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  428. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  429. package/dist/{middleware → src/framework/middleware}/captcha.d.ts +2 -3
  430. package/dist/src/framework/middleware/captcha.js +37 -0
  431. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.js +2 -2
  433. package/dist/src/framework/middleware/index.js +1 -0
  434. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  435. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  436. package/dist/src/framework/middleware/metrics.js +26 -0
  437. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  438. package/dist/src/framework/middleware/rateLimit.js +22 -0
  439. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  440. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  441. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  443. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -20
  445. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  446. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  447. package/dist/src/framework/middleware/upload.d.ts +5 -0
  448. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  449. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -12
  451. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  452. package/dist/src/framework/models/AuditLog.js +31 -0
  453. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  454. package/dist/src/framework/mountMiddleware.js +128 -0
  455. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  456. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  457. package/dist/src/framework/mountRoutes.d.ts +21 -0
  458. package/dist/src/framework/mountRoutes.js +144 -0
  459. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  460. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  461. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  462. package/dist/src/framework/persistence/idempotency.js +178 -0
  463. package/dist/src/framework/persistence/index.d.ts +6 -0
  464. package/dist/src/framework/persistence/index.js +8 -0
  465. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  466. package/dist/src/framework/persistence/storeInfra.js +1 -0
  467. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  468. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  469. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  470. package/dist/src/framework/persistence/wsMessages.js +296 -0
  471. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  472. package/dist/src/framework/preloadSchemas.js +42 -0
  473. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  474. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  475. package/dist/src/framework/routes/admin.d.ts +9 -0
  476. package/dist/src/framework/routes/admin.js +361 -0
  477. package/dist/src/framework/routes/health.d.ts +1 -0
  478. package/dist/src/framework/routes/health.js +21 -0
  479. package/dist/src/framework/routes/home.d.ts +1 -0
  480. package/dist/src/framework/routes/home.js +18 -0
  481. package/dist/src/framework/routes/jobs.d.ts +3 -0
  482. package/dist/{routes → src/framework/routes}/jobs.js +128 -103
  483. package/dist/src/framework/routes/metrics.d.ts +10 -0
  484. package/dist/src/framework/routes/metrics.js +57 -0
  485. package/dist/{routes → src/framework/routes}/uploads.d.ts +3 -3
  486. package/dist/src/framework/routes/uploads.js +262 -0
  487. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  488. package/dist/src/framework/runPluginLifecycle.js +121 -0
  489. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  491. package/dist/src/framework/secrets/index.d.ts +9 -0
  492. package/dist/src/framework/secrets/index.js +7 -0
  493. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  494. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  495. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  497. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  499. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  501. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  502. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  503. package/dist/src/framework/sse/index.d.ts +21 -0
  504. package/dist/src/framework/sse/index.js +109 -0
  505. package/dist/src/framework/ws/index.d.ts +11 -0
  506. package/dist/src/framework/ws/index.js +8 -0
  507. package/dist/src/index.d.ts +87 -0
  508. package/dist/src/index.js +58 -0
  509. package/dist/src/lib/appConfig.d.ts +7 -0
  510. package/dist/src/lib/appConfig.js +27 -0
  511. package/dist/src/lib/appMeta.d.ts +7 -0
  512. package/dist/src/lib/appMeta.js +3 -0
  513. package/dist/src/lib/authConfig.d.ts +532 -0
  514. package/dist/{lib/appConfig.js → src/lib/authConfig.js} +75 -17
  515. package/dist/{lib → src/lib}/context.d.ts +6 -12
  516. package/dist/{lib → src/lib}/context.js +5 -5
  517. package/dist/src/lib/logger.d.ts +1 -0
  518. package/dist/src/lib/logger.js +1 -0
  519. package/dist/src/lib/mongo.d.ts +58 -0
  520. package/dist/src/lib/mongo.js +96 -0
  521. package/dist/src/lib/queue.d.ts +72 -0
  522. package/dist/src/lib/queue.js +152 -0
  523. package/dist/src/lib/redis.d.ts +28 -0
  524. package/dist/src/lib/redis.js +72 -0
  525. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  526. package/dist/src/lib/signing.js +210 -0
  527. package/dist/src/lib/signingConfig.d.ts +40 -0
  528. package/dist/src/lib/signingConfig.js +28 -0
  529. package/dist/src/server.d.ts +146 -0
  530. package/dist/src/server.js +469 -0
  531. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  532. package/dist/src/shared/lib/HttpError.js +2 -0
  533. package/dist/src/shared/lib/constants.d.ts +10 -0
  534. package/dist/src/shared/lib/crypto.d.ts +43 -0
  535. package/dist/src/shared/lib/crypto.js +74 -0
  536. package/dist/src/shared/lib/signing.d.ts +52 -0
  537. package/dist/{lib → src/shared/lib}/signing.js +35 -8
  538. package/dist/src/testing.d.ts +34 -0
  539. package/dist/src/testing.js +93 -0
  540. package/package.json +60 -24
  541. package/dist/adapters/memoryAuth.d.ts +0 -52
  542. package/dist/adapters/memoryAuth.js +0 -749
  543. package/dist/adapters/memoryStorage.d.ts +0 -3
  544. package/dist/adapters/memoryStorage.js +0 -44
  545. package/dist/adapters/mongoAuth.d.ts +0 -2
  546. package/dist/adapters/mongoAuth.js +0 -403
  547. package/dist/adapters/sqliteAuth.d.ts +0 -72
  548. package/dist/adapters/sqliteAuth.js +0 -858
  549. package/dist/app.d.ts +0 -559
  550. package/dist/app.js +0 -651
  551. package/dist/entrypoints/mongo.d.ts +0 -5
  552. package/dist/entrypoints/mongo.js +0 -4
  553. package/dist/entrypoints/queue.d.ts +0 -2
  554. package/dist/entrypoints/queue.js +0 -1
  555. package/dist/entrypoints/redis.d.ts +0 -1
  556. package/dist/entrypoints/redis.js +0 -1
  557. package/dist/index.d.ts +0 -117
  558. package/dist/index.js +0 -88
  559. package/dist/lib/appConfig.d.ts +0 -275
  560. package/dist/lib/auditLog.d.ts +0 -58
  561. package/dist/lib/auditLog.js +0 -218
  562. package/dist/lib/authAdapter.d.ts +0 -246
  563. package/dist/lib/authAdapter.js +0 -7
  564. package/dist/lib/authRateLimit.d.ts +0 -13
  565. package/dist/lib/authRateLimit.js +0 -117
  566. package/dist/lib/clientIp.d.ts +0 -14
  567. package/dist/lib/credentialStuffing.d.ts +0 -31
  568. package/dist/lib/credentialStuffing.js +0 -77
  569. package/dist/lib/crypto.d.ts +0 -11
  570. package/dist/lib/crypto.js +0 -22
  571. package/dist/lib/deletionCancelToken.d.ts +0 -12
  572. package/dist/lib/deletionCancelToken.js +0 -88
  573. package/dist/lib/emailVerification.d.ts +0 -19
  574. package/dist/lib/emailVerification.js +0 -129
  575. package/dist/lib/fingerprint.js +0 -36
  576. package/dist/lib/idempotency.js +0 -182
  577. package/dist/lib/jwks.d.ts +0 -25
  578. package/dist/lib/jwks.js +0 -51
  579. package/dist/lib/jwt.d.ts +0 -15
  580. package/dist/lib/jwt.js +0 -111
  581. package/dist/lib/metrics.d.ts +0 -14
  582. package/dist/lib/mfaChallenge.d.ts +0 -55
  583. package/dist/lib/mfaChallenge.js +0 -398
  584. package/dist/lib/mongo.d.ts +0 -39
  585. package/dist/lib/mongo.js +0 -124
  586. package/dist/lib/oauth.d.ts +0 -40
  587. package/dist/lib/oauth.js +0 -101
  588. package/dist/lib/oauthCode.d.ts +0 -15
  589. package/dist/lib/oauthCode.js +0 -95
  590. package/dist/lib/pagination.d.ts +0 -119
  591. package/dist/lib/pagination.js +0 -166
  592. package/dist/lib/queue.d.ts +0 -37
  593. package/dist/lib/queue.js +0 -117
  594. package/dist/lib/redis.d.ts +0 -9
  595. package/dist/lib/redis.js +0 -61
  596. package/dist/lib/resetPassword.d.ts +0 -12
  597. package/dist/lib/resetPassword.js +0 -93
  598. package/dist/lib/roles.d.ts +0 -7
  599. package/dist/lib/roles.js +0 -49
  600. package/dist/lib/saml.d.ts +0 -25
  601. package/dist/lib/saml.js +0 -64
  602. package/dist/lib/securityEvents.d.ts +0 -28
  603. package/dist/lib/securityEvents.js +0 -26
  604. package/dist/lib/session.d.ts +0 -49
  605. package/dist/lib/session.js +0 -597
  606. package/dist/lib/tenant.d.ts +0 -15
  607. package/dist/lib/tenant.js +0 -65
  608. package/dist/lib/upload.js +0 -112
  609. package/dist/lib/uploadRegistry.d.ts +0 -18
  610. package/dist/lib/uploadRegistry.js +0 -83
  611. package/dist/lib/ws.d.ts +0 -22
  612. package/dist/lib/ws.js +0 -96
  613. package/dist/lib/wsHeartbeat.d.ts +0 -12
  614. package/dist/lib/wsHeartbeat.js +0 -57
  615. package/dist/lib/wsMessages.d.ts +0 -40
  616. package/dist/lib/wsMessages.js +0 -330
  617. package/dist/lib/wsPresence.d.ts +0 -25
  618. package/dist/lib/wsPresence.js +0 -99
  619. package/dist/middleware/auditLog.js +0 -39
  620. package/dist/middleware/bearerAuth.d.ts +0 -2
  621. package/dist/middleware/bearerAuth.js +0 -11
  622. package/dist/middleware/cacheResponse.d.ts +0 -15
  623. package/dist/middleware/cacheResponse.js +0 -178
  624. package/dist/middleware/captcha.js +0 -36
  625. package/dist/middleware/csrf.js +0 -129
  626. package/dist/middleware/identify.d.ts +0 -3
  627. package/dist/middleware/identify.js +0 -122
  628. package/dist/middleware/index.js +0 -1
  629. package/dist/middleware/metrics.d.ts +0 -9
  630. package/dist/middleware/metrics.js +0 -26
  631. package/dist/middleware/rateLimit.js +0 -22
  632. package/dist/middleware/requestId.d.ts +0 -3
  633. package/dist/middleware/scimAuth.d.ts +0 -8
  634. package/dist/middleware/scimAuth.js +0 -29
  635. package/dist/middleware/tenant.d.ts +0 -5
  636. package/dist/middleware/upload.d.ts +0 -5
  637. package/dist/middleware/userAuth.d.ts +0 -3
  638. package/dist/middleware/userAuth.js +0 -6
  639. package/dist/models/AuditLog.d.ts +0 -30
  640. package/dist/models/AuditLog.js +0 -39
  641. package/dist/models/AuthUser.js +0 -55
  642. package/dist/models/Group.d.ts +0 -21
  643. package/dist/models/Group.js +0 -28
  644. package/dist/models/GroupMembership.js +0 -25
  645. package/dist/models/TenantRole.d.ts +0 -15
  646. package/dist/models/TenantRole.js +0 -23
  647. package/dist/routes/auth.d.ts +0 -12
  648. package/dist/routes/auth.js +0 -744
  649. package/dist/routes/groups.js +0 -346
  650. package/dist/routes/health.d.ts +0 -1
  651. package/dist/routes/health.js +0 -22
  652. package/dist/routes/home.d.ts +0 -1
  653. package/dist/routes/home.js +0 -16
  654. package/dist/routes/jobs.d.ts +0 -2
  655. package/dist/routes/m2m.d.ts +0 -2
  656. package/dist/routes/m2m.js +0 -72
  657. package/dist/routes/metrics.d.ts +0 -8
  658. package/dist/routes/metrics.js +0 -55
  659. package/dist/routes/mfa.d.ts +0 -5
  660. package/dist/routes/mfa.js +0 -628
  661. package/dist/routes/oauth.d.ts +0 -2
  662. package/dist/routes/oauth.js +0 -520
  663. package/dist/routes/oidc.d.ts +0 -2
  664. package/dist/routes/oidc.js +0 -29
  665. package/dist/routes/passkey.d.ts +0 -1
  666. package/dist/routes/passkey.js +0 -157
  667. package/dist/routes/saml.d.ts +0 -2
  668. package/dist/routes/saml.js +0 -86
  669. package/dist/routes/scim.d.ts +0 -2
  670. package/dist/routes/scim.js +0 -255
  671. package/dist/routes/uploads.js +0 -227
  672. package/dist/schemas/auth.js +0 -30
  673. package/dist/server.d.ts +0 -57
  674. package/dist/server.js +0 -112
  675. package/dist/services/auth.d.ts +0 -29
  676. package/dist/services/auth.js +0 -238
  677. package/dist/ws/index.d.ts +0 -10
  678. package/dist/ws/index.js +0 -39
  679. package/docs/sections/adding-middleware/full.md +0 -35
  680. package/docs/sections/adding-models/full.md +0 -125
  681. package/docs/sections/adding-models/overview.md +0 -13
  682. package/docs/sections/adding-routes/full.md +0 -182
  683. package/docs/sections/adding-routes/overview.md +0 -23
  684. package/docs/sections/auth-flow/full.md +0 -790
  685. package/docs/sections/auth-flow/overview.md +0 -10
  686. package/docs/sections/auth-security-examples/full.md +0 -388
  687. package/docs/sections/authentication/full.md +0 -130
  688. package/docs/sections/authentication/overview.md +0 -5
  689. package/docs/sections/cli/full.md +0 -42
  690. package/docs/sections/configuration/full.md +0 -172
  691. package/docs/sections/configuration/overview.md +0 -18
  692. package/docs/sections/configuration-example/full.md +0 -117
  693. package/docs/sections/configuration-example/overview.md +0 -30
  694. package/docs/sections/documentation/full.md +0 -171
  695. package/docs/sections/environment-variables/full.md +0 -55
  696. package/docs/sections/exports/full.md +0 -123
  697. package/docs/sections/extending-context/full.md +0 -59
  698. package/docs/sections/header.md +0 -3
  699. package/docs/sections/installation/full.md +0 -6
  700. package/docs/sections/jobs/full.md +0 -140
  701. package/docs/sections/jobs/overview.md +0 -15
  702. package/docs/sections/logging/full.md +0 -83
  703. package/docs/sections/metrics/full.md +0 -131
  704. package/docs/sections/mongodb-connections/full.md +0 -45
  705. package/docs/sections/mongodb-connections/overview.md +0 -7
  706. package/docs/sections/multi-tenancy/full.md +0 -66
  707. package/docs/sections/multi-tenancy/overview.md +0 -15
  708. package/docs/sections/oauth/full.md +0 -189
  709. package/docs/sections/oauth/overview.md +0 -16
  710. package/docs/sections/package-development/full.md +0 -7
  711. package/docs/sections/pagination/full.md +0 -93
  712. package/docs/sections/passkey-login/full.md +0 -90
  713. package/docs/sections/passkey-login/overview.md +0 -1
  714. package/docs/sections/peer-dependencies/full.md +0 -47
  715. package/docs/sections/quick-start/full.md +0 -43
  716. package/docs/sections/response-caching/full.md +0 -117
  717. package/docs/sections/response-caching/overview.md +0 -13
  718. package/docs/sections/roles/full.md +0 -225
  719. package/docs/sections/roles/overview.md +0 -14
  720. package/docs/sections/running-without-redis/full.md +0 -16
  721. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  722. package/docs/sections/signing/full.md +0 -203
  723. package/docs/sections/stack/full.md +0 -10
  724. package/docs/sections/uploads/full.md +0 -208
  725. package/docs/sections/versioning/full.md +0 -85
  726. package/docs/sections/webhook-auth/full.md +0 -100
  727. package/docs/sections/websocket/full.md +0 -196
  728. package/docs/sections/websocket/overview.md +0 -5
  729. package/docs/sections/websocket-rooms/full.md +0 -102
  730. package/docs/sections/websocket-rooms/overview.md +0 -5
  731. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  732. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  733. /package/dist/{lib → packages/bunshot-auth/src/lib}/logger.d.ts +0 -0
  734. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  735. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  736. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  737. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  738. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  739. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  740. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  741. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  742. /package/dist/{lib → src/shared/lib}/constants.js +0 -0
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ const passwordSchema = (policy) => {
3
+ const minLen = policy.minLength ?? 8;
4
+ let schema = z.string().min(minLen, `Password must be at least ${minLen} characters`);
5
+ if (policy.requireLetter !== false) {
6
+ schema = schema.regex(/[a-zA-Z]/, 'Password must contain at least one letter');
7
+ }
8
+ if (policy.requireDigit !== false) {
9
+ schema = schema.regex(/\d/, 'Password must contain at least one digit');
10
+ }
11
+ if (policy.requireSpecial) {
12
+ schema = schema.regex(/[^a-zA-Z0-9]/, 'Password must contain at least one special character');
13
+ }
14
+ return schema;
15
+ };
16
+ export const makeRegisterSchema = (primaryField, policy) => z.object({
17
+ [primaryField]: primaryField === 'email' ? z.string().email().max(256) : z.string().min(3).max(256),
18
+ password: passwordSchema(policy).max(128),
19
+ });
20
+ export const makeLoginSchema = (primaryField) => z.object({
21
+ [primaryField]: primaryField === 'email' ? z.string().email().max(256) : z.string().min(1).max(256),
22
+ password: z.string().min(1).max(128),
23
+ });
24
+ export const resetPasswordSchema = (policy) => passwordSchema(policy);
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Canonical error response schema shared across all auth routes.
4
+ *
5
+ * M2M and SCIM routes intentionally use spec-compliant error shapes
6
+ * (RFC 6749 and SCIM RFC 7644 respectively) and do not use this schema.
7
+ */
8
+ export declare const ErrorResponse: z.ZodObject<{
9
+ error: z.ZodString;
10
+ }, z.core.$strip>;
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Canonical error response schema shared across all auth routes.
4
+ *
5
+ * M2M and SCIM routes intentionally use spec-compliant error shapes
6
+ * (RFC 6749 and SCIM RFC 7644 respectively) and do not use this schema.
7
+ */
8
+ export const ErrorResponse = z
9
+ .object({ error: z.string().describe('Human-readable error message.') })
10
+ .openapi('ErrorResponse');
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Canonical generic success response for auth routes.
4
+ *
5
+ * Use this for acknowledgement-style successes. Routes with domain data
6
+ * should extend this shape or return their domain object directly.
7
+ */
8
+ export declare const SuccessResponse: z.ZodObject<{
9
+ ok: z.ZodLiteral<true>;
10
+ }, z.core.$strip>;
@@ -0,0 +1,10 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Canonical generic success response for auth routes.
4
+ *
5
+ * Use this for acknowledgement-style successes. Routes with domain data
6
+ * should extend this shape or return their domain object directly.
7
+ */
8
+ export const SuccessResponse = z
9
+ .object({ ok: z.literal(true).describe('Operation completed successfully.') })
10
+ .openapi('AuthSuccessResponse');
@@ -0,0 +1,39 @@
1
+ import type { SessionMetadata } from '../lib/session';
2
+ import type { HookContext } from '../config/authConfig';
3
+ import type { AuthRuntimeContext } from '../runtime';
4
+ export interface AuthResult {
5
+ token: string;
6
+ userId: string;
7
+ email?: string;
8
+ emailVerified?: boolean;
9
+ googleLinked?: boolean;
10
+ refreshToken?: string;
11
+ mfaRequired?: boolean;
12
+ mfaToken?: string;
13
+ mfaMethods?: string[];
14
+ webauthnOptions?: Record<string, unknown>;
15
+ }
16
+ export declare const runPreLoginHook: (identifier: string, runtime: AuthRuntimeContext, hookContext?: HookContext) => Promise<void>;
17
+ export declare const emitLoginSuccess: (userId: string, sessionId: string, runtime: AuthRuntimeContext) => void;
18
+ /** Create a session for a user (used internally and by MFA verify). */
19
+ export declare const createSessionForUser: (userId: string, runtime: AuthRuntimeContext, metadata?: SessionMetadata, hookContext?: HookContext) => Promise<{
20
+ token: string;
21
+ refreshToken?: string;
22
+ sessionId: string;
23
+ }>;
24
+ export interface RegisterOptions {
25
+ metadata?: SessionMetadata;
26
+ /** When true, skip session creation. Returns { userId } without a token. */
27
+ skipSession?: boolean;
28
+ hookContext?: HookContext;
29
+ }
30
+ export declare const register: (identifier: string, password: string, runtime: AuthRuntimeContext, metadataOrOptions?: SessionMetadata | RegisterOptions) => Promise<AuthResult>;
31
+ export declare const login: (identifier: string, password: string, runtime: AuthRuntimeContext, metadata?: SessionMetadata, hookContext?: HookContext) => Promise<AuthResult>;
32
+ export declare const refresh: (refreshTokenValue: string, runtime: AuthRuntimeContext) => Promise<{
33
+ token: string;
34
+ refreshToken: string;
35
+ userId: string;
36
+ }>;
37
+ export declare const deleteAccount: (userId: string, runtime: AuthRuntimeContext, password?: string) => Promise<void>;
38
+ export declare const logout: (token: string | null, runtime: AuthRuntimeContext) => Promise<void>;
39
+ export declare const passkeyLogin: (passkeyToken: string, assertionResponse: any, runtime: AuthRuntimeContext, metadata?: SessionMetadata, hookContext?: HookContext) => Promise<AuthResult>;
@@ -0,0 +1,378 @@
1
+ import { createVerificationToken } from '../lib/emailVerification';
2
+ import { signToken, verifyToken } from '../lib/jwt';
3
+ import { createMfaChallenge } from '../lib/mfaChallenge';
4
+ import { getSuspended } from '../lib/suspension';
5
+ import { generateEmailOtpCode, generateWebAuthnAuthenticationOptions } from '../services/mfa';
6
+ import { HttpError } from '../../../bunshot-core/src/index.js';
7
+ export const runPreLoginHook = async (identifier, runtime, hookContext) => {
8
+ const hooks = runtime.config.hooks;
9
+ if (hooks.preLogin)
10
+ await hooks.preLogin({ identifier, ...hookContext });
11
+ };
12
+ export const emitLoginSuccess = (userId, sessionId, runtime) => {
13
+ runtime.eventBus.emit('security.auth.login.success', { userId });
14
+ runtime.eventBus.emit('auth:login', { userId, sessionId });
15
+ };
16
+ async function createSessionWithRefreshToken(userId, sessionId, runtime, metadata, hookContext) {
17
+ const { config, eventBus } = runtime;
18
+ const hooks = config.hooks;
19
+ // Fire postLogin before signing the token so customClaims can be injected
20
+ let customClaims;
21
+ if (hooks.postLogin) {
22
+ try {
23
+ const result = await hooks.postLogin({ userId, sessionId, ...hookContext });
24
+ if (result && typeof result === 'object' && result.customClaims) {
25
+ customClaims = result.customClaims;
26
+ }
27
+ }
28
+ catch (e) {
29
+ console.error('[lifecycle] postLogin hook error:', e instanceof Error ? e.message : String(e));
30
+ }
31
+ }
32
+ const rtConfig = config.refreshToken;
33
+ // When refresh tokens are disabled the JWT is the sole credential, so it must carry an explicit
34
+ // expiry. Tie it to the configured session absolute timeout so the two stay in sync; fall back
35
+ // to 604 800 s (7 days) to preserve the historic default for deployments that haven't set
36
+ // absoluteTimeout. Operators who want shorter-lived tokens should configure absoluteTimeout.
37
+ const expirySeconds = rtConfig
38
+ ? (rtConfig.accessTokenExpiry ?? 900)
39
+ : (config.sessionPolicy?.absoluteTimeout ?? 604800);
40
+ // Strip JOSE-managed claims and the code-owned identity claims from customClaims so
41
+ // that a postLogin hook returning { exp: 0 } or { sub: "attacker" } cannot override them.
42
+ // The setter methods (setExpirationTime, setIssuedAt, setIssuer, setAudience) always win
43
+ // at the jose level, but stripping here keeps the payload object trustworthy before signing.
44
+ const RESERVED_CLAIMS = new Set(['exp', 'iat', 'nbf', 'iss', 'aud', 'jti', 'sub', 'sid']);
45
+ const safeClaims = customClaims
46
+ ? Object.fromEntries(Object.entries(customClaims).filter(([k]) => !RESERVED_CLAIMS.has(k)))
47
+ : undefined;
48
+ const claims = { sub: userId, sid: sessionId, ...safeClaims };
49
+ const token = await signToken(claims, expirySeconds, config, runtime.signing);
50
+ const sessionRepo = runtime.repos.session;
51
+ await sessionRepo.atomicCreateSession(userId, token, sessionId, config.maxSessions, metadata, config);
52
+ let refreshToken;
53
+ if (rtConfig) {
54
+ refreshToken = crypto.randomUUID();
55
+ await sessionRepo.setRefreshToken(sessionId, refreshToken, config);
56
+ }
57
+ eventBus.emit('security.auth.session.created', { userId, sessionId });
58
+ return { token, refreshToken, sessionId };
59
+ }
60
+ /** Create a session for a user (used internally and by MFA verify). */
61
+ export const createSessionForUser = async (userId, runtime, metadata, hookContext) => {
62
+ const sessionId = crypto.randomUUID();
63
+ return createSessionWithRefreshToken(userId, sessionId, runtime, metadata, hookContext);
64
+ };
65
+ export const register = async (identifier, password, runtime, metadataOrOptions) => {
66
+ // Accept both old-style SessionMetadata and new RegisterOptions
67
+ let metadata;
68
+ let skipSession = false;
69
+ let hookContext;
70
+ if (metadataOrOptions &&
71
+ ('skipSession' in metadataOrOptions ||
72
+ 'metadata' in metadataOrOptions ||
73
+ 'hookContext' in metadataOrOptions)) {
74
+ const opts = metadataOrOptions;
75
+ metadata = opts.metadata;
76
+ skipSession = opts.skipSession ?? false;
77
+ hookContext = opts.hookContext;
78
+ }
79
+ else {
80
+ metadata = metadataOrOptions;
81
+ }
82
+ const { config, adapter, eventBus } = runtime;
83
+ const hooks = config.hooks;
84
+ if (hooks.preRegister)
85
+ await hooks.preRegister({ identifier, ...hookContext });
86
+ try {
87
+ const hashed = await Bun.password.hash(password);
88
+ const user = await adapter.create(identifier, hashed);
89
+ const role = config.defaultRole;
90
+ if (role)
91
+ await adapter.setRoles(user.id, [role]);
92
+ let token = '';
93
+ let refreshToken;
94
+ if (!skipSession) {
95
+ const sessionId = crypto.randomUUID();
96
+ const session = await createSessionWithRefreshToken(user.id, sessionId, runtime, metadata, hookContext);
97
+ token = session.token;
98
+ refreshToken = session.refreshToken;
99
+ }
100
+ const evConfig = config.emailVerification;
101
+ if (evConfig && config.primaryField === 'email') {
102
+ try {
103
+ const verificationToken = await createVerificationToken(runtime.repos.verificationToken, user.id, identifier, config);
104
+ eventBus.emit('auth:delivery.email_verification', {
105
+ email: identifier,
106
+ token: verificationToken,
107
+ userId: user.id,
108
+ });
109
+ eventBus.emit('auth:delivery.welcome', { email: identifier, identifier });
110
+ }
111
+ catch (e) {
112
+ console.error('[email-verification] Failed to send verification email:', e instanceof Error ? e.message : String(e));
113
+ }
114
+ }
115
+ eventBus.emit('security.auth.register.success', { userId: user.id });
116
+ eventBus.emit('auth:user.created', { userId: user.id, email: identifier });
117
+ if (hooks.postRegister) {
118
+ Promise.resolve()
119
+ .then(() => hooks.postRegister({ userId: user.id, identifier, ...hookContext }))
120
+ .catch(e => console.error('[lifecycle] postRegister hook error:', e instanceof Error ? e.message : String(e)));
121
+ }
122
+ return { token, userId: user.id, email: identifier, refreshToken };
123
+ }
124
+ catch (err) {
125
+ eventBus.emit('security.auth.register.failure', {});
126
+ throw err;
127
+ }
128
+ };
129
+ // Pre-computed dummy hash so non-existent-user login takes the same time as wrong-password login
130
+ const DUMMY_HASH = await Bun.password.hash('dummy-timing-safe-placeholder');
131
+ export const login = async (identifier, password, runtime, metadata, hookContext) => {
132
+ const { config, adapter, eventBus } = runtime;
133
+ await runPreLoginHook(identifier, runtime, hookContext);
134
+ const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
135
+ const user = await findFn(identifier);
136
+ // Always verify against a hash to prevent timing-based user enumeration.
137
+ // Lockout check is intentionally AFTER bcrypt to prevent timing leaks —
138
+ // locked accounts must take the same bcrypt time as non-existent users.
139
+ const hashToVerify = user?.passwordHash ?? DUMMY_HASH;
140
+ const passwordValid = await Bun.password.verify(password, hashToVerify);
141
+ // Check lockout after bcrypt so locked and non-existent users are indistinguishable by timing
142
+ const lockoutSvc = runtime.lockout;
143
+ if (user && lockoutSvc && (await lockoutSvc.isAccountLocked(user.id))) {
144
+ eventBus.emit('security.auth.login.blocked', {
145
+ userId: user.id,
146
+ reason: 'lockout',
147
+ meta: { reason: 'account_locked' },
148
+ });
149
+ throw new HttpError(423, 'Account is locked due to too many failed login attempts', 'ACCOUNT_LOCKED');
150
+ }
151
+ if (!user || !passwordValid) {
152
+ eventBus.emit('security.auth.login.failure', { identifier, meta: { identifier } });
153
+ // Track failed attempts for lockout (only when user exists — can't lock unknown accounts)
154
+ if (user && lockoutSvc) {
155
+ const count = await lockoutSvc.recordFailedAttempt(user.id);
156
+ if (count >= lockoutSvc.config.maxAttempts) {
157
+ await lockoutSvc.lockAccount(user.id);
158
+ eventBus.emit('security.auth.account.locked', {
159
+ userId: user.id,
160
+ meta: { identifier, attempts: count },
161
+ });
162
+ if (lockoutSvc.config.onLocked) {
163
+ Promise.resolve()
164
+ .then(() => lockoutSvc.config.onLocked(user.id, identifier))
165
+ .catch(() => {
166
+ /* swallow — notification must never crash login */
167
+ });
168
+ }
169
+ }
170
+ }
171
+ throw new HttpError(401, 'Invalid credentials');
172
+ }
173
+ // Check suspension
174
+ const suspensionStatus = await getSuspended(adapter, user.id);
175
+ if (suspensionStatus.suspended) {
176
+ eventBus.emit('security.auth.login.blocked', {
177
+ reason: 'suspended',
178
+ meta: { reason: 'suspended' },
179
+ });
180
+ throw new HttpError(403, 'Account suspended', 'ACCOUNT_SUSPENDED');
181
+ }
182
+ // Check email verification before MFA to avoid leaking MFA status to unverified users
183
+ const fullUser = adapter.getUser ? await adapter.getUser(user.id) : null;
184
+ const googleLinked = fullUser?.providerIds?.some(id => id.startsWith('google:')) ?? false;
185
+ const evConfig = config.emailVerification;
186
+ if (evConfig && config.primaryField === 'email' && adapter.getEmailVerified) {
187
+ const verified = await adapter.getEmailVerified(user.id);
188
+ if (evConfig.required && !verified) {
189
+ throw new HttpError(403, 'Email not verified');
190
+ }
191
+ }
192
+ // Check MFA — if enabled, return challenge token instead of session
193
+ if (config.mfa && adapter.isMfaEnabled && (await adapter.isMfaEnabled(user.id))) {
194
+ const methods = adapter.getMfaMethods ? await adapter.getMfaMethods(user.id) : ['totp'];
195
+ // Auto-send email OTP if enabled
196
+ let emailOtpHash;
197
+ const emailOtpConfig = config.mfa?.emailOtp ?? null;
198
+ if (methods.includes('emailOtp') && emailOtpConfig) {
199
+ const { code, hash } = generateEmailOtpCode(runtime);
200
+ emailOtpHash = hash;
201
+ const email = fullUser?.email;
202
+ if (email)
203
+ eventBus.emit('auth:delivery.email_otp', { email, code });
204
+ }
205
+ // Generate WebAuthn authentication options if enabled
206
+ let webauthnChallenge;
207
+ let webauthnOptions;
208
+ const webauthnConfig = config.mfa?.webauthn ?? null;
209
+ if (methods.includes('webauthn') && webauthnConfig && adapter.getWebAuthnCredentials) {
210
+ const result = await generateWebAuthnAuthenticationOptions(user.id, runtime);
211
+ if (result) {
212
+ webauthnChallenge = result.challenge;
213
+ webauthnOptions = result.options;
214
+ }
215
+ }
216
+ const mfaToken = await createMfaChallenge(runtime.repos.mfaChallenge, user.id, { emailOtpHash, webauthnChallenge }, config);
217
+ return {
218
+ token: '',
219
+ userId: user.id,
220
+ mfaRequired: true,
221
+ mfaToken,
222
+ mfaMethods: methods,
223
+ webauthnOptions,
224
+ };
225
+ }
226
+ const sessionId = crypto.randomUUID();
227
+ const { token, refreshToken } = await createSessionWithRefreshToken(user.id, sessionId, runtime, metadata, hookContext);
228
+ // Reset failure counter on successful login (opt-out via resetOnSuccess: false)
229
+ if (lockoutSvc && lockoutSvc.config.resetOnSuccess !== false) {
230
+ await lockoutSvc.resetFailureCount(user.id);
231
+ }
232
+ emitLoginSuccess(user.id, sessionId, runtime);
233
+ if (evConfig && config.primaryField === 'email' && adapter.getEmailVerified) {
234
+ const verified = await adapter.getEmailVerified(user.id);
235
+ return {
236
+ token,
237
+ userId: user.id,
238
+ email: fullUser?.email,
239
+ emailVerified: verified,
240
+ googleLinked,
241
+ refreshToken,
242
+ };
243
+ }
244
+ return { token, userId: user.id, email: fullUser?.email, googleLinked, refreshToken };
245
+ };
246
+ export const refresh = async (refreshTokenValue, runtime) => {
247
+ const sessionRepo = runtime.repos.session;
248
+ const result = await sessionRepo.getSessionByRefreshToken(refreshTokenValue, runtime.config);
249
+ if (!result) {
250
+ throw new HttpError(401, 'Invalid or expired refresh token');
251
+ }
252
+ const { sessionId, userId } = result;
253
+ // Always rotate: generate new refresh + access tokens.
254
+ // Refresh tokens are stored as hashes — we can never return a stored plaintext token.
255
+ // Even in the grace window case (old token used after rotation), we issue fresh tokens.
256
+ // This is safe because the old token's hash was found in the prev slot, not the current slot,
257
+ // so the session is valid and the client just missed the previous rotation response.
258
+ const newRT = crypto.randomUUID();
259
+ const newAccessToken = await signToken({ sub: userId, sid: sessionId }, runtime.config.refreshToken?.accessTokenExpiry ?? 900, runtime.config, runtime.signing);
260
+ await sessionRepo.rotateRefreshToken(sessionId, newRT, newAccessToken, runtime.config);
261
+ await sessionRepo.updateSessionLastActive(sessionId, runtime.config);
262
+ return { token: newAccessToken, refreshToken: newRT, userId };
263
+ };
264
+ export const deleteAccount = async (userId, runtime, password) => {
265
+ const { adapter, config, eventBus } = runtime;
266
+ const hooks = config.hooks;
267
+ if (hooks.preDeleteAccount)
268
+ await hooks.preDeleteAccount({ userId });
269
+ if (!adapter.deleteUser) {
270
+ throw new HttpError(501, 'Auth adapter does not support deleteUser');
271
+ }
272
+ // Verify password for credential accounts
273
+ if (password) {
274
+ const user = adapter.getUser ? await adapter.getUser(userId) : null;
275
+ const email = user?.email;
276
+ if (email) {
277
+ const findFn = adapter.findByIdentifier ?? adapter.findByEmail.bind(adapter);
278
+ const found = await findFn(email);
279
+ if (found && !(await Bun.password.verify(password, found.passwordHash))) {
280
+ throw new HttpError(401, 'Invalid password');
281
+ }
282
+ }
283
+ }
284
+ else if (adapter.hasPassword && (await adapter.hasPassword(userId))) {
285
+ throw new HttpError(400, 'Password is required to delete a credential account');
286
+ }
287
+ // Revoke all sessions
288
+ const sessionRepo = runtime.repos.session;
289
+ const sessions = await sessionRepo.getUserSessions(userId, config);
290
+ await Promise.all(sessions.map(s => sessionRepo.deleteSession(s.sessionId, config)));
291
+ // Delete the user
292
+ await adapter.deleteUser(userId);
293
+ eventBus.emit('security.auth.account.deleted', { userId });
294
+ eventBus.emit('auth:user.deleted', { userId });
295
+ if (hooks.postDeleteAccount) {
296
+ Promise.resolve()
297
+ .then(() => hooks.postDeleteAccount({ userId }))
298
+ .catch(e => console.error('[lifecycle] postDeleteAccount hook error:', e instanceof Error ? e.message : String(e)));
299
+ }
300
+ };
301
+ export const logout = async (token, runtime) => {
302
+ if (token) {
303
+ const payload = await verifyToken(token, runtime.config, runtime.signing);
304
+ const sessionId = payload.sid;
305
+ const userId = payload.sub;
306
+ if (sessionId) {
307
+ await runtime.repos.session.deleteSession(sessionId, runtime.config);
308
+ runtime.eventBus.emit('security.auth.logout', { sessionId, userId });
309
+ if (userId) {
310
+ runtime.eventBus.emit('auth:logout', { userId, sessionId });
311
+ }
312
+ }
313
+ }
314
+ };
315
+ export const passkeyLogin = async (passkeyToken, assertionResponse, runtime, metadata, hookContext) => {
316
+ const { adapter, config, eventBus } = runtime;
317
+ if (!adapter.findUserByWebAuthnCredentialId || !adapter.getWebAuthnCredentials) {
318
+ throw new HttpError(501, 'Auth adapter does not support passkey login');
319
+ }
320
+ const { consumePasskeyLoginChallenge } = await import('../lib/mfaChallenge');
321
+ const challengeData = await consumePasskeyLoginChallenge(runtime.repos.mfaChallenge, passkeyToken);
322
+ if (!challengeData) {
323
+ throw new HttpError(401, 'Invalid or expired passkey token');
324
+ }
325
+ const credentialId = assertionResponse?.id;
326
+ if (!credentialId ||
327
+ typeof credentialId !== 'string' ||
328
+ credentialId.length === 0 ||
329
+ credentialId.length > 2048) {
330
+ throw new HttpError(401, 'Invalid assertion response');
331
+ }
332
+ const userId = await adapter.findUserByWebAuthnCredentialId(credentialId);
333
+ if (!userId) {
334
+ throw new HttpError(401, 'Invalid credentials');
335
+ }
336
+ const { verifyWebAuthn } = await import('../services/mfa');
337
+ const verified = await verifyWebAuthn(userId, assertionResponse, challengeData.webauthnChallenge, runtime);
338
+ if (!verified) {
339
+ throw new HttpError(401, 'WebAuthn verification failed');
340
+ }
341
+ const fullUser = adapter.getUser ? await adapter.getUser(userId) : null;
342
+ await runPreLoginHook(fullUser?.email ?? userId, runtime, hookContext);
343
+ // Check suspension
344
+ const suspensionStatus = await getSuspended(adapter, userId);
345
+ if (suspensionStatus.suspended) {
346
+ throw new HttpError(403, 'Account suspended', 'ACCOUNT_SUSPENDED');
347
+ }
348
+ // passkeyMfaBypass=true (default): passkey with userVerification=required satisfies both factors
349
+ const mfaBypass = config.mfa?.webauthn?.passkeyMfaBypass ?? true;
350
+ if (!mfaBypass && config.mfa && adapter.isMfaEnabled && (await adapter.isMfaEnabled(userId))) {
351
+ const methods = adapter.getMfaMethods ? await adapter.getMfaMethods(userId) : ['totp'];
352
+ let emailOtpHash;
353
+ const emailOtpConfig = config.mfa?.emailOtp ?? null;
354
+ if (methods.includes('emailOtp') && emailOtpConfig) {
355
+ const { generateEmailOtpCode } = await import('../services/mfa');
356
+ const { code, hash } = generateEmailOtpCode(runtime);
357
+ emailOtpHash = hash;
358
+ const fullUser = adapter.getUser ? await adapter.getUser(userId) : null;
359
+ if (fullUser?.email)
360
+ eventBus.emit('auth:delivery.email_otp', { email: fullUser.email, code });
361
+ }
362
+ let webauthnChallenge2;
363
+ let webauthnOptions;
364
+ if (methods.includes('webauthn') && (config.mfa?.webauthn ?? null)) {
365
+ const { generateWebAuthnAuthenticationOptions } = await import('../services/mfa');
366
+ const result = await generateWebAuthnAuthenticationOptions(userId, runtime);
367
+ if (result) {
368
+ webauthnChallenge2 = result.challenge;
369
+ webauthnOptions = result.options;
370
+ }
371
+ }
372
+ const mfaToken = await createMfaChallenge(runtime.repos.mfaChallenge, userId, { emailOtpHash, webauthnChallenge: webauthnChallenge2 }, config);
373
+ return { token: '', userId, mfaRequired: true, mfaToken, mfaMethods: methods, webauthnOptions };
374
+ }
375
+ const { token, refreshToken, sessionId } = await createSessionForUser(userId, runtime, metadata, hookContext);
376
+ emitLoginSuccess(userId, sessionId, runtime);
377
+ return { token, userId, email: fullUser?.email, refreshToken };
378
+ };
@@ -1,15 +1,16 @@
1
+ import type { AuthRuntimeContext } from '../runtime';
1
2
  export interface MfaSetupResult {
2
3
  secret: string;
3
4
  uri: string;
4
5
  }
5
- export declare const setupMfa: (userId: string) => Promise<MfaSetupResult>;
6
- export declare const verifySetup: (userId: string, code: string) => Promise<string[]>;
7
- export declare const verifyTotp: (userId: string, code: string) => Promise<boolean>;
8
- export declare const verifyRecoveryCode: (userId: string, code: string) => Promise<boolean>;
9
- export declare const disableMfa: (userId: string, code: string) => Promise<void>;
10
- export declare const regenerateRecoveryCodes: (userId: string, code: string) => Promise<string[]>;
6
+ export declare const setupMfa: (userId: string, runtime: AuthRuntimeContext) => Promise<MfaSetupResult>;
7
+ export declare const verifySetup: (userId: string, code: string, runtime: AuthRuntimeContext) => Promise<string[]>;
8
+ export declare const verifyTotp: (userId: string, code: string, runtime: AuthRuntimeContext) => Promise<boolean>;
9
+ export declare const verifyRecoveryCode: (userId: string, code: string, runtime: AuthRuntimeContext) => Promise<boolean>;
10
+ export declare const disableMfa: (userId: string, code: string, runtime: AuthRuntimeContext) => Promise<void>;
11
+ export declare const regenerateRecoveryCodes: (userId: string, code: string, runtime: AuthRuntimeContext) => Promise<string[]>;
11
12
  /** Generate a cryptographically random numeric OTP code. Returns { code, hash }. */
12
- export declare const generateEmailOtpCode: (length?: number) => {
13
+ export declare const generateEmailOtpCode: (runtime: AuthRuntimeContext, length?: number) => {
13
14
  code: string;
14
15
  hash: string;
15
16
  };
@@ -19,12 +20,12 @@ export declare const verifyEmailOtp: (emailOtpHash: string, code: string) => boo
19
20
  * Initiate email OTP setup: sends a verification code to the user's email.
20
21
  * Returns a setup challenge token that must be confirmed via confirmEmailOtp.
21
22
  */
22
- export declare const initiateEmailOtp: (userId: string) => Promise<string>;
23
+ export declare const initiateEmailOtp: (userId: string, runtime: AuthRuntimeContext) => Promise<string>;
23
24
  /**
24
25
  * Confirm email OTP setup: verifies the code sent during initiateEmailOtp.
25
26
  * Enables email OTP as an MFA method. Returns recovery codes if MFA was not previously active.
26
27
  */
27
- export declare const confirmEmailOtp: (userId: string, setupToken: string, code: string) => Promise<string[] | null>;
28
+ export declare const confirmEmailOtp: (userId: string, setupToken: string, code: string, runtime: AuthRuntimeContext) => Promise<string[] | null>;
28
29
  /**
29
30
  * Disable email OTP for a user.
30
31
  * If TOTP is also enabled, requires a TOTP code. Otherwise requires password.
@@ -32,9 +33,9 @@ export declare const confirmEmailOtp: (userId: string, setupToken: string, code:
32
33
  export declare const disableEmailOtp: (userId: string, params: {
33
34
  code?: string;
34
35
  password?: string;
35
- }) => Promise<void>;
36
+ }, runtime: AuthRuntimeContext) => Promise<void>;
36
37
  /** Get the MFA methods enabled for a user. */
37
- export declare const getMfaMethods: (userId: string) => Promise<string[]>;
38
+ export declare const getMfaMethods: (userId: string, runtime: AuthRuntimeContext) => Promise<string[]>;
38
39
  /**
39
40
  * Eager startup check — call at route mount time to fail fast if the peer dependency is missing.
40
41
  */
@@ -43,7 +44,7 @@ export declare const assertWebAuthnDependency: () => Promise<void>;
43
44
  * Generate WebAuthn authentication options for the login MFA flow.
44
45
  * Called from auth.ts login when the user has "webauthn" in their methods.
45
46
  */
46
- export declare const generateWebAuthnAuthenticationOptions: (userId: string) => Promise<{
47
+ export declare const generateWebAuthnAuthenticationOptions: (userId: string, runtime: AuthRuntimeContext) => Promise<{
47
48
  challenge: string;
48
49
  options: Record<string, unknown>;
49
50
  } | null>;
@@ -51,7 +52,7 @@ export declare const generateWebAuthnAuthenticationOptions: (userId: string) =>
51
52
  * Initiate WebAuthn registration: generates registration options for the client.
52
53
  * Returns options + a registration challenge token.
53
54
  */
54
- export declare const initiateWebAuthnRegistration: (userId: string) => Promise<{
55
+ export declare const initiateWebAuthnRegistration: (userId: string, runtime: AuthRuntimeContext) => Promise<{
55
56
  options: Record<string, unknown>;
56
57
  registrationToken: string;
57
58
  }>;
@@ -59,14 +60,14 @@ export declare const initiateWebAuthnRegistration: (userId: string) => Promise<{
59
60
  * Complete WebAuthn registration: verifies attestation and stores the credential.
60
61
  * Returns recovery codes if this is the first MFA method.
61
62
  */
62
- export declare const completeWebAuthnRegistration: (userId: string, registrationToken: string, attestationResponse: any, name?: string) => Promise<{
63
+ export declare const completeWebAuthnRegistration: (userId: string, registrationToken: string, attestationResponse: any, runtime: AuthRuntimeContext, name?: string) => Promise<{
63
64
  credentialId: string;
64
65
  recoveryCodes: string[] | null;
65
66
  }>;
66
67
  /**
67
68
  * Verify a WebAuthn authentication assertion during login MFA.
68
69
  */
69
- export declare const verifyWebAuthn: (userId: string, assertionResponse: any, expectedChallenge: string) => Promise<boolean>;
70
+ export declare const verifyWebAuthn: (userId: string, assertionResponse: any, expectedChallenge: string, runtime: AuthRuntimeContext) => Promise<boolean>;
70
71
  /**
71
72
  * Remove a single WebAuthn credential.
72
73
  * Only requires identity verification when removing the last credential of the last MFA method.
@@ -74,11 +75,34 @@ export declare const verifyWebAuthn: (userId: string, assertionResponse: any, ex
74
75
  export declare const removeWebAuthnCredential: (userId: string, credentialId: string, params: {
75
76
  code?: string;
76
77
  password?: string;
77
- }) => Promise<void>;
78
+ }, runtime: AuthRuntimeContext) => Promise<void>;
78
79
  /**
79
80
  * Disable WebAuthn entirely: removes all credentials and the method.
80
81
  */
81
82
  export declare const disableWebAuthn: (userId: string, params: {
82
83
  code?: string;
83
84
  password?: string;
84
- }) => Promise<void>;
85
+ }, runtime: AuthRuntimeContext) => Promise<void>;
86
+ /**
87
+ * Verify any supported authentication factor for a given user + session.
88
+ * Used by step-up, account deletion, and MFA disable flows.
89
+ *
90
+ * - "totp": TOTP code
91
+ * - "recovery": recovery code (only when method is explicitly "recovery")
92
+ * - "password": account password
93
+ * - "emailOtp": email OTP via reauth challenge token
94
+ * - "webauthn": WebAuthn assertion via reauth challenge token
95
+ *
96
+ * Hard boundaries:
97
+ * - "recovery" is ONLY checked when method is explicitly "recovery"
98
+ * - emailOtp / webauthn consume a reauth challenge bound to sessionId
99
+ *
100
+ * Returns false (never throws) when required params are missing.
101
+ */
102
+ export declare function verifyAnyFactor(userId: string, sessionId: string, runtime: AuthRuntimeContext, params: {
103
+ method?: 'totp' | 'emailOtp' | 'webauthn' | 'password' | 'recovery';
104
+ code?: string;
105
+ password?: string;
106
+ reauthToken?: string;
107
+ webauthnResponse?: object;
108
+ }): Promise<boolean>;