@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.
Files changed (725) 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/packages/bunshot-auth/src/lib/breachedPassword.d.ts +19 -0
  68. package/dist/packages/bunshot-auth/src/lib/breachedPassword.js +61 -0
  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/packages/bunshot-auth/src/lib/logger.d.ts +3 -0
  93. package/dist/packages/bunshot-auth/src/lib/logger.js +13 -0
  94. package/dist/packages/bunshot-auth/src/lib/m2m.d.ts +30 -0
  95. package/dist/packages/bunshot-auth/src/lib/m2m.js +44 -0
  96. package/dist/packages/bunshot-auth/src/lib/magicLink.d.ts +13 -0
  97. package/dist/packages/bunshot-auth/src/lib/magicLink.js +145 -0
  98. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.d.ts +60 -0
  99. package/dist/packages/bunshot-auth/src/lib/mfaChallenge.js +419 -0
  100. package/dist/packages/bunshot-auth/src/lib/oauth.d.ts +82 -0
  101. package/dist/packages/bunshot-auth/src/lib/oauth.js +177 -0
  102. package/dist/packages/bunshot-auth/src/lib/oauthCode.d.ts +19 -0
  103. package/dist/packages/bunshot-auth/src/lib/oauthCode.js +182 -0
  104. package/dist/packages/bunshot-auth/src/lib/oauthReauth.d.ts +19 -0
  105. package/dist/packages/bunshot-auth/src/lib/oauthReauth.js +255 -0
  106. package/dist/packages/bunshot-auth/src/lib/organization.d.ts +66 -0
  107. package/dist/packages/bunshot-auth/src/lib/organization.js +225 -0
  108. package/dist/packages/bunshot-auth/src/lib/passwordHistory.d.ts +12 -0
  109. package/dist/packages/bunshot-auth/src/lib/passwordHistory.js +31 -0
  110. package/dist/packages/bunshot-auth/src/lib/resetPassword.d.ts +20 -0
  111. package/dist/packages/bunshot-auth/src/lib/resetPassword.js +148 -0
  112. package/dist/packages/bunshot-auth/src/lib/roles.d.ts +9 -0
  113. package/dist/packages/bunshot-auth/src/lib/roles.js +93 -0
  114. package/dist/packages/bunshot-auth/src/lib/saml.d.ts +29 -0
  115. package/dist/packages/bunshot-auth/src/lib/saml.js +73 -0
  116. package/dist/packages/bunshot-auth/src/lib/samlRequestId.d.ts +13 -0
  117. package/dist/packages/bunshot-auth/src/lib/samlRequestId.js +129 -0
  118. package/dist/packages/bunshot-auth/src/lib/scim.d.ts +44 -0
  119. package/dist/packages/bunshot-auth/src/lib/scim.js +56 -0
  120. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.d.ts +22 -0
  121. package/dist/packages/bunshot-auth/src/lib/securityEventWiring.js +65 -0
  122. package/dist/packages/bunshot-auth/src/lib/session.d.ts +45 -0
  123. package/dist/packages/bunshot-auth/src/lib/session.js +1211 -0
  124. package/dist/packages/bunshot-auth/src/lib/storeInfra.d.ts +26 -0
  125. package/dist/packages/bunshot-auth/src/lib/storeInfra.js +18 -0
  126. package/dist/packages/bunshot-auth/src/lib/suspension.d.ts +14 -0
  127. package/dist/packages/bunshot-auth/src/lib/suspension.js +20 -0
  128. package/dist/packages/bunshot-auth/src/lib/validateAdapter.d.ts +16 -0
  129. package/dist/packages/bunshot-auth/src/lib/validateAdapter.js +161 -0
  130. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.d.ts +13 -0
  131. package/dist/packages/bunshot-auth/src/middleware/bearerAuth.js +58 -0
  132. package/dist/{middleware → packages/bunshot-auth/src/middleware}/csrf.d.ts +5 -4
  133. package/dist/packages/bunshot-auth/src/middleware/csrf.js +138 -0
  134. package/dist/packages/bunshot-auth/src/middleware/identify.d.ts +4 -0
  135. package/dist/packages/bunshot-auth/src/middleware/identify.js +124 -0
  136. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.d.ts +2 -2
  137. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireMfaSetup.js +10 -7
  138. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.d.ts +2 -2
  139. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireRole.js +20 -16
  140. package/dist/packages/bunshot-auth/src/middleware/requireScope.d.ts +10 -0
  141. package/dist/packages/bunshot-auth/src/middleware/requireScope.js +25 -0
  142. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.d.ts +18 -0
  143. package/dist/packages/bunshot-auth/src/middleware/requireStepUp.js +30 -0
  144. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.d.ts +2 -2
  145. package/dist/{middleware → packages/bunshot-auth/src/middleware}/requireVerifiedEmail.js +7 -6
  146. package/dist/packages/bunshot-auth/src/middleware/scimAuth.d.ts +8 -0
  147. package/dist/packages/bunshot-auth/src/middleware/scimAuth.js +29 -0
  148. package/dist/packages/bunshot-auth/src/middleware/userAuth.d.ts +3 -0
  149. package/dist/packages/bunshot-auth/src/middleware/userAuth.js +6 -0
  150. package/dist/{models → packages/bunshot-auth/src/models}/AuthUser.d.ts +19 -8
  151. package/dist/packages/bunshot-auth/src/models/AuthUser.js +53 -0
  152. package/dist/packages/bunshot-auth/src/models/Group.d.ts +19 -0
  153. package/dist/packages/bunshot-auth/src/models/Group.js +22 -0
  154. package/dist/{models → packages/bunshot-auth/src/models}/GroupMembership.d.ts +6 -8
  155. package/dist/packages/bunshot-auth/src/models/GroupMembership.js +19 -0
  156. package/dist/packages/bunshot-auth/src/models/M2MClient.d.ts +18 -0
  157. package/dist/packages/bunshot-auth/src/models/M2MClient.js +18 -0
  158. package/dist/packages/bunshot-auth/src/models/TenantRole.d.ts +13 -0
  159. package/dist/packages/bunshot-auth/src/models/TenantRole.js +17 -0
  160. package/dist/packages/bunshot-auth/src/plugin.d.ts +4 -0
  161. package/dist/packages/bunshot-auth/src/plugin.js +274 -0
  162. package/dist/packages/bunshot-auth/src/routes/auth.d.ts +15 -0
  163. package/dist/packages/bunshot-auth/src/routes/auth.js +1624 -0
  164. package/dist/packages/bunshot-auth/src/routes/groups.d.ts +4 -0
  165. package/dist/packages/bunshot-auth/src/routes/groups.js +481 -0
  166. package/dist/packages/bunshot-auth/src/routes/m2m.d.ts +2 -0
  167. package/dist/packages/bunshot-auth/src/routes/m2m.js +145 -0
  168. package/dist/packages/bunshot-auth/src/routes/mfa.d.ts +6 -0
  169. package/dist/packages/bunshot-auth/src/routes/mfa.js +991 -0
  170. package/dist/packages/bunshot-auth/src/routes/oauth.d.ts +3 -0
  171. package/dist/packages/bunshot-auth/src/routes/oauth.js +1727 -0
  172. package/dist/packages/bunshot-auth/src/routes/oidc.d.ts +2 -0
  173. package/dist/packages/bunshot-auth/src/routes/oidc.js +84 -0
  174. package/dist/packages/bunshot-auth/src/routes/organizations.d.ts +3 -0
  175. package/dist/packages/bunshot-auth/src/routes/organizations.js +741 -0
  176. package/dist/packages/bunshot-auth/src/routes/passkey.d.ts +2 -0
  177. package/dist/packages/bunshot-auth/src/routes/passkey.js +199 -0
  178. package/dist/packages/bunshot-auth/src/routes/saml.d.ts +2 -0
  179. package/dist/packages/bunshot-auth/src/routes/saml.js +226 -0
  180. package/dist/packages/bunshot-auth/src/routes/scim.d.ts +3 -0
  181. package/dist/packages/bunshot-auth/src/routes/scim.js +588 -0
  182. package/dist/packages/bunshot-auth/src/runtime.d.ts +52 -0
  183. package/dist/packages/bunshot-auth/src/runtime.js +11 -0
  184. package/dist/{schemas → packages/bunshot-auth/src/schemas}/auth.d.ts +4 -5
  185. package/dist/packages/bunshot-auth/src/schemas/auth.js +24 -0
  186. package/dist/packages/bunshot-auth/src/schemas/error.d.ts +10 -0
  187. package/dist/packages/bunshot-auth/src/schemas/error.js +10 -0
  188. package/dist/packages/bunshot-auth/src/schemas/success.d.ts +10 -0
  189. package/dist/packages/bunshot-auth/src/schemas/success.js +10 -0
  190. package/dist/packages/bunshot-auth/src/services/auth.d.ts +39 -0
  191. package/dist/packages/bunshot-auth/src/services/auth.js +378 -0
  192. package/dist/{services → packages/bunshot-auth/src/services}/mfa.d.ts +41 -17
  193. package/dist/{services → packages/bunshot-auth/src/services}/mfa.js +259 -183
  194. package/dist/packages/bunshot-auth/src/testing.d.ts +31 -0
  195. package/dist/packages/bunshot-auth/src/testing.js +23 -0
  196. package/dist/packages/bunshot-auth/src/types/adapter.d.ts +1 -0
  197. package/dist/packages/bunshot-auth/src/types/adapter.js +1 -0
  198. package/dist/packages/bunshot-auth/src/types/config.d.ts +152 -0
  199. package/dist/packages/bunshot-auth/src/types/config.js +179 -0
  200. package/dist/{routes → packages/bunshot-auth/src/types}/groups.d.ts +2 -3
  201. package/dist/packages/bunshot-auth/src/types/groups.js +1 -0
  202. package/dist/packages/bunshot-auth/src/types/oauthCode.d.ts +6 -0
  203. package/dist/packages/bunshot-auth/src/types/oauthCode.js +1 -0
  204. package/dist/packages/bunshot-auth/src/types/oauthReauth.d.ts +13 -0
  205. package/dist/packages/bunshot-auth/src/types/oauthReauth.js +1 -0
  206. package/dist/packages/bunshot-auth/src/types/redis.d.ts +1 -0
  207. package/dist/packages/bunshot-auth/src/types/redis.js +1 -0
  208. package/dist/packages/bunshot-auth/src/types/saml.d.ts +10 -0
  209. package/dist/packages/bunshot-auth/src/types/saml.js +1 -0
  210. package/dist/packages/bunshot-auth/src/types/session.d.ts +18 -0
  211. package/dist/packages/bunshot-auth/src/types/session.js +1 -0
  212. package/dist/packages/bunshot-auth/src/types/store.d.ts +1 -0
  213. package/dist/packages/bunshot-auth/src/types/store.js +1 -0
  214. package/dist/packages/bunshot-core/src/adminProvider.d.ts +95 -0
  215. package/dist/packages/bunshot-core/src/adminProvider.js +1 -0
  216. package/dist/packages/bunshot-core/src/auditLog.d.ts +34 -0
  217. package/dist/packages/bunshot-core/src/auditLog.js +1 -0
  218. package/dist/packages/bunshot-core/src/auth-adapter.d.ts +227 -0
  219. package/dist/packages/bunshot-core/src/auth-adapter.js +4 -0
  220. package/dist/packages/bunshot-core/src/authVariables.d.ts +14 -0
  221. package/dist/packages/bunshot-core/src/authVariables.js +4 -0
  222. package/dist/packages/bunshot-core/src/cache.d.ts +12 -0
  223. package/dist/packages/bunshot-core/src/cache.js +21 -0
  224. package/dist/packages/bunshot-core/src/captcha.d.ts +16 -0
  225. package/dist/packages/bunshot-core/src/captcha.js +1 -0
  226. package/dist/packages/bunshot-core/src/clearRegistry.d.ts +6 -0
  227. package/dist/packages/bunshot-core/src/clearRegistry.js +17 -0
  228. package/dist/packages/bunshot-core/src/clientIp.d.ts +3 -0
  229. package/dist/packages/bunshot-core/src/clientIp.js +45 -0
  230. package/dist/packages/bunshot-core/src/configLock.d.ts +4 -0
  231. package/dist/packages/bunshot-core/src/configLock.js +7 -0
  232. package/dist/packages/bunshot-core/src/configValidation.d.ts +22 -0
  233. package/dist/packages/bunshot-core/src/configValidation.js +39 -0
  234. package/dist/packages/bunshot-core/src/constants.js +10 -0
  235. package/dist/packages/bunshot-core/src/context/bunshotContext.d.ts +232 -0
  236. package/dist/packages/bunshot-core/src/context/bunshotContext.js +1 -0
  237. package/dist/packages/bunshot-core/src/context/contextAccess.d.ts +3 -0
  238. package/dist/packages/bunshot-core/src/context/contextAccess.js +16 -0
  239. package/dist/packages/bunshot-core/src/context/contextStore.d.ts +16 -0
  240. package/dist/packages/bunshot-core/src/context/contextStore.js +31 -0
  241. package/dist/packages/bunshot-core/src/context/frameworkConfig.d.ts +38 -0
  242. package/dist/packages/bunshot-core/src/context/frameworkConfig.js +1 -0
  243. package/dist/packages/bunshot-core/src/context/index.d.ts +4 -0
  244. package/dist/packages/bunshot-core/src/context/index.js +2 -0
  245. package/dist/packages/bunshot-core/src/context.d.ts +40 -0
  246. package/dist/packages/bunshot-core/src/context.js +35 -0
  247. package/dist/packages/bunshot-core/src/coreContracts.d.ts +47 -0
  248. package/dist/packages/bunshot-core/src/coreContracts.js +1 -0
  249. package/dist/packages/bunshot-core/src/coreRegistrar.d.ts +6 -0
  250. package/dist/packages/bunshot-core/src/coreRegistrar.js +42 -0
  251. package/dist/{lib → packages/bunshot-core/src}/createRoute.d.ts +4 -30
  252. package/dist/{lib → packages/bunshot-core/src}/createRoute.js +39 -88
  253. package/dist/packages/bunshot-core/src/cronRegistry.d.ts +11 -0
  254. package/dist/packages/bunshot-core/src/cronRegistry.js +1 -0
  255. package/dist/packages/bunshot-core/src/crypto.d.ts +43 -0
  256. package/dist/packages/bunshot-core/src/crypto.js +74 -0
  257. package/dist/packages/bunshot-core/src/csrf.d.ts +8 -0
  258. package/dist/packages/bunshot-core/src/csrf.js +1 -0
  259. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.d.ts +7 -0
  260. package/dist/packages/bunshot-core/src/defaults/defaultFingerprint.js +19 -0
  261. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.d.ts +6 -0
  262. package/dist/packages/bunshot-core/src/defaults/memoryCacheAdapter.js +40 -0
  263. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.d.ts +6 -0
  264. package/dist/packages/bunshot-core/src/defaults/memoryRateLimit.js +24 -0
  265. package/dist/packages/bunshot-core/src/emailTemplates.d.ts +5 -0
  266. package/dist/packages/bunshot-core/src/emailTemplates.js +10 -0
  267. package/dist/packages/bunshot-core/src/errors.d.ts +13 -0
  268. package/dist/packages/bunshot-core/src/errors.js +22 -0
  269. package/dist/packages/bunshot-core/src/eventBus.d.ts +270 -0
  270. package/dist/packages/bunshot-core/src/eventBus.js +143 -0
  271. package/dist/packages/bunshot-core/src/idempotency.d.ts +18 -0
  272. package/dist/packages/bunshot-core/src/idempotency.js +1 -0
  273. package/dist/packages/bunshot-core/src/index.d.ts +60 -0
  274. package/dist/packages/bunshot-core/src/index.js +34 -0
  275. package/dist/packages/bunshot-core/src/mail.d.ts +14 -0
  276. package/dist/packages/bunshot-core/src/mail.js +8 -0
  277. package/dist/packages/bunshot-core/src/memoryEviction.d.ts +24 -0
  278. package/dist/packages/bunshot-core/src/memoryEviction.js +52 -0
  279. package/dist/packages/bunshot-core/src/pagination.d.ts +45 -0
  280. package/dist/packages/bunshot-core/src/pagination.js +61 -0
  281. package/dist/packages/bunshot-core/src/permissions.d.ts +64 -0
  282. package/dist/packages/bunshot-core/src/permissions.js +27 -0
  283. package/dist/packages/bunshot-core/src/plugin.d.ts +44 -0
  284. package/dist/packages/bunshot-core/src/plugin.js +1 -0
  285. package/dist/packages/bunshot-core/src/rateLimit.d.ts +5 -0
  286. package/dist/packages/bunshot-core/src/rateLimit.js +18 -0
  287. package/dist/packages/bunshot-core/src/redis.d.ts +21 -0
  288. package/dist/packages/bunshot-core/src/redis.js +1 -0
  289. package/dist/packages/bunshot-core/src/routeAuth.d.ts +5 -0
  290. package/dist/packages/bunshot-core/src/routeAuth.js +11 -0
  291. package/dist/packages/bunshot-core/src/routeOverrides.d.ts +24 -0
  292. package/dist/packages/bunshot-core/src/routeOverrides.js +25 -0
  293. package/dist/packages/bunshot-core/src/routerAdapter.d.ts +6 -0
  294. package/dist/packages/bunshot-core/src/routerAdapter.js +56 -0
  295. package/dist/packages/bunshot-core/src/secrets.d.ts +48 -0
  296. package/dist/packages/bunshot-core/src/secrets.js +8 -0
  297. package/dist/packages/bunshot-core/src/signing.d.ts +41 -0
  298. package/dist/packages/bunshot-core/src/signing.js +1 -0
  299. package/dist/packages/bunshot-core/src/sse.d.ts +36 -0
  300. package/dist/packages/bunshot-core/src/sse.js +1 -0
  301. package/dist/packages/bunshot-core/src/storageAdapter.js +1 -0
  302. package/dist/packages/bunshot-core/src/storeInfra.d.ts +44 -0
  303. package/dist/packages/bunshot-core/src/storeInfra.js +18 -0
  304. package/dist/packages/bunshot-core/src/storeType.d.ts +7 -0
  305. package/dist/packages/bunshot-core/src/storeType.js +1 -0
  306. package/dist/packages/bunshot-core/src/testing.d.ts +1 -0
  307. package/dist/packages/bunshot-core/src/testing.js +1 -0
  308. package/dist/packages/bunshot-core/src/uploadRegistry.d.ts +23 -0
  309. package/dist/packages/bunshot-core/src/uploadRegistry.js +4 -0
  310. package/dist/packages/bunshot-core/src/userResolver.d.ts +5 -0
  311. package/dist/packages/bunshot-core/src/userResolver.js +14 -0
  312. package/dist/packages/bunshot-core/src/wsMessages.d.ts +42 -0
  313. package/dist/packages/bunshot-core/src/wsMessages.js +4 -0
  314. package/dist/packages/bunshot-permissions/src/adapters/memory.d.ts +7 -0
  315. package/dist/packages/bunshot-permissions/src/adapters/memory.js +73 -0
  316. package/dist/packages/bunshot-permissions/src/index.d.ts +10 -0
  317. package/dist/packages/bunshot-permissions/src/index.js +5 -0
  318. package/dist/packages/bunshot-permissions/src/lib/bootstrap.d.ts +7 -0
  319. package/dist/packages/bunshot-permissions/src/lib/bootstrap.js +12 -0
  320. package/dist/packages/bunshot-permissions/src/lib/evaluator.d.ts +10 -0
  321. package/dist/packages/bunshot-permissions/src/lib/evaluator.js +165 -0
  322. package/dist/packages/bunshot-permissions/src/lib/registry.d.ts +2 -0
  323. package/dist/packages/bunshot-permissions/src/lib/registry.js +31 -0
  324. package/dist/packages/bunshot-permissions/src/lib/validation.d.ts +1 -0
  325. package/dist/packages/bunshot-permissions/src/lib/validation.js +1 -0
  326. package/dist/packages/bunshot-permissions/src/types/adapter.d.ts +1 -0
  327. package/dist/packages/bunshot-permissions/src/types/adapter.js +1 -0
  328. package/dist/packages/bunshot-permissions/src/types/evaluator.d.ts +1 -0
  329. package/dist/packages/bunshot-permissions/src/types/evaluator.js +1 -0
  330. package/dist/packages/bunshot-permissions/src/types/models.d.ts +1 -0
  331. package/dist/packages/bunshot-permissions/src/types/models.js +1 -0
  332. package/dist/packages/bunshot-permissions/src/types/registry.d.ts +1 -0
  333. package/dist/packages/bunshot-permissions/src/types/registry.js +1 -0
  334. package/dist/packages/bunshot-postgres/src/adapter.d.ts +6 -0
  335. package/dist/packages/bunshot-postgres/src/adapter.js +794 -0
  336. package/dist/packages/bunshot-postgres/src/connection.d.ts +15 -0
  337. package/dist/packages/bunshot-postgres/src/connection.js +16 -0
  338. package/dist/packages/bunshot-postgres/src/index.d.ts +4 -0
  339. package/dist/packages/bunshot-postgres/src/index.js +2 -0
  340. package/dist/packages/bunshot-postgres/src/schema.d.ts +997 -0
  341. package/dist/packages/bunshot-postgres/src/schema.js +105 -0
  342. package/dist/src/app.d.ts +230 -0
  343. package/dist/src/app.js +182 -0
  344. package/dist/src/cli/commands/init.d.ts +10 -0
  345. package/dist/src/cli/commands/init.js +709 -0
  346. package/dist/src/cli/index.d.ts +1 -0
  347. package/dist/src/cli/index.js +3 -0
  348. package/dist/src/entrypoints/mongo.d.ts +6 -0
  349. package/dist/src/entrypoints/mongo.js +4 -0
  350. package/dist/src/entrypoints/queue.d.ts +2 -0
  351. package/dist/src/entrypoints/queue.js +1 -0
  352. package/dist/src/entrypoints/redis.d.ts +1 -0
  353. package/dist/src/entrypoints/redis.js +1 -0
  354. package/dist/{adapters → src/framework/adapters}/localStorage.d.ts +1 -1
  355. package/dist/{adapters → src/framework/adapters}/localStorage.js +23 -8
  356. package/dist/src/framework/adapters/memoryStorage.d.ts +2 -0
  357. package/dist/src/framework/adapters/memoryStorage.js +45 -0
  358. package/dist/{adapters → src/framework/adapters}/s3Storage.d.ts +1 -1
  359. package/dist/{adapters → src/framework/adapters}/s3Storage.js +12 -12
  360. package/dist/src/framework/admin/bunshotAccess.d.ts +2 -0
  361. package/dist/src/framework/admin/bunshotAccess.js +23 -0
  362. package/dist/src/framework/admin/bunshotUsers.d.ts +2 -0
  363. package/dist/src/framework/admin/bunshotUsers.js +103 -0
  364. package/dist/src/framework/admin/index.d.ts +7 -0
  365. package/dist/src/framework/admin/index.js +21 -0
  366. package/dist/src/framework/boundaryAdapters/cacheFactories.d.ts +13 -0
  367. package/dist/src/framework/boundaryAdapters/cacheFactories.js +86 -0
  368. package/dist/src/framework/boundaryAdapters/index.d.ts +2 -0
  369. package/dist/src/framework/boundaryAdapters/index.js +1 -0
  370. package/dist/src/framework/boundaryAdapters.d.ts +17 -0
  371. package/dist/src/framework/boundaryAdapters.js +62 -0
  372. package/dist/src/framework/buildContext.d.ts +33 -0
  373. package/dist/src/framework/buildContext.js +119 -0
  374. package/dist/src/framework/config/schema.d.ts +447 -0
  375. package/dist/src/framework/config/schema.js +528 -0
  376. package/dist/src/framework/createInfrastructure.d.ts +76 -0
  377. package/dist/src/framework/createInfrastructure.js +221 -0
  378. package/dist/src/framework/lib/auditLog.d.ts +23 -0
  379. package/dist/src/framework/lib/auditLog.js +416 -0
  380. package/dist/src/framework/lib/captcha.d.ts +11 -0
  381. package/dist/src/framework/lib/captcha.js +40 -0
  382. package/dist/{lib → src/framework/lib}/createDtoMapper.js +4 -4
  383. package/dist/src/framework/lib/createRoute.d.ts +1 -0
  384. package/dist/src/framework/lib/createRoute.js +2 -0
  385. package/dist/{lib → src/framework/lib}/idempotency.d.ts +2 -6
  386. package/dist/src/framework/lib/idempotency.js +74 -0
  387. package/dist/src/framework/lib/logger.d.ts +3 -0
  388. package/dist/src/framework/lib/logger.js +14 -0
  389. package/dist/src/framework/lib/metrics.d.ts +34 -0
  390. package/dist/{lib → src/framework/lib}/metrics.js +49 -57
  391. package/dist/src/framework/lib/pagination.d.ts +42 -0
  392. package/dist/src/framework/lib/pagination.js +51 -0
  393. package/dist/src/framework/lib/redisTransport.d.ts +38 -0
  394. package/dist/src/framework/lib/redisTransport.js +107 -0
  395. package/dist/src/framework/lib/resolveUserId.d.ts +2 -0
  396. package/dist/src/framework/lib/resolveUserId.js +5 -0
  397. package/dist/src/framework/lib/sseCollision.d.ts +6 -0
  398. package/dist/src/framework/lib/sseCollision.js +26 -0
  399. package/dist/src/framework/lib/storageAdapter.d.ts +1 -0
  400. package/dist/src/framework/lib/storageAdapter.js +1 -0
  401. package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.js +4 -4
  402. package/dist/src/framework/lib/tenant.d.ts +21 -0
  403. package/dist/src/framework/lib/tenant.js +70 -0
  404. package/dist/{lib → src/framework/lib}/upload.d.ts +14 -9
  405. package/dist/src/framework/lib/upload.js +132 -0
  406. package/dist/src/framework/lib/uploadRegistry.d.ts +23 -0
  407. package/dist/src/framework/lib/uploadRegistry.js +34 -0
  408. package/dist/{lib → src/framework/lib}/validate.d.ts +1 -1
  409. package/dist/{lib → src/framework/lib}/validate.js +2 -2
  410. package/dist/src/framework/lib/ws.d.ts +19 -0
  411. package/dist/src/framework/lib/ws.js +130 -0
  412. package/dist/src/framework/lib/wsHeartbeat.d.ts +12 -0
  413. package/dist/src/framework/lib/wsHeartbeat.js +53 -0
  414. package/dist/src/framework/lib/wsMessages.d.ts +25 -0
  415. package/dist/src/framework/lib/wsMessages.js +45 -0
  416. package/dist/src/framework/lib/wsNamespace.d.ts +17 -0
  417. package/dist/src/framework/lib/wsNamespace.js +19 -0
  418. package/dist/src/framework/lib/wsPresence.d.ts +17 -0
  419. package/dist/src/framework/lib/wsPresence.js +84 -0
  420. package/dist/src/framework/lib/wsTransport.d.ts +38 -0
  421. package/dist/src/framework/lib/wsTransport.js +9 -0
  422. package/dist/{lib → src/framework/lib}/zodToMongoose.d.ts +1 -1
  423. package/dist/{lib → src/framework/lib}/zodToMongoose.js +11 -11
  424. package/dist/{middleware → src/framework/middleware}/auditLog.d.ts +4 -3
  425. package/dist/src/framework/middleware/auditLog.js +42 -0
  426. package/dist/{middleware → src/framework/middleware}/botProtection.d.ts +2 -2
  427. package/dist/{middleware → src/framework/middleware}/botProtection.js +8 -9
  428. package/dist/src/framework/middleware/cacheResponse.d.ts +35 -0
  429. package/dist/src/framework/middleware/cacheResponse.js +126 -0
  430. package/dist/src/framework/middleware/captcha.d.ts +9 -0
  431. package/dist/src/framework/middleware/captcha.js +37 -0
  432. package/dist/{middleware → src/framework/middleware}/errorHandler.d.ts +1 -1
  433. package/dist/src/framework/middleware/errorHandler.js +16 -0
  434. package/dist/src/framework/middleware/index.js +1 -0
  435. package/dist/{middleware → src/framework/middleware}/logger.d.ts +1 -1
  436. package/dist/src/framework/middleware/metrics.d.ts +12 -0
  437. package/dist/src/framework/middleware/metrics.js +26 -0
  438. package/dist/{middleware → src/framework/middleware}/rateLimit.d.ts +2 -2
  439. package/dist/src/framework/middleware/rateLimit.js +22 -0
  440. package/dist/src/framework/middleware/requestId.d.ts +3 -0
  441. package/dist/{middleware → src/framework/middleware}/requestId.js +2 -2
  442. package/dist/{middleware → src/framework/middleware}/requestLogger.d.ts +3 -3
  443. package/dist/{middleware → src/framework/middleware}/requestLogger.js +17 -12
  444. package/dist/{middleware → src/framework/middleware}/requestSigning.d.ts +2 -2
  445. package/dist/{middleware → src/framework/middleware}/requestSigning.js +18 -19
  446. package/dist/src/framework/middleware/tenant.d.ts +14 -0
  447. package/dist/{middleware → src/framework/middleware}/tenant.js +31 -27
  448. package/dist/src/framework/middleware/upload.d.ts +5 -0
  449. package/dist/{middleware → src/framework/middleware}/upload.js +4 -4
  450. package/dist/{middleware → src/framework/middleware}/webhookAuth.d.ts +3 -3
  451. package/dist/{middleware → src/framework/middleware}/webhookAuth.js +11 -11
  452. package/dist/src/framework/models/AuditLog.d.ts +21 -0
  453. package/dist/src/framework/models/AuditLog.js +31 -0
  454. package/dist/src/framework/mountMiddleware.d.ts +91 -0
  455. package/dist/src/framework/mountMiddleware.js +128 -0
  456. package/dist/src/framework/mountOptionalEndpoints.d.ts +103 -0
  457. package/dist/src/framework/mountOptionalEndpoints.js +47 -0
  458. package/dist/src/framework/mountRoutes.d.ts +21 -0
  459. package/dist/src/framework/mountRoutes.js +144 -0
  460. package/dist/src/framework/persistence/cronRegistry.d.ts +28 -0
  461. package/dist/src/framework/persistence/cronRegistry.js +139 -0
  462. package/dist/src/framework/persistence/idempotency.d.ts +26 -0
  463. package/dist/src/framework/persistence/idempotency.js +178 -0
  464. package/dist/src/framework/persistence/index.d.ts +6 -0
  465. package/dist/src/framework/persistence/index.js +8 -0
  466. package/dist/src/framework/persistence/storeInfra.d.ts +9 -0
  467. package/dist/src/framework/persistence/storeInfra.js +1 -0
  468. package/dist/src/framework/persistence/uploadRegistry.d.ts +35 -0
  469. package/dist/src/framework/persistence/uploadRegistry.js +235 -0
  470. package/dist/src/framework/persistence/wsMessages.d.ts +22 -0
  471. package/dist/src/framework/persistence/wsMessages.js +296 -0
  472. package/dist/src/framework/preloadSchemas.d.ts +24 -0
  473. package/dist/src/framework/preloadSchemas.js +42 -0
  474. package/dist/src/framework/registerBoundaryAdapters.d.ts +23 -0
  475. package/dist/src/framework/registerBoundaryAdapters.js +46 -0
  476. package/dist/src/framework/routes/admin.d.ts +9 -0
  477. package/dist/src/framework/routes/admin.js +361 -0
  478. package/dist/src/framework/routes/health.d.ts +1 -0
  479. package/dist/src/framework/routes/health.js +21 -0
  480. package/dist/src/framework/routes/home.d.ts +1 -0
  481. package/dist/src/framework/routes/home.js +18 -0
  482. package/dist/src/framework/routes/jobs.d.ts +3 -0
  483. package/dist/src/framework/routes/jobs.js +315 -0
  484. package/dist/src/framework/routes/metrics.d.ts +10 -0
  485. package/dist/src/framework/routes/metrics.js +57 -0
  486. package/dist/src/framework/routes/uploads.d.ts +14 -0
  487. package/dist/src/framework/routes/uploads.js +262 -0
  488. package/dist/src/framework/runPluginLifecycle.d.ts +27 -0
  489. package/dist/src/framework/runPluginLifecycle.js +121 -0
  490. package/dist/src/framework/secrets/frameworkSecretSchema.d.ts +58 -0
  491. package/dist/src/framework/secrets/frameworkSecretSchema.js +20 -0
  492. package/dist/src/framework/secrets/index.d.ts +9 -0
  493. package/dist/src/framework/secrets/index.js +7 -0
  494. package/dist/src/framework/secrets/providers/envProvider.d.ts +15 -0
  495. package/dist/src/framework/secrets/providers/envProvider.js +18 -0
  496. package/dist/src/framework/secrets/providers/fileProvider.d.ts +8 -0
  497. package/dist/src/framework/secrets/providers/fileProvider.js +82 -0
  498. package/dist/src/framework/secrets/providers/ssmProvider.d.ts +20 -0
  499. package/dist/src/framework/secrets/providers/ssmProvider.js +127 -0
  500. package/dist/src/framework/secrets/resolveSecretBundle.d.ts +53 -0
  501. package/dist/src/framework/secrets/resolveSecretBundle.js +84 -0
  502. package/dist/src/framework/secrets/resolveSecrets.d.ts +18 -0
  503. package/dist/src/framework/secrets/resolveSecrets.js +34 -0
  504. package/dist/src/framework/sse/index.d.ts +21 -0
  505. package/dist/src/framework/sse/index.js +109 -0
  506. package/dist/src/framework/ws/index.d.ts +11 -0
  507. package/dist/src/framework/ws/index.js +8 -0
  508. package/dist/src/index.d.ts +87 -0
  509. package/dist/src/index.js +58 -0
  510. package/dist/src/lib/appConfig.d.ts +7 -0
  511. package/dist/src/lib/appConfig.js +27 -0
  512. package/dist/src/lib/appMeta.d.ts +7 -0
  513. package/dist/src/lib/appMeta.js +3 -0
  514. package/dist/src/lib/authConfig.d.ts +532 -0
  515. package/dist/src/lib/authConfig.js +179 -0
  516. package/dist/{lib → src/lib}/context.d.ts +6 -7
  517. package/dist/{lib → src/lib}/context.js +5 -5
  518. package/dist/src/lib/logger.d.ts +1 -0
  519. package/dist/src/lib/logger.js +1 -0
  520. package/dist/src/lib/mongo.d.ts +58 -0
  521. package/dist/src/lib/mongo.js +96 -0
  522. package/dist/src/lib/queue.d.ts +72 -0
  523. package/dist/src/lib/queue.js +152 -0
  524. package/dist/src/lib/redis.d.ts +28 -0
  525. package/dist/src/lib/redis.js +72 -0
  526. package/dist/{lib → src/lib}/signing.d.ts +2 -2
  527. package/dist/src/lib/signing.js +210 -0
  528. package/dist/src/lib/signingConfig.d.ts +40 -0
  529. package/dist/src/lib/signingConfig.js +28 -0
  530. package/dist/src/server.d.ts +146 -0
  531. package/dist/src/server.js +469 -0
  532. package/dist/src/shared/lib/HttpError.d.ts +1 -0
  533. package/dist/src/shared/lib/HttpError.js +2 -0
  534. package/dist/src/shared/lib/constants.d.ts +10 -0
  535. package/dist/src/shared/lib/crypto.d.ts +43 -0
  536. package/dist/src/shared/lib/crypto.js +74 -0
  537. package/dist/src/shared/lib/signing.d.ts +52 -0
  538. package/dist/{lib → src/shared/lib}/signing.js +40 -10
  539. package/dist/src/testing.d.ts +34 -0
  540. package/dist/src/testing.js +93 -0
  541. package/package.json +62 -25
  542. package/dist/adapters/memoryAuth.d.ts +0 -46
  543. package/dist/adapters/memoryAuth.js +0 -634
  544. package/dist/adapters/memoryStorage.d.ts +0 -3
  545. package/dist/adapters/memoryStorage.js +0 -44
  546. package/dist/adapters/mongoAuth.d.ts +0 -2
  547. package/dist/adapters/mongoAuth.js +0 -307
  548. package/dist/adapters/sqliteAuth.d.ts +0 -49
  549. package/dist/adapters/sqliteAuth.js +0 -707
  550. package/dist/app.d.ts +0 -456
  551. package/dist/app.js +0 -548
  552. package/dist/entrypoints/mongo.d.ts +0 -5
  553. package/dist/entrypoints/mongo.js +0 -4
  554. package/dist/entrypoints/queue.d.ts +0 -2
  555. package/dist/entrypoints/queue.js +0 -1
  556. package/dist/entrypoints/redis.d.ts +0 -1
  557. package/dist/entrypoints/redis.js +0 -1
  558. package/dist/index.d.ts +0 -98
  559. package/dist/index.js +0 -77
  560. package/dist/lib/HttpError.d.ts +0 -9
  561. package/dist/lib/HttpError.js +0 -14
  562. package/dist/lib/appConfig.d.ts +0 -162
  563. package/dist/lib/appConfig.js +0 -83
  564. package/dist/lib/auditLog.d.ts +0 -52
  565. package/dist/lib/auditLog.js +0 -201
  566. package/dist/lib/authAdapter.d.ts +0 -176
  567. package/dist/lib/authAdapter.js +0 -7
  568. package/dist/lib/authRateLimit.d.ts +0 -13
  569. package/dist/lib/authRateLimit.js +0 -81
  570. package/dist/lib/clientIp.d.ts +0 -14
  571. package/dist/lib/crypto.d.ts +0 -11
  572. package/dist/lib/crypto.js +0 -22
  573. package/dist/lib/deletionCancelToken.d.ts +0 -12
  574. package/dist/lib/deletionCancelToken.js +0 -88
  575. package/dist/lib/emailVerification.d.ts +0 -13
  576. package/dist/lib/emailVerification.js +0 -86
  577. package/dist/lib/fingerprint.js +0 -36
  578. package/dist/lib/idempotency.js +0 -182
  579. package/dist/lib/jwt.d.ts +0 -2
  580. package/dist/lib/jwt.js +0 -24
  581. package/dist/lib/logger.d.ts +0 -1
  582. package/dist/lib/logger.js +0 -7
  583. package/dist/lib/metrics.d.ts +0 -14
  584. package/dist/lib/mfaChallenge.d.ts +0 -42
  585. package/dist/lib/mfaChallenge.js +0 -293
  586. package/dist/lib/mongo.d.ts +0 -39
  587. package/dist/lib/mongo.js +0 -124
  588. package/dist/lib/oauth.d.ts +0 -40
  589. package/dist/lib/oauth.js +0 -101
  590. package/dist/lib/oauthCode.d.ts +0 -15
  591. package/dist/lib/oauthCode.js +0 -90
  592. package/dist/lib/pagination.d.ts +0 -119
  593. package/dist/lib/pagination.js +0 -166
  594. package/dist/lib/queue.d.ts +0 -37
  595. package/dist/lib/queue.js +0 -117
  596. package/dist/lib/redis.d.ts +0 -9
  597. package/dist/lib/redis.js +0 -61
  598. package/dist/lib/resetPassword.d.ts +0 -12
  599. package/dist/lib/resetPassword.js +0 -91
  600. package/dist/lib/roles.d.ts +0 -7
  601. package/dist/lib/roles.js +0 -49
  602. package/dist/lib/session.d.ts +0 -39
  603. package/dist/lib/session.js +0 -535
  604. package/dist/lib/tenant.d.ts +0 -15
  605. package/dist/lib/tenant.js +0 -65
  606. package/dist/lib/upload.js +0 -87
  607. package/dist/lib/ws.d.ts +0 -22
  608. package/dist/lib/ws.js +0 -89
  609. package/dist/lib/wsHeartbeat.d.ts +0 -12
  610. package/dist/lib/wsHeartbeat.js +0 -57
  611. package/dist/lib/wsMessages.d.ts +0 -40
  612. package/dist/lib/wsMessages.js +0 -330
  613. package/dist/lib/wsPresence.d.ts +0 -25
  614. package/dist/lib/wsPresence.js +0 -99
  615. package/dist/middleware/auditLog.js +0 -39
  616. package/dist/middleware/bearerAuth.d.ts +0 -2
  617. package/dist/middleware/bearerAuth.js +0 -11
  618. package/dist/middleware/cacheResponse.d.ts +0 -15
  619. package/dist/middleware/cacheResponse.js +0 -178
  620. package/dist/middleware/csrf.js +0 -125
  621. package/dist/middleware/errorHandler.js +0 -13
  622. package/dist/middleware/identify.d.ts +0 -3
  623. package/dist/middleware/identify.js +0 -95
  624. package/dist/middleware/index.js +0 -1
  625. package/dist/middleware/metrics.d.ts +0 -9
  626. package/dist/middleware/metrics.js +0 -26
  627. package/dist/middleware/rateLimit.js +0 -22
  628. package/dist/middleware/requestId.d.ts +0 -3
  629. package/dist/middleware/tenant.d.ts +0 -5
  630. package/dist/middleware/upload.d.ts +0 -5
  631. package/dist/middleware/userAuth.d.ts +0 -3
  632. package/dist/middleware/userAuth.js +0 -6
  633. package/dist/models/AuditLog.d.ts +0 -30
  634. package/dist/models/AuditLog.js +0 -39
  635. package/dist/models/AuthUser.js +0 -48
  636. package/dist/models/Group.d.ts +0 -21
  637. package/dist/models/Group.js +0 -28
  638. package/dist/models/GroupMembership.js +0 -25
  639. package/dist/models/TenantRole.d.ts +0 -15
  640. package/dist/models/TenantRole.js +0 -23
  641. package/dist/routes/auth.d.ts +0 -11
  642. package/dist/routes/auth.js +0 -605
  643. package/dist/routes/groups.js +0 -346
  644. package/dist/routes/health.d.ts +0 -1
  645. package/dist/routes/health.js +0 -22
  646. package/dist/routes/home.d.ts +0 -1
  647. package/dist/routes/home.js +0 -16
  648. package/dist/routes/jobs.d.ts +0 -2
  649. package/dist/routes/jobs.js +0 -272
  650. package/dist/routes/metrics.d.ts +0 -7
  651. package/dist/routes/metrics.js +0 -52
  652. package/dist/routes/mfa.d.ts +0 -5
  653. package/dist/routes/mfa.js +0 -620
  654. package/dist/routes/oauth.d.ts +0 -2
  655. package/dist/routes/oauth.js +0 -514
  656. package/dist/routes/uploads.d.ts +0 -2
  657. package/dist/routes/uploads.js +0 -135
  658. package/dist/schemas/auth.js +0 -30
  659. package/dist/server.d.ts +0 -57
  660. package/dist/server.js +0 -112
  661. package/dist/services/auth.d.ts +0 -27
  662. package/dist/services/auth.js +0 -159
  663. package/dist/ws/index.d.ts +0 -10
  664. package/dist/ws/index.js +0 -38
  665. package/docs/sections/adding-middleware/full.md +0 -35
  666. package/docs/sections/adding-models/full.md +0 -125
  667. package/docs/sections/adding-models/overview.md +0 -13
  668. package/docs/sections/adding-routes/full.md +0 -182
  669. package/docs/sections/adding-routes/overview.md +0 -23
  670. package/docs/sections/auth-flow/full.md +0 -779
  671. package/docs/sections/auth-flow/overview.md +0 -10
  672. package/docs/sections/auth-security-examples/full.md +0 -365
  673. package/docs/sections/authentication/full.md +0 -130
  674. package/docs/sections/authentication/overview.md +0 -5
  675. package/docs/sections/cli/full.md +0 -42
  676. package/docs/sections/configuration/full.md +0 -172
  677. package/docs/sections/configuration/overview.md +0 -18
  678. package/docs/sections/configuration-example/full.md +0 -117
  679. package/docs/sections/configuration-example/overview.md +0 -30
  680. package/docs/sections/documentation/full.md +0 -171
  681. package/docs/sections/environment-variables/full.md +0 -55
  682. package/docs/sections/exports/full.md +0 -123
  683. package/docs/sections/extending-context/full.md +0 -59
  684. package/docs/sections/header.md +0 -3
  685. package/docs/sections/installation/full.md +0 -6
  686. package/docs/sections/jobs/full.md +0 -140
  687. package/docs/sections/jobs/overview.md +0 -15
  688. package/docs/sections/logging/full.md +0 -83
  689. package/docs/sections/metrics/full.md +0 -127
  690. package/docs/sections/mongodb-connections/full.md +0 -45
  691. package/docs/sections/mongodb-connections/overview.md +0 -7
  692. package/docs/sections/multi-tenancy/full.md +0 -66
  693. package/docs/sections/multi-tenancy/overview.md +0 -15
  694. package/docs/sections/oauth/full.md +0 -189
  695. package/docs/sections/oauth/overview.md +0 -16
  696. package/docs/sections/package-development/full.md +0 -7
  697. package/docs/sections/pagination/full.md +0 -93
  698. package/docs/sections/peer-dependencies/full.md +0 -47
  699. package/docs/sections/quick-start/full.md +0 -43
  700. package/docs/sections/response-caching/full.md +0 -117
  701. package/docs/sections/response-caching/overview.md +0 -13
  702. package/docs/sections/roles/full.md +0 -225
  703. package/docs/sections/roles/overview.md +0 -14
  704. package/docs/sections/running-without-redis/full.md +0 -16
  705. package/docs/sections/running-without-redis-or-mongodb/full.md +0 -60
  706. package/docs/sections/signing/full.md +0 -203
  707. package/docs/sections/stack/full.md +0 -10
  708. package/docs/sections/uploads/full.md +0 -199
  709. package/docs/sections/versioning/full.md +0 -85
  710. package/docs/sections/webhook-auth/full.md +0 -100
  711. package/docs/sections/websocket/full.md +0 -184
  712. package/docs/sections/websocket/overview.md +0 -5
  713. package/docs/sections/websocket-rooms/full.md +0 -102
  714. package/docs/sections/websocket-rooms/overview.md +0 -5
  715. /package/dist/{lib/storageAdapter.js → packages/bunshot-admin/src/types/env.js} +0 -0
  716. /package/dist/{lib → packages/bunshot-auth/src/lib}/fingerprint.d.ts +0 -0
  717. /package/dist/{lib → packages/bunshot-core/src}/constants.d.ts +0 -0
  718. /package/dist/{lib → packages/bunshot-core/src}/storageAdapter.d.ts +0 -0
  719. /package/dist/{lib → src/framework/lib}/createDtoMapper.d.ts +0 -0
  720. /package/dist/{lib → src/framework/lib}/stripUnreferencedSchemas.d.ts +0 -0
  721. /package/dist/{middleware → src/framework/middleware}/cors.d.ts +0 -0
  722. /package/dist/{middleware → src/framework/middleware}/cors.js +0 -0
  723. /package/dist/{middleware → src/framework/middleware}/index.d.ts +0 -0
  724. /package/dist/{middleware → src/framework/middleware}/logger.js +0 -0
  725. /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, '&amp;')
10
+ .replace(/</g, '&lt;')
11
+ .replace(/>/g, '&gt;')
12
+ .replace(/"/g, '&quot;')
13
+ .replace(/'/g, '&#x27;');
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;
@@ -0,0 +1,3 @@
1
+ export function isProd() {
2
+ return process.env.NODE_ENV === 'production';
3
+ }