@portaidentity/server 1.7.0

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/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +33 -0
  4. package/dist/applications/cache.d.ts +64 -0
  5. package/dist/applications/cache.d.ts.map +1 -0
  6. package/dist/applications/cache.js +161 -0
  7. package/dist/applications/cache.js.map +1 -0
  8. package/dist/applications/errors.d.ts +25 -0
  9. package/dist/applications/errors.d.ts.map +1 -0
  10. package/dist/applications/errors.js +31 -0
  11. package/dist/applications/errors.js.map +1 -0
  12. package/dist/applications/index.d.ts +17 -0
  13. package/dist/applications/index.d.ts.map +1 -0
  14. package/dist/applications/index.js +19 -0
  15. package/dist/applications/index.js.map +1 -0
  16. package/dist/applications/repository.d.ts +184 -0
  17. package/dist/applications/repository.d.ts.map +1 -0
  18. package/dist/applications/repository.js +367 -0
  19. package/dist/applications/repository.js.map +1 -0
  20. package/dist/applications/service.d.ts +160 -0
  21. package/dist/applications/service.d.ts.map +1 -0
  22. package/dist/applications/service.js +388 -0
  23. package/dist/applications/service.js.map +1 -0
  24. package/dist/applications/slugs.d.ts +61 -0
  25. package/dist/applications/slugs.d.ts.map +1 -0
  26. package/dist/applications/slugs.js +115 -0
  27. package/dist/applications/slugs.js.map +1 -0
  28. package/dist/applications/types.d.ts +129 -0
  29. package/dist/applications/types.d.ts.map +1 -0
  30. package/dist/applications/types.js +62 -0
  31. package/dist/applications/types.js.map +1 -0
  32. package/dist/auth/csrf.d.ts +71 -0
  33. package/dist/auth/csrf.d.ts.map +1 -0
  34. package/dist/auth/csrf.js +112 -0
  35. package/dist/auth/csrf.js.map +1 -0
  36. package/dist/auth/email-renderer.d.ts +37 -0
  37. package/dist/auth/email-renderer.d.ts.map +1 -0
  38. package/dist/auth/email-renderer.js +116 -0
  39. package/dist/auth/email-renderer.js.map +1 -0
  40. package/dist/auth/email-service.d.ts +154 -0
  41. package/dist/auth/email-service.d.ts.map +1 -0
  42. package/dist/auth/email-service.js +415 -0
  43. package/dist/auth/email-service.js.map +1 -0
  44. package/dist/auth/email-transport.d.ts +65 -0
  45. package/dist/auth/email-transport.d.ts.map +1 -0
  46. package/dist/auth/email-transport.js +82 -0
  47. package/dist/auth/email-transport.js.map +1 -0
  48. package/dist/auth/i18n.d.ts +81 -0
  49. package/dist/auth/i18n.d.ts.map +1 -0
  50. package/dist/auth/i18n.js +395 -0
  51. package/dist/auth/i18n.js.map +1 -0
  52. package/dist/auth/index.d.ts +28 -0
  53. package/dist/auth/index.d.ts.map +1 -0
  54. package/dist/auth/index.js +31 -0
  55. package/dist/auth/index.js.map +1 -0
  56. package/dist/auth/interaction-authority.d.ts +39 -0
  57. package/dist/auth/interaction-authority.d.ts.map +1 -0
  58. package/dist/auth/interaction-authority.js +30 -0
  59. package/dist/auth/interaction-authority.js.map +1 -0
  60. package/dist/auth/magic-link-session.d.ts +81 -0
  61. package/dist/auth/magic-link-session.d.ts.map +1 -0
  62. package/dist/auth/magic-link-session.js +183 -0
  63. package/dist/auth/magic-link-session.js.map +1 -0
  64. package/dist/auth/rate-limiter.d.ts +143 -0
  65. package/dist/auth/rate-limiter.d.ts.map +1 -0
  66. package/dist/auth/rate-limiter.js +220 -0
  67. package/dist/auth/rate-limiter.js.map +1 -0
  68. package/dist/auth/recovery-crypto.d.ts +34 -0
  69. package/dist/auth/recovery-crypto.d.ts.map +1 -0
  70. package/dist/auth/recovery-crypto.js +103 -0
  71. package/dist/auth/recovery-crypto.js.map +1 -0
  72. package/dist/auth/recovery-job-processor.d.ts +24 -0
  73. package/dist/auth/recovery-job-processor.d.ts.map +1 -0
  74. package/dist/auth/recovery-job-processor.js +123 -0
  75. package/dist/auth/recovery-job-processor.js.map +1 -0
  76. package/dist/auth/recovery-job-repository.d.ts +219 -0
  77. package/dist/auth/recovery-job-repository.d.ts.map +1 -0
  78. package/dist/auth/recovery-job-repository.js +340 -0
  79. package/dist/auth/recovery-job-repository.js.map +1 -0
  80. package/dist/auth/recovery-service.d.ts +27 -0
  81. package/dist/auth/recovery-service.d.ts.map +1 -0
  82. package/dist/auth/recovery-service.js +53 -0
  83. package/dist/auth/recovery-service.js.map +1 -0
  84. package/dist/auth/recovery-worker.d.ts +158 -0
  85. package/dist/auth/recovery-worker.d.ts.map +1 -0
  86. package/dist/auth/recovery-worker.js +306 -0
  87. package/dist/auth/recovery-worker.js.map +1 -0
  88. package/dist/auth/template-engine.d.ts +134 -0
  89. package/dist/auth/template-engine.d.ts.map +1 -0
  90. package/dist/auth/template-engine.js +225 -0
  91. package/dist/auth/template-engine.js.map +1 -0
  92. package/dist/auth/token-repository.d.ts +238 -0
  93. package/dist/auth/token-repository.d.ts.map +1 -0
  94. package/dist/auth/token-repository.js +475 -0
  95. package/dist/auth/token-repository.js.map +1 -0
  96. package/dist/auth/tokens.d.ts +45 -0
  97. package/dist/auth/tokens.d.ts.map +1 -0
  98. package/dist/auth/tokens.js +51 -0
  99. package/dist/auth/tokens.js.map +1 -0
  100. package/dist/cli/bootstrap.d.ts +55 -0
  101. package/dist/cli/bootstrap.d.ts.map +1 -0
  102. package/dist/cli/bootstrap.js +90 -0
  103. package/dist/cli/bootstrap.js.map +1 -0
  104. package/dist/cli/commands/health.d.ts +20 -0
  105. package/dist/cli/commands/health.d.ts.map +1 -0
  106. package/dist/cli/commands/health.js +80 -0
  107. package/dist/cli/commands/health.js.map +1 -0
  108. package/dist/cli/commands/init.d.ts +48 -0
  109. package/dist/cli/commands/init.d.ts.map +1 -0
  110. package/dist/cli/commands/init.js +349 -0
  111. package/dist/cli/commands/init.js.map +1 -0
  112. package/dist/cli/commands/migrate.d.ts +19 -0
  113. package/dist/cli/commands/migrate.d.ts.map +1 -0
  114. package/dist/cli/commands/migrate.js +88 -0
  115. package/dist/cli/commands/migrate.js.map +1 -0
  116. package/dist/cli/commands/seed.d.ts +19 -0
  117. package/dist/cli/commands/seed.d.ts.map +1 -0
  118. package/dist/cli/commands/seed.js +71 -0
  119. package/dist/cli/commands/seed.js.map +1 -0
  120. package/dist/cli/commands/user-2fa.d.ts +29 -0
  121. package/dist/cli/commands/user-2fa.d.ts.map +1 -0
  122. package/dist/cli/commands/user-2fa.js +113 -0
  123. package/dist/cli/commands/user-2fa.js.map +1 -0
  124. package/dist/cli/error-handler.d.ts +31 -0
  125. package/dist/cli/error-handler.d.ts.map +1 -0
  126. package/dist/cli/error-handler.js +65 -0
  127. package/dist/cli/error-handler.js.map +1 -0
  128. package/dist/cli/index.d.ts +48 -0
  129. package/dist/cli/index.d.ts.map +1 -0
  130. package/dist/cli/index.js +99 -0
  131. package/dist/cli/index.js.map +1 -0
  132. package/dist/cli/output.d.ts +94 -0
  133. package/dist/cli/output.d.ts.map +1 -0
  134. package/dist/cli/output.js +124 -0
  135. package/dist/cli/output.js.map +1 -0
  136. package/dist/cli/prompt.d.ts +48 -0
  137. package/dist/cli/prompt.d.ts.map +1 -0
  138. package/dist/cli/prompt.js +96 -0
  139. package/dist/cli/prompt.js.map +1 -0
  140. package/dist/clients/cache.d.ts +63 -0
  141. package/dist/clients/cache.d.ts.map +1 -0
  142. package/dist/clients/cache.js +160 -0
  143. package/dist/clients/cache.js.map +1 -0
  144. package/dist/clients/crypto.d.ts +69 -0
  145. package/dist/clients/crypto.d.ts.map +1 -0
  146. package/dist/clients/crypto.js +83 -0
  147. package/dist/clients/crypto.js.map +1 -0
  148. package/dist/clients/errors.d.ts +27 -0
  149. package/dist/clients/errors.d.ts.map +1 -0
  150. package/dist/clients/errors.js +33 -0
  151. package/dist/clients/errors.js.map +1 -0
  152. package/dist/clients/index.d.ts +19 -0
  153. package/dist/clients/index.d.ts.map +1 -0
  154. package/dist/clients/index.js +23 -0
  155. package/dist/clients/index.js.map +1 -0
  156. package/dist/clients/repository.d.ts +161 -0
  157. package/dist/clients/repository.d.ts.map +1 -0
  158. package/dist/clients/repository.js +318 -0
  159. package/dist/clients/repository.js.map +1 -0
  160. package/dist/clients/resolve-login-methods.d.ts +74 -0
  161. package/dist/clients/resolve-login-methods.d.ts.map +1 -0
  162. package/dist/clients/resolve-login-methods.js +68 -0
  163. package/dist/clients/resolve-login-methods.js.map +1 -0
  164. package/dist/clients/secret-repository.d.ts +109 -0
  165. package/dist/clients/secret-repository.d.ts.map +1 -0
  166. package/dist/clients/secret-repository.js +166 -0
  167. package/dist/clients/secret-repository.js.map +1 -0
  168. package/dist/clients/secret-service.d.ts +87 -0
  169. package/dist/clients/secret-service.d.ts.map +1 -0
  170. package/dist/clients/secret-service.js +204 -0
  171. package/dist/clients/secret-service.js.map +1 -0
  172. package/dist/clients/service.d.ts +158 -0
  173. package/dist/clients/service.d.ts.map +1 -0
  174. package/dist/clients/service.js +523 -0
  175. package/dist/clients/service.js.map +1 -0
  176. package/dist/clients/types.d.ts +214 -0
  177. package/dist/clients/types.d.ts.map +1 -0
  178. package/dist/clients/types.js +77 -0
  179. package/dist/clients/types.js.map +1 -0
  180. package/dist/clients/validators.d.ts +87 -0
  181. package/dist/clients/validators.d.ts.map +1 -0
  182. package/dist/clients/validators.js +164 -0
  183. package/dist/clients/validators.js.map +1 -0
  184. package/dist/config/index.d.ts +23 -0
  185. package/dist/config/index.d.ts.map +1 -0
  186. package/dist/config/index.js +52 -0
  187. package/dist/config/index.js.map +1 -0
  188. package/dist/config/schema.d.ts +35 -0
  189. package/dist/config/schema.d.ts.map +1 -0
  190. package/dist/config/schema.js +167 -0
  191. package/dist/config/schema.js.map +1 -0
  192. package/dist/custom-claims/cache.d.ts +48 -0
  193. package/dist/custom-claims/cache.d.ts.map +1 -0
  194. package/dist/custom-claims/cache.js +122 -0
  195. package/dist/custom-claims/cache.js.map +1 -0
  196. package/dist/custom-claims/errors.d.ts +25 -0
  197. package/dist/custom-claims/errors.d.ts.map +1 -0
  198. package/dist/custom-claims/errors.js +31 -0
  199. package/dist/custom-claims/errors.js.map +1 -0
  200. package/dist/custom-claims/index.d.ts +14 -0
  201. package/dist/custom-claims/index.d.ts.map +1 -0
  202. package/dist/custom-claims/index.js +17 -0
  203. package/dist/custom-claims/index.js.map +1 -0
  204. package/dist/custom-claims/repository.d.ts +147 -0
  205. package/dist/custom-claims/repository.d.ts.map +1 -0
  206. package/dist/custom-claims/repository.js +338 -0
  207. package/dist/custom-claims/repository.js.map +1 -0
  208. package/dist/custom-claims/service.d.ts +129 -0
  209. package/dist/custom-claims/service.d.ts.map +1 -0
  210. package/dist/custom-claims/service.js +296 -0
  211. package/dist/custom-claims/service.js.map +1 -0
  212. package/dist/custom-claims/types.d.ts +132 -0
  213. package/dist/custom-claims/types.d.ts.map +1 -0
  214. package/dist/custom-claims/types.js +61 -0
  215. package/dist/custom-claims/types.js.map +1 -0
  216. package/dist/custom-claims/validators.d.ts +61 -0
  217. package/dist/custom-claims/validators.d.ts.map +1 -0
  218. package/dist/custom-claims/validators.js +136 -0
  219. package/dist/custom-claims/validators.js.map +1 -0
  220. package/dist/index.d.ts +14 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +91 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/lib/admin-permissions.d.ts +147 -0
  225. package/dist/lib/admin-permissions.d.ts.map +1 -0
  226. package/dist/lib/admin-permissions.js +261 -0
  227. package/dist/lib/admin-permissions.js.map +1 -0
  228. package/dist/lib/audit-log.d.ts +45 -0
  229. package/dist/lib/audit-log.d.ts.map +1 -0
  230. package/dist/lib/audit-log.js +79 -0
  231. package/dist/lib/audit-log.js.map +1 -0
  232. package/dist/lib/branding-assets.d.ts +47 -0
  233. package/dist/lib/branding-assets.d.ts.map +1 -0
  234. package/dist/lib/branding-assets.js +93 -0
  235. package/dist/lib/branding-assets.js.map +1 -0
  236. package/dist/lib/bulk-operations.d.ts +54 -0
  237. package/dist/lib/bulk-operations.d.ts.map +1 -0
  238. package/dist/lib/bulk-operations.js +201 -0
  239. package/dist/lib/bulk-operations.js.map +1 -0
  240. package/dist/lib/cursor.d.ts +110 -0
  241. package/dist/lib/cursor.d.ts.map +1 -0
  242. package/dist/lib/cursor.js +115 -0
  243. package/dist/lib/cursor.js.map +1 -0
  244. package/dist/lib/data-export.d.ts +67 -0
  245. package/dist/lib/data-export.d.ts.map +1 -0
  246. package/dist/lib/data-export.js +272 -0
  247. package/dist/lib/data-export.js.map +1 -0
  248. package/dist/lib/data-import-plan.d.ts +50 -0
  249. package/dist/lib/data-import-plan.d.ts.map +1 -0
  250. package/dist/lib/data-import-plan.js +235 -0
  251. package/dist/lib/data-import-plan.js.map +1 -0
  252. package/dist/lib/data-import.d.ts +276 -0
  253. package/dist/lib/data-import.d.ts.map +1 -0
  254. package/dist/lib/data-import.js +1694 -0
  255. package/dist/lib/data-import.js.map +1 -0
  256. package/dist/lib/database.d.ts +22 -0
  257. package/dist/lib/database.d.ts.map +1 -0
  258. package/dist/lib/database.js +103 -0
  259. package/dist/lib/database.js.map +1 -0
  260. package/dist/lib/entity-history.d.ts +52 -0
  261. package/dist/lib/entity-history.d.ts.map +1 -0
  262. package/dist/lib/entity-history.js +121 -0
  263. package/dist/lib/entity-history.js.map +1 -0
  264. package/dist/lib/etag.d.ts +92 -0
  265. package/dist/lib/etag.d.ts.map +1 -0
  266. package/dist/lib/etag.js +155 -0
  267. package/dist/lib/etag.js.map +1 -0
  268. package/dist/lib/image-validator.d.ts +44 -0
  269. package/dist/lib/image-validator.d.ts.map +1 -0
  270. package/dist/lib/image-validator.js +204 -0
  271. package/dist/lib/image-validator.js.map +1 -0
  272. package/dist/lib/logger.d.ts +15 -0
  273. package/dist/lib/logger.d.ts.map +1 -0
  274. package/dist/lib/logger.js +84 -0
  275. package/dist/lib/logger.js.map +1 -0
  276. package/dist/lib/migrator.d.ts +14 -0
  277. package/dist/lib/migrator.d.ts.map +1 -0
  278. package/dist/lib/migrator.js +34 -0
  279. package/dist/lib/migrator.js.map +1 -0
  280. package/dist/lib/redis.d.ts +5 -0
  281. package/dist/lib/redis.d.ts.map +1 -0
  282. package/dist/lib/redis.js +29 -0
  283. package/dist/lib/redis.js.map +1 -0
  284. package/dist/lib/runtime-paths.d.ts +38 -0
  285. package/dist/lib/runtime-paths.d.ts.map +1 -0
  286. package/dist/lib/runtime-paths.js +50 -0
  287. package/dist/lib/runtime-paths.js.map +1 -0
  288. package/dist/lib/session-tracking.d.ts +81 -0
  289. package/dist/lib/session-tracking.d.ts.map +1 -0
  290. package/dist/lib/session-tracking.js +145 -0
  291. package/dist/lib/session-tracking.js.map +1 -0
  292. package/dist/lib/signing-key-crypto.d.ts +53 -0
  293. package/dist/lib/signing-key-crypto.d.ts.map +1 -0
  294. package/dist/lib/signing-key-crypto.js +108 -0
  295. package/dist/lib/signing-key-crypto.js.map +1 -0
  296. package/dist/lib/signing-keys.d.ts +141 -0
  297. package/dist/lib/signing-keys.d.ts.map +1 -0
  298. package/dist/lib/signing-keys.js +206 -0
  299. package/dist/lib/signing-keys.js.map +1 -0
  300. package/dist/lib/stats.d.ts +83 -0
  301. package/dist/lib/stats.d.ts.map +1 -0
  302. package/dist/lib/stats.js +187 -0
  303. package/dist/lib/stats.js.map +1 -0
  304. package/dist/lib/super-admin-protection.d.ts +69 -0
  305. package/dist/lib/super-admin-protection.d.ts.map +1 -0
  306. package/dist/lib/super-admin-protection.js +102 -0
  307. package/dist/lib/super-admin-protection.js.map +1 -0
  308. package/dist/lib/system-config.d.ts +79 -0
  309. package/dist/lib/system-config.d.ts.map +1 -0
  310. package/dist/lib/system-config.js +159 -0
  311. package/dist/lib/system-config.js.map +1 -0
  312. package/dist/middleware/admin-auth.d.ts +100 -0
  313. package/dist/middleware/admin-auth.d.ts.map +1 -0
  314. package/dist/middleware/admin-auth.js +241 -0
  315. package/dist/middleware/admin-auth.js.map +1 -0
  316. package/dist/middleware/admin-cors.d.ts +41 -0
  317. package/dist/middleware/admin-cors.d.ts.map +1 -0
  318. package/dist/middleware/admin-cors.js +83 -0
  319. package/dist/middleware/admin-cors.js.map +1 -0
  320. package/dist/middleware/admin-mutation-audit.d.ts +9 -0
  321. package/dist/middleware/admin-mutation-audit.d.ts.map +1 -0
  322. package/dist/middleware/admin-mutation-audit.js +76 -0
  323. package/dist/middleware/admin-mutation-audit.js.map +1 -0
  324. package/dist/middleware/admin-rate-limiter.d.ts +56 -0
  325. package/dist/middleware/admin-rate-limiter.d.ts.map +1 -0
  326. package/dist/middleware/admin-rate-limiter.js +97 -0
  327. package/dist/middleware/admin-rate-limiter.js.map +1 -0
  328. package/dist/middleware/client-secret-hash.d.ts +34 -0
  329. package/dist/middleware/client-secret-hash.d.ts.map +1 -0
  330. package/dist/middleware/client-secret-hash.js +74 -0
  331. package/dist/middleware/client-secret-hash.js.map +1 -0
  332. package/dist/middleware/error-handler.d.ts +3 -0
  333. package/dist/middleware/error-handler.d.ts.map +1 -0
  334. package/dist/middleware/error-handler.js +93 -0
  335. package/dist/middleware/error-handler.js.map +1 -0
  336. package/dist/middleware/health.d.ts +3 -0
  337. package/dist/middleware/health.d.ts.map +1 -0
  338. package/dist/middleware/health.js +35 -0
  339. package/dist/middleware/health.js.map +1 -0
  340. package/dist/middleware/metrics.d.ts +40 -0
  341. package/dist/middleware/metrics.d.ts.map +1 -0
  342. package/dist/middleware/metrics.js +75 -0
  343. package/dist/middleware/metrics.js.map +1 -0
  344. package/dist/middleware/oidc-client-tenant.d.ts +37 -0
  345. package/dist/middleware/oidc-client-tenant.d.ts.map +1 -0
  346. package/dist/middleware/oidc-client-tenant.js +156 -0
  347. package/dist/middleware/oidc-client-tenant.js.map +1 -0
  348. package/dist/middleware/oidc-cors.d.ts +33 -0
  349. package/dist/middleware/oidc-cors.d.ts.map +1 -0
  350. package/dist/middleware/oidc-cors.js +68 -0
  351. package/dist/middleware/oidc-cors.js.map +1 -0
  352. package/dist/middleware/oidc-preflight-cors.d.ts +54 -0
  353. package/dist/middleware/oidc-preflight-cors.d.ts.map +1 -0
  354. package/dist/middleware/oidc-preflight-cors.js +267 -0
  355. package/dist/middleware/oidc-preflight-cors.js.map +1 -0
  356. package/dist/middleware/prompt-login-reset.d.ts +103 -0
  357. package/dist/middleware/prompt-login-reset.d.ts.map +1 -0
  358. package/dist/middleware/prompt-login-reset.js +204 -0
  359. package/dist/middleware/prompt-login-reset.js.map +1 -0
  360. package/dist/middleware/ready.d.ts +23 -0
  361. package/dist/middleware/ready.d.ts.map +1 -0
  362. package/dist/middleware/ready.js +60 -0
  363. package/dist/middleware/ready.js.map +1 -0
  364. package/dist/middleware/request-logger.d.ts +27 -0
  365. package/dist/middleware/request-logger.d.ts.map +1 -0
  366. package/dist/middleware/request-logger.js +46 -0
  367. package/dist/middleware/request-logger.js.map +1 -0
  368. package/dist/middleware/require-permission.d.ts +28 -0
  369. package/dist/middleware/require-permission.d.ts.map +1 -0
  370. package/dist/middleware/require-permission.js +63 -0
  371. package/dist/middleware/require-permission.js.map +1 -0
  372. package/dist/middleware/require-user-organization.d.ts +18 -0
  373. package/dist/middleware/require-user-organization.d.ts.map +1 -0
  374. package/dist/middleware/require-user-organization.js +53 -0
  375. package/dist/middleware/require-user-organization.js.map +1 -0
  376. package/dist/middleware/root-page.d.ts +62 -0
  377. package/dist/middleware/root-page.d.ts.map +1 -0
  378. package/dist/middleware/root-page.js +134 -0
  379. package/dist/middleware/root-page.js.map +1 -0
  380. package/dist/middleware/security-headers.d.ts +98 -0
  381. package/dist/middleware/security-headers.d.ts.map +1 -0
  382. package/dist/middleware/security-headers.js +159 -0
  383. package/dist/middleware/security-headers.js.map +1 -0
  384. package/dist/middleware/tenant-resolver.d.ts +37 -0
  385. package/dist/middleware/tenant-resolver.d.ts.map +1 -0
  386. package/dist/middleware/tenant-resolver.js +71 -0
  387. package/dist/middleware/tenant-resolver.js.map +1 -0
  388. package/dist/middleware/token-rate-limiter.d.ts +89 -0
  389. package/dist/middleware/token-rate-limiter.d.ts.map +1 -0
  390. package/dist/middleware/token-rate-limiter.js +189 -0
  391. package/dist/middleware/token-rate-limiter.js.map +1 -0
  392. package/dist/oidc/account-finder.d.ts +52 -0
  393. package/dist/oidc/account-finder.d.ts.map +1 -0
  394. package/dist/oidc/account-finder.js +134 -0
  395. package/dist/oidc/account-finder.js.map +1 -0
  396. package/dist/oidc/adapter-factory.d.ts +90 -0
  397. package/dist/oidc/adapter-factory.d.ts.map +1 -0
  398. package/dist/oidc/adapter-factory.js +165 -0
  399. package/dist/oidc/adapter-factory.js.map +1 -0
  400. package/dist/oidc/configuration.d.ts +155 -0
  401. package/dist/oidc/configuration.d.ts.map +1 -0
  402. package/dist/oidc/configuration.js +531 -0
  403. package/dist/oidc/configuration.js.map +1 -0
  404. package/dist/oidc/postgres-adapter.d.ts +159 -0
  405. package/dist/oidc/postgres-adapter.d.ts.map +1 -0
  406. package/dist/oidc/postgres-adapter.js +222 -0
  407. package/dist/oidc/postgres-adapter.js.map +1 -0
  408. package/dist/oidc/protocol-security-observer.d.ts +38 -0
  409. package/dist/oidc/protocol-security-observer.d.ts.map +1 -0
  410. package/dist/oidc/protocol-security-observer.js +93 -0
  411. package/dist/oidc/protocol-security-observer.js.map +1 -0
  412. package/dist/oidc/provider.d.ts +37 -0
  413. package/dist/oidc/provider.d.ts.map +1 -0
  414. package/dist/oidc/provider.js +71 -0
  415. package/dist/oidc/provider.js.map +1 -0
  416. package/dist/oidc/redis-adapter.d.ts +140 -0
  417. package/dist/oidc/redis-adapter.d.ts.map +1 -0
  418. package/dist/oidc/redis-adapter.js +344 -0
  419. package/dist/oidc/redis-adapter.js.map +1 -0
  420. package/dist/organizations/cache.d.ts +60 -0
  421. package/dist/organizations/cache.d.ts.map +1 -0
  422. package/dist/organizations/cache.js +157 -0
  423. package/dist/organizations/cache.js.map +1 -0
  424. package/dist/organizations/errors.d.ts +25 -0
  425. package/dist/organizations/errors.d.ts.map +1 -0
  426. package/dist/organizations/errors.js +31 -0
  427. package/dist/organizations/errors.js.map +1 -0
  428. package/dist/organizations/index.d.ts +15 -0
  429. package/dist/organizations/index.d.ts.map +1 -0
  430. package/dist/organizations/index.js +15 -0
  431. package/dist/organizations/index.js.map +1 -0
  432. package/dist/organizations/repository.d.ts +183 -0
  433. package/dist/organizations/repository.d.ts.map +1 -0
  434. package/dist/organizations/repository.js +354 -0
  435. package/dist/organizations/repository.js.map +1 -0
  436. package/dist/organizations/service.d.ts +168 -0
  437. package/dist/organizations/service.d.ts.map +1 -0
  438. package/dist/organizations/service.js +511 -0
  439. package/dist/organizations/service.js.map +1 -0
  440. package/dist/organizations/slugs.d.ts +57 -0
  441. package/dist/organizations/slugs.d.ts.map +1 -0
  442. package/dist/organizations/slugs.js +130 -0
  443. package/dist/organizations/slugs.js.map +1 -0
  444. package/dist/organizations/types.d.ts +146 -0
  445. package/dist/organizations/types.d.ts.map +1 -0
  446. package/dist/organizations/types.js +49 -0
  447. package/dist/organizations/types.js.map +1 -0
  448. package/dist/rbac/cache.d.ts +110 -0
  449. package/dist/rbac/cache.d.ts.map +1 -0
  450. package/dist/rbac/cache.js +271 -0
  451. package/dist/rbac/cache.js.map +1 -0
  452. package/dist/rbac/errors.d.ts +34 -0
  453. package/dist/rbac/errors.d.ts.map +1 -0
  454. package/dist/rbac/errors.js +43 -0
  455. package/dist/rbac/errors.js.map +1 -0
  456. package/dist/rbac/index.d.ts +17 -0
  457. package/dist/rbac/index.d.ts.map +1 -0
  458. package/dist/rbac/index.js +21 -0
  459. package/dist/rbac/index.js.map +1 -0
  460. package/dist/rbac/mapping-repository.d.ts +121 -0
  461. package/dist/rbac/mapping-repository.d.ts.map +1 -0
  462. package/dist/rbac/mapping-repository.js +224 -0
  463. package/dist/rbac/mapping-repository.js.map +1 -0
  464. package/dist/rbac/permission-repository.d.ts +100 -0
  465. package/dist/rbac/permission-repository.d.ts.map +1 -0
  466. package/dist/rbac/permission-repository.js +190 -0
  467. package/dist/rbac/permission-repository.js.map +1 -0
  468. package/dist/rbac/permission-service.d.ts +85 -0
  469. package/dist/rbac/permission-service.d.ts.map +1 -0
  470. package/dist/rbac/permission-service.js +179 -0
  471. package/dist/rbac/permission-service.js.map +1 -0
  472. package/dist/rbac/role-repository.d.ts +104 -0
  473. package/dist/rbac/role-repository.d.ts.map +1 -0
  474. package/dist/rbac/role-repository.js +202 -0
  475. package/dist/rbac/role-repository.js.map +1 -0
  476. package/dist/rbac/role-service.d.ts +111 -0
  477. package/dist/rbac/role-service.d.ts.map +1 -0
  478. package/dist/rbac/role-service.js +256 -0
  479. package/dist/rbac/role-service.js.map +1 -0
  480. package/dist/rbac/slugs.d.ts +116 -0
  481. package/dist/rbac/slugs.d.ts.map +1 -0
  482. package/dist/rbac/slugs.js +178 -0
  483. package/dist/rbac/slugs.js.map +1 -0
  484. package/dist/rbac/types.d.ts +187 -0
  485. package/dist/rbac/types.d.ts.map +1 -0
  486. package/dist/rbac/types.js +75 -0
  487. package/dist/rbac/types.js.map +1 -0
  488. package/dist/rbac/user-role-service.d.ts +101 -0
  489. package/dist/rbac/user-role-service.d.ts.map +1 -0
  490. package/dist/rbac/user-role-service.js +166 -0
  491. package/dist/rbac/user-role-service.js.map +1 -0
  492. package/dist/routes/applications.d.ts +40 -0
  493. package/dist/routes/applications.d.ts.map +1 -0
  494. package/dist/routes/applications.js +284 -0
  495. package/dist/routes/applications.js.map +1 -0
  496. package/dist/routes/audit.d.ts +31 -0
  497. package/dist/routes/audit.d.ts.map +1 -0
  498. package/dist/routes/audit.js +140 -0
  499. package/dist/routes/audit.js.map +1 -0
  500. package/dist/routes/branding.d.ts +17 -0
  501. package/dist/routes/branding.d.ts.map +1 -0
  502. package/dist/routes/branding.js +104 -0
  503. package/dist/routes/branding.js.map +1 -0
  504. package/dist/routes/bulk.d.ts +37 -0
  505. package/dist/routes/bulk.d.ts.map +1 -0
  506. package/dist/routes/bulk.js +94 -0
  507. package/dist/routes/bulk.js.map +1 -0
  508. package/dist/routes/clients.d.ts +44 -0
  509. package/dist/routes/clients.d.ts.map +1 -0
  510. package/dist/routes/clients.js +353 -0
  511. package/dist/routes/clients.js.map +1 -0
  512. package/dist/routes/config.d.ts +35 -0
  513. package/dist/routes/config.d.ts.map +1 -0
  514. package/dist/routes/config.js +115 -0
  515. package/dist/routes/config.js.map +1 -0
  516. package/dist/routes/custom-claims.d.ts +38 -0
  517. package/dist/routes/custom-claims.d.ts.map +1 -0
  518. package/dist/routes/custom-claims.js +208 -0
  519. package/dist/routes/custom-claims.js.map +1 -0
  520. package/dist/routes/exports.d.ts +21 -0
  521. package/dist/routes/exports.d.ts.map +1 -0
  522. package/dist/routes/exports.js +98 -0
  523. package/dist/routes/exports.js.map +1 -0
  524. package/dist/routes/imports.d.ts +18 -0
  525. package/dist/routes/imports.d.ts.map +1 -0
  526. package/dist/routes/imports.js +72 -0
  527. package/dist/routes/imports.js.map +1 -0
  528. package/dist/routes/interactions.d.ts +111 -0
  529. package/dist/routes/interactions.d.ts.map +1 -0
  530. package/dist/routes/interactions.js +1074 -0
  531. package/dist/routes/interactions.js.map +1 -0
  532. package/dist/routes/invitation.d.ts +31 -0
  533. package/dist/routes/invitation.d.ts.map +1 -0
  534. package/dist/routes/invitation.js +342 -0
  535. package/dist/routes/invitation.js.map +1 -0
  536. package/dist/routes/keys.d.ts +28 -0
  537. package/dist/routes/keys.d.ts.map +1 -0
  538. package/dist/routes/keys.js +91 -0
  539. package/dist/routes/keys.js.map +1 -0
  540. package/dist/routes/magic-link.d.ts +43 -0
  541. package/dist/routes/magic-link.d.ts.map +1 -0
  542. package/dist/routes/magic-link.js +264 -0
  543. package/dist/routes/magic-link.js.map +1 -0
  544. package/dist/routes/organizations.d.ts +38 -0
  545. package/dist/routes/organizations.d.ts.map +1 -0
  546. package/dist/routes/organizations.js +347 -0
  547. package/dist/routes/organizations.js.map +1 -0
  548. package/dist/routes/password-reset.d.ts +65 -0
  549. package/dist/routes/password-reset.d.ts.map +1 -0
  550. package/dist/routes/password-reset.js +493 -0
  551. package/dist/routes/password-reset.js.map +1 -0
  552. package/dist/routes/permissions.d.ts +33 -0
  553. package/dist/routes/permissions.d.ts.map +1 -0
  554. package/dist/routes/permissions.js +166 -0
  555. package/dist/routes/permissions.js.map +1 -0
  556. package/dist/routes/roles.d.ts +37 -0
  557. package/dist/routes/roles.d.ts.map +1 -0
  558. package/dist/routes/roles.js +222 -0
  559. package/dist/routes/roles.js.map +1 -0
  560. package/dist/routes/sessions.d.ts +37 -0
  561. package/dist/routes/sessions.d.ts.map +1 -0
  562. package/dist/routes/sessions.js +121 -0
  563. package/dist/routes/sessions.js.map +1 -0
  564. package/dist/routes/stats.d.ts +28 -0
  565. package/dist/routes/stats.d.ts.map +1 -0
  566. package/dist/routes/stats.js +65 -0
  567. package/dist/routes/stats.js.map +1 -0
  568. package/dist/routes/two-factor-admin.d.ts +54 -0
  569. package/dist/routes/two-factor-admin.d.ts.map +1 -0
  570. package/dist/routes/two-factor-admin.js +344 -0
  571. package/dist/routes/two-factor-admin.js.map +1 -0
  572. package/dist/routes/two-factor.d.ts +31 -0
  573. package/dist/routes/two-factor.d.ts.map +1 -0
  574. package/dist/routes/two-factor.js +595 -0
  575. package/dist/routes/two-factor.js.map +1 -0
  576. package/dist/routes/user-roles.d.ts +33 -0
  577. package/dist/routes/user-roles.d.ts.map +1 -0
  578. package/dist/routes/user-roles.js +129 -0
  579. package/dist/routes/user-roles.js.map +1 -0
  580. package/dist/routes/users.d.ts +61 -0
  581. package/dist/routes/users.d.ts.map +1 -0
  582. package/dist/routes/users.js +868 -0
  583. package/dist/routes/users.js.map +1 -0
  584. package/dist/security/decision-context.d.ts +52 -0
  585. package/dist/security/decision-context.d.ts.map +1 -0
  586. package/dist/security/decision-context.js +150 -0
  587. package/dist/security/decision-context.js.map +1 -0
  588. package/dist/security/decision-event.d.ts +128 -0
  589. package/dist/security/decision-event.d.ts.map +1 -0
  590. package/dist/security/decision-event.js +225 -0
  591. package/dist/security/decision-event.js.map +1 -0
  592. package/dist/security/transport-decision.d.ts +6 -0
  593. package/dist/security/transport-decision.d.ts.map +1 -0
  594. package/dist/security/transport-decision.js +37 -0
  595. package/dist/security/transport-decision.js.map +1 -0
  596. package/dist/server.d.ts +50 -0
  597. package/dist/server.d.ts.map +1 -0
  598. package/dist/server.js +491 -0
  599. package/dist/server.js.map +1 -0
  600. package/dist/two-factor/cache.d.ts +47 -0
  601. package/dist/two-factor/cache.d.ts.map +1 -0
  602. package/dist/two-factor/cache.js +122 -0
  603. package/dist/two-factor/cache.js.map +1 -0
  604. package/dist/two-factor/crypto.d.ts +41 -0
  605. package/dist/two-factor/crypto.d.ts.map +1 -0
  606. package/dist/two-factor/crypto.js +94 -0
  607. package/dist/two-factor/crypto.js.map +1 -0
  608. package/dist/two-factor/errors.d.ts +82 -0
  609. package/dist/two-factor/errors.d.ts.map +1 -0
  610. package/dist/two-factor/errors.js +112 -0
  611. package/dist/two-factor/errors.js.map +1 -0
  612. package/dist/two-factor/index.d.ts +18 -0
  613. package/dist/two-factor/index.d.ts.map +1 -0
  614. package/dist/two-factor/index.js +25 -0
  615. package/dist/two-factor/index.js.map +1 -0
  616. package/dist/two-factor/otp.d.ts +43 -0
  617. package/dist/two-factor/otp.d.ts.map +1 -0
  618. package/dist/two-factor/otp.js +57 -0
  619. package/dist/two-factor/otp.js.map +1 -0
  620. package/dist/two-factor/recovery.d.ts +45 -0
  621. package/dist/two-factor/recovery.d.ts.map +1 -0
  622. package/dist/two-factor/recovery.js +104 -0
  623. package/dist/two-factor/recovery.js.map +1 -0
  624. package/dist/two-factor/repository.d.ts +156 -0
  625. package/dist/two-factor/repository.d.ts.map +1 -0
  626. package/dist/two-factor/repository.js +251 -0
  627. package/dist/two-factor/repository.js.map +1 -0
  628. package/dist/two-factor/service.d.ts +232 -0
  629. package/dist/two-factor/service.d.ts.map +1 -0
  630. package/dist/two-factor/service.js +599 -0
  631. package/dist/two-factor/service.js.map +1 -0
  632. package/dist/two-factor/totp.d.ts +57 -0
  633. package/dist/two-factor/totp.d.ts.map +1 -0
  634. package/dist/two-factor/totp.js +96 -0
  635. package/dist/two-factor/totp.js.map +1 -0
  636. package/dist/two-factor/types.d.ts +152 -0
  637. package/dist/two-factor/types.d.ts.map +1 -0
  638. package/dist/two-factor/types.js +64 -0
  639. package/dist/two-factor/types.js.map +1 -0
  640. package/dist/users/cache.d.ts +49 -0
  641. package/dist/users/cache.d.ts.map +1 -0
  642. package/dist/users/cache.js +140 -0
  643. package/dist/users/cache.js.map +1 -0
  644. package/dist/users/claims.d.ts +67 -0
  645. package/dist/users/claims.d.ts.map +1 -0
  646. package/dist/users/claims.js +104 -0
  647. package/dist/users/claims.js.map +1 -0
  648. package/dist/users/errors.d.ts +25 -0
  649. package/dist/users/errors.d.ts.map +1 -0
  650. package/dist/users/errors.js +31 -0
  651. package/dist/users/errors.js.map +1 -0
  652. package/dist/users/gdpr.d.ts +110 -0
  653. package/dist/users/gdpr.d.ts.map +1 -0
  654. package/dist/users/gdpr.js +211 -0
  655. package/dist/users/gdpr.js.map +1 -0
  656. package/dist/users/index.d.ts +20 -0
  657. package/dist/users/index.d.ts.map +1 -0
  658. package/dist/users/index.js +19 -0
  659. package/dist/users/index.js.map +1 -0
  660. package/dist/users/password.d.ts +85 -0
  661. package/dist/users/password.d.ts.map +1 -0
  662. package/dist/users/password.js +138 -0
  663. package/dist/users/password.js.map +1 -0
  664. package/dist/users/repository.d.ts +263 -0
  665. package/dist/users/repository.d.ts.map +1 -0
  666. package/dist/users/repository.js +499 -0
  667. package/dist/users/repository.js.map +1 -0
  668. package/dist/users/service.d.ts +299 -0
  669. package/dist/users/service.d.ts.map +1 -0
  670. package/dist/users/service.js +698 -0
  671. package/dist/users/service.js.map +1 -0
  672. package/dist/users/types.d.ts +220 -0
  673. package/dist/users/types.d.ts.map +1 -0
  674. package/dist/users/types.js +77 -0
  675. package/dist/users/types.js.map +1 -0
  676. package/locales/default/en/common.json +10 -0
  677. package/locales/default/en/consent.json +13 -0
  678. package/locales/default/en/emails.json +17 -0
  679. package/locales/default/en/errors.json +21 -0
  680. package/locales/default/en/forgot-password.json +11 -0
  681. package/locales/default/en/invitation.json +18 -0
  682. package/locales/default/en/login.json +17 -0
  683. package/locales/default/en/logout.json +9 -0
  684. package/locales/default/en/magic-link.json +12 -0
  685. package/locales/default/en/reset-password.json +16 -0
  686. package/locales/default/en/two-factor.json +29 -0
  687. package/migrations/.gitkeep +0 -0
  688. package/migrations/001_extensions.sql +22 -0
  689. package/migrations/002_organizations.sql +43 -0
  690. package/migrations/003_applications.sql +50 -0
  691. package/migrations/004_clients.sql +74 -0
  692. package/migrations/005_users.sql +119 -0
  693. package/migrations/006_roles_permissions.sql +80 -0
  694. package/migrations/007_custom_claims.sql +55 -0
  695. package/migrations/008_config.sql +51 -0
  696. package/migrations/009_audit_log.sql +31 -0
  697. package/migrations/010_oidc_adapter.sql +34 -0
  698. package/migrations/011_seed.sql +53 -0
  699. package/migrations/012_two_factor.sql +88 -0
  700. package/migrations/013_client_secret_sha256.sql +22 -0
  701. package/migrations/014_login_methods.sql +34 -0
  702. package/migrations/015_signing_key_encryption.sql +20 -0
  703. package/migrations/016_failed_login_count.sql +27 -0
  704. package/migrations/017_audit_retention.sql +11 -0
  705. package/migrations/018_admin_api_enhancements.sql +78 -0
  706. package/migrations/019_invitation_details.sql +27 -0
  707. package/migrations/020_two_factor_admin_permission.sql +108 -0
  708. package/migrations/021_auth_recovery_jobs.sql +74 -0
  709. package/migrations/022_recovery_artifact_ownership.sql +25 -0
  710. package/migrations/023_magic_link_authority.sql +39 -0
  711. package/package.json +106 -0
  712. package/templates/default/emails/invitation.hbs +39 -0
  713. package/templates/default/emails/invitation.txt.hbs +18 -0
  714. package/templates/default/emails/magic-link.hbs +30 -0
  715. package/templates/default/emails/magic-link.txt.hbs +11 -0
  716. package/templates/default/emails/otp-code.hbs +31 -0
  717. package/templates/default/emails/otp-code.txt.hbs +15 -0
  718. package/templates/default/emails/password-changed.hbs +24 -0
  719. package/templates/default/emails/password-changed.txt.hbs +7 -0
  720. package/templates/default/emails/password-reset.hbs +30 -0
  721. package/templates/default/emails/password-reset.txt.hbs +11 -0
  722. package/templates/default/emails/welcome.hbs +25 -0
  723. package/templates/default/emails/welcome.txt.hbs +9 -0
  724. package/templates/default/layouts/main.hbs +49 -0
  725. package/templates/default/pages/accept-invite.hbs +25 -0
  726. package/templates/default/pages/consent.hbs +27 -0
  727. package/templates/default/pages/error.hbs +15 -0
  728. package/templates/default/pages/forgot-password.hbs +21 -0
  729. package/templates/default/pages/invite-expired.hbs +6 -0
  730. package/templates/default/pages/invite-success.hbs +9 -0
  731. package/templates/default/pages/login.hbs +108 -0
  732. package/templates/default/pages/logout-success.hbs +5 -0
  733. package/templates/default/pages/logout.hbs +24 -0
  734. package/templates/default/pages/magic-link-sent.hbs +10 -0
  735. package/templates/default/pages/magic-link-success.hbs +17 -0
  736. package/templates/default/pages/reset-password.hbs +20 -0
  737. package/templates/default/pages/reset-success.hbs +9 -0
  738. package/templates/default/pages/two-factor-setup.hbs +65 -0
  739. package/templates/default/pages/two-factor-verify.hbs +77 -0
  740. package/templates/default/partials/flash-messages.hbs +10 -0
  741. package/templates/default/partials/footer.hbs +4 -0
  742. package/templates/default/partials/header.hbs +8 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Pluggable email transport abstraction.
3
+ *
4
+ * Defines a transport interface and provides a default SMTP implementation
5
+ * using Nodemailer. The interface allows swapping transports for testing
6
+ * (mock transport) or future providers (SES, SendGrid, etc.).
7
+ *
8
+ * SMTP configuration is read from the app config (`config.smtp.*`).
9
+ * Auth is only applied when `smtp.user` is provided — MailHog in dev
10
+ * doesn't need authentication.
11
+ *
12
+ * @example
13
+ * const transport = createSmtpTransport();
14
+ * const result = await transport.send({
15
+ * to: 'user@example.com',
16
+ * subject: 'Welcome',
17
+ * html: '<h1>Hello</h1>',
18
+ * text: 'Hello',
19
+ * });
20
+ */
21
+ import nodemailer from 'nodemailer';
22
+ import { config } from '../config/index.js';
23
+ import { logger } from '../lib/logger.js';
24
+ // ---------------------------------------------------------------------------
25
+ // SMTP Transport
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Create an SMTP email transport using Nodemailer.
29
+ *
30
+ * Reads SMTP configuration from the app config:
31
+ * - `config.smtp.host` — SMTP server hostname
32
+ * - `config.smtp.port` — SMTP port (465 = TLS, 587 = STARTTLS, 1025 = MailHog)
33
+ * - `config.smtp.user` — Username (optional, omit for MailHog)
34
+ * - `config.smtp.pass` — Password (optional)
35
+ * - `config.smtp.from` — Default sender address
36
+ *
37
+ * @returns EmailTransport implementation backed by Nodemailer SMTP
38
+ */
39
+ export function createSmtpTransport() {
40
+ // Build Nodemailer transport options from config
41
+ const transportOptions = {
42
+ host: config.smtp.host,
43
+ port: config.smtp.port,
44
+ // Port 465 uses implicit TLS; other ports use STARTTLS or plain
45
+ secure: config.smtp.port === 465,
46
+ };
47
+ // Only add auth when credentials are provided (MailHog doesn't need auth)
48
+ if (config.smtp.user) {
49
+ transportOptions.auth = {
50
+ user: config.smtp.user,
51
+ pass: config.smtp.pass ?? '',
52
+ };
53
+ }
54
+ const transporter = nodemailer.createTransport(transportOptions);
55
+ return {
56
+ /**
57
+ * Send an email via SMTP.
58
+ *
59
+ * @param options - Email send options
60
+ * @returns Result with messageId and accepted/rejected addresses
61
+ */
62
+ async send(options) {
63
+ const from = options.from ?? config.smtp.from;
64
+ logger.debug({ event: 'smtp_send_started' }, 'Sending email via SMTP');
65
+ const info = await transporter.sendMail({
66
+ from,
67
+ to: options.to,
68
+ subject: options.subject,
69
+ html: options.html,
70
+ text: options.text,
71
+ replyTo: options.replyTo,
72
+ ...(options.messageId ? { messageId: options.messageId } : {}),
73
+ });
74
+ return {
75
+ messageId: info.messageId,
76
+ accepted: Array.isArray(info.accepted) ? info.accepted.map(String) : [],
77
+ rejected: Array.isArray(info.rejected) ? info.rejected.map(String) : [],
78
+ };
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=email-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-transport.js","sourceRoot":"","sources":["../../src/auth/email-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAwC1C,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB;IACjC,iDAAiD;IACjD,MAAM,gBAAgB,GAKlB;QACF,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QACtB,gEAAgE;QAChE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG;KACjC,CAAC;IAEF,0EAA0E;IAC1E,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,gBAAgB,CAAC,IAAI,GAAG;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACtB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAgB,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAE9E,OAAO;QACL;;;;;WAKG;QACH,KAAK,CAAC,IAAI,CAAC,OAAyB;YAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAE9C,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAEvE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC;gBACtC,IAAI;gBACJ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;YAEH,OAAO;gBACL,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;gBACvE,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;aACxE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Internationalization (i18n) system for auth workflow pages.
3
+ *
4
+ * Uses i18next with filesystem backend to load translations from disk.
5
+ * Supports per-organization translation overrides:
6
+ * 1. Default translations: locales/default/{locale}/{namespace}.json
7
+ * 2. Org overrides: locales/{orgSlug}/{locale}/{namespace}.json
8
+ *
9
+ * The locale resolution chain prioritizes:
10
+ * 1. ui_locales from OIDC authorization request
11
+ * 2. Accept-Language header
12
+ * 3. Organization defaultLocale
13
+ * 4. Global default_locale from system_config
14
+ * 5. Hardcoded fallback: 'en'
15
+ *
16
+ * Also registers a Handlebars {{t}} helper for template translations.
17
+ *
18
+ * @example
19
+ * await initI18n();
20
+ * registerHandlebarsI18nHelper();
21
+ * const t = getTranslationFunction('en');
22
+ * t('login.title'); // => "Sign in to your account"
23
+ */
24
+ /**
25
+ * Initialize i18next with the filesystem backend.
26
+ *
27
+ * Loads translations from locales/default/{locale}/{namespace}.json.
28
+ * Must be called once at application startup before any translation
29
+ * functions are used.
30
+ *
31
+ * @throws Error if i18next initialization fails (fatal startup error)
32
+ */
33
+ export declare function initI18n(): Promise<void>;
34
+ /**
35
+ * Resolve the best locale for a request.
36
+ *
37
+ * Resolution chain (first non-empty match wins):
38
+ * 1. ui_locales from OIDC authorization request (space-separated list)
39
+ * 2. Accept-Language header (first language tag)
40
+ * 3. Organization defaultLocale
41
+ * 4. Global default_locale from system_config table
42
+ * 5. Hardcoded fallback: 'en'
43
+ *
44
+ * Only returns locales that i18next has loaded (verified via hasResourceBundle).
45
+ *
46
+ * @param uiLocales - Space-separated locale list from OIDC params (e.g., 'nl en')
47
+ * @param acceptLanguage - Accept-Language header value (e.g., 'en-US,en;q=0.9')
48
+ * @param orgDefaultLocale - Organization's default locale setting
49
+ * @returns Resolved locale string (e.g., 'en')
50
+ */
51
+ export declare function resolveLocale(uiLocales: string | undefined, acceptLanguage: string | undefined, orgDefaultLocale: string): Promise<string>;
52
+ /**
53
+ * Get a translation function for a specific locale with optional org overrides.
54
+ *
55
+ * Returns a function that looks up translation keys across all namespaces.
56
+ * If an orgSlug is provided, org-specific translations are merged on top
57
+ * of the defaults (overriding matching keys).
58
+ *
59
+ * The returned function uses namespace:key syntax internally but accepts
60
+ * plain keys that auto-resolve by checking each namespace.
61
+ *
62
+ * @param locale - Target locale (e.g., 'en')
63
+ * @param orgSlug - Optional org slug for translation overrides
64
+ * @returns Translation function: (key, options?) => translated string
65
+ */
66
+ export declare function getTranslationFunction(locale: string, orgSlug?: string): (key: string, options?: Record<string, unknown>) => string;
67
+ /**
68
+ * Register the {{t}} Handlebars helper for template translations.
69
+ *
70
+ * Must be called after i18next is initialized. The helper reads the
71
+ * translation function from the template context's `t` property.
72
+ *
73
+ * Usage in templates:
74
+ * {{t "login.title"}}
75
+ * {{t "common.welcome" name="Alice"}}
76
+ *
77
+ * The helper extracts the `t` function from the current Handlebars context
78
+ * and passes hash arguments as interpolation options.
79
+ */
80
+ export declare function registerHandlebarsI18nHelper(): void;
81
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA2CH;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB9C;AA8DD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAmDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAmG5D;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CA+BnD"}
@@ -0,0 +1,395 @@
1
+ /**
2
+ * Internationalization (i18n) system for auth workflow pages.
3
+ *
4
+ * Uses i18next with filesystem backend to load translations from disk.
5
+ * Supports per-organization translation overrides:
6
+ * 1. Default translations: locales/default/{locale}/{namespace}.json
7
+ * 2. Org overrides: locales/{orgSlug}/{locale}/{namespace}.json
8
+ *
9
+ * The locale resolution chain prioritizes:
10
+ * 1. ui_locales from OIDC authorization request
11
+ * 2. Accept-Language header
12
+ * 3. Organization defaultLocale
13
+ * 4. Global default_locale from system_config
14
+ * 5. Hardcoded fallback: 'en'
15
+ *
16
+ * Also registers a Handlebars {{t}} helper for template translations.
17
+ *
18
+ * @example
19
+ * await initI18n();
20
+ * registerHandlebarsI18nHelper();
21
+ * const t = getTranslationFunction('en');
22
+ * t('login.title'); // => "Sign in to your account"
23
+ */
24
+ import i18next from 'i18next';
25
+ import FsBackend from 'i18next-fs-backend';
26
+ import fs from 'node:fs/promises';
27
+ import path from 'node:path';
28
+ import Handlebars from 'handlebars';
29
+ import { getSystemConfigString } from '../lib/system-config.js';
30
+ import { logger } from '../lib/logger.js';
31
+ import { getLocalesDirectory } from '../lib/runtime-paths.js';
32
+ // ---------------------------------------------------------------------------
33
+ // Constants
34
+ // ---------------------------------------------------------------------------
35
+ /** Absolute directory containing locale files shipped with the server package. */
36
+ const LOCALES_DIR = getLocalesDirectory();
37
+ /**
38
+ * All translation namespaces loaded by default.
39
+ * Each maps to a JSON file: locales/{locale}/{namespace}.json
40
+ */
41
+ const NAMESPACES = [
42
+ 'common',
43
+ 'login',
44
+ 'consent',
45
+ 'forgot-password',
46
+ 'reset-password',
47
+ 'magic-link',
48
+ 'invitation',
49
+ 'logout',
50
+ 'errors',
51
+ 'emails',
52
+ 'two-factor',
53
+ ];
54
+ /** Hardcoded fallback locale when all resolution steps fail */
55
+ const FALLBACK_LOCALE = 'en';
56
+ // ---------------------------------------------------------------------------
57
+ // i18next initialization
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Initialize i18next with the filesystem backend.
61
+ *
62
+ * Loads translations from locales/default/{locale}/{namespace}.json.
63
+ * Must be called once at application startup before any translation
64
+ * functions are used.
65
+ *
66
+ * @throws Error if i18next initialization fails (fatal startup error)
67
+ */
68
+ export async function initI18n() {
69
+ await i18next.use(FsBackend).init({
70
+ // Default fallback language
71
+ fallbackLng: FALLBACK_LOCALE,
72
+ // Namespaces to load
73
+ ns: [...NAMESPACES],
74
+ defaultNS: 'common',
75
+ // Filesystem backend configuration
76
+ backend: {
77
+ loadPath: path.join(LOCALES_DIR, 'default', '{{lng}}', '{{ns}}.json'),
78
+ },
79
+ // Disable key-based fallback (return key as-is if missing)
80
+ returnNull: false,
81
+ // Interpolation uses {{variable}} by default — same as Handlebars,
82
+ // but i18next escapes by default which is safe for HTML contexts
83
+ interpolation: {
84
+ escapeValue: false,
85
+ },
86
+ // Don't try to detect language from environment
87
+ detection: undefined,
88
+ // Preload English locale at startup
89
+ preload: [FALLBACK_LOCALE],
90
+ });
91
+ logger.info({ localesDir: LOCALES_DIR }, 'i18n initialized');
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // Org-specific override loading
95
+ // ---------------------------------------------------------------------------
96
+ /**
97
+ * Load org-specific translation overrides for a namespace.
98
+ *
99
+ * Checks for locales/{orgSlug}/{locale}/{namespace}.json and returns
100
+ * the parsed JSON if found, or null if no override exists.
101
+ *
102
+ * @param orgSlug - Organization slug for override lookup
103
+ * @param locale - Target locale (e.g., 'en')
104
+ * @param namespace - Translation namespace (e.g., 'login')
105
+ * @returns Parsed override translations, or null if none exist
106
+ */
107
+ async function loadOrgOverrides(orgSlug, locale, namespace) {
108
+ const overridePath = path.join(LOCALES_DIR, orgSlug, locale, `${namespace}.json`);
109
+ try {
110
+ const content = await fs.readFile(overridePath, 'utf-8');
111
+ return JSON.parse(content);
112
+ }
113
+ catch {
114
+ // No override file — this is normal, not an error
115
+ return null;
116
+ }
117
+ }
118
+ /**
119
+ * Deep-merge org overrides into a flat key-value map.
120
+ *
121
+ * Flattens nested objects into dot-notation keys for i18next lookup.
122
+ * For example: { login: { title: "Custom" } } => { "login.title": "Custom" }
123
+ *
124
+ * @param obj - Nested object to flatten
125
+ * @param prefix - Current key prefix (for recursion)
126
+ * @returns Flat key-value map
127
+ */
128
+ function flattenOverrides(obj, prefix = '') {
129
+ const result = {};
130
+ for (const [key, value] of Object.entries(obj)) {
131
+ const fullKey = prefix ? `${prefix}.${key}` : key;
132
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
133
+ Object.assign(result, flattenOverrides(value, fullKey));
134
+ }
135
+ else {
136
+ result[fullKey] = String(value);
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ // ---------------------------------------------------------------------------
142
+ // Locale resolution
143
+ // ---------------------------------------------------------------------------
144
+ /**
145
+ * Resolve the best locale for a request.
146
+ *
147
+ * Resolution chain (first non-empty match wins):
148
+ * 1. ui_locales from OIDC authorization request (space-separated list)
149
+ * 2. Accept-Language header (first language tag)
150
+ * 3. Organization defaultLocale
151
+ * 4. Global default_locale from system_config table
152
+ * 5. Hardcoded fallback: 'en'
153
+ *
154
+ * Only returns locales that i18next has loaded (verified via hasResourceBundle).
155
+ *
156
+ * @param uiLocales - Space-separated locale list from OIDC params (e.g., 'nl en')
157
+ * @param acceptLanguage - Accept-Language header value (e.g., 'en-US,en;q=0.9')
158
+ * @param orgDefaultLocale - Organization's default locale setting
159
+ * @returns Resolved locale string (e.g., 'en')
160
+ */
161
+ export async function resolveLocale(uiLocales, acceptLanguage, orgDefaultLocale) {
162
+ // Step 1: Try ui_locales from OIDC authorization request
163
+ if (uiLocales) {
164
+ const candidates = uiLocales.split(/\s+/).filter(Boolean);
165
+ for (const candidate of candidates) {
166
+ const normalized = normalizeLocale(candidate);
167
+ if (isLocaleAvailable(normalized)) {
168
+ return normalized;
169
+ }
170
+ }
171
+ }
172
+ // Step 2: Try Accept-Language header
173
+ if (acceptLanguage) {
174
+ const parsed = parseAcceptLanguage(acceptLanguage);
175
+ for (const candidate of parsed) {
176
+ const normalized = normalizeLocale(candidate);
177
+ if (isLocaleAvailable(normalized)) {
178
+ return normalized;
179
+ }
180
+ }
181
+ }
182
+ // Step 3: Try organization default locale
183
+ if (orgDefaultLocale) {
184
+ const normalized = normalizeLocale(orgDefaultLocale);
185
+ if (isLocaleAvailable(normalized)) {
186
+ return normalized;
187
+ }
188
+ }
189
+ // Step 4: Try global default_locale from system_config
190
+ const globalDefault = await getSystemConfigString('default_locale', FALLBACK_LOCALE);
191
+ const normalized = normalizeLocale(globalDefault);
192
+ if (isLocaleAvailable(normalized)) {
193
+ return normalized;
194
+ }
195
+ // Step 5: Hardcoded fallback
196
+ return FALLBACK_LOCALE;
197
+ }
198
+ /**
199
+ * Normalize a locale string to its base language code.
200
+ * Strips region/variant suffixes: 'en-US' → 'en', 'nl-NL' → 'nl'.
201
+ *
202
+ * @param locale - Raw locale string
203
+ * @returns Lowercase base language code
204
+ */
205
+ function normalizeLocale(locale) {
206
+ return locale.toLowerCase().split(/[-_]/)[0];
207
+ }
208
+ /**
209
+ * Check if a locale has loaded translations in i18next.
210
+ *
211
+ * @param locale - Locale to check
212
+ * @returns true if translations exist for this locale
213
+ */
214
+ function isLocaleAvailable(locale) {
215
+ // Check if at least the 'common' namespace has been loaded
216
+ return i18next.hasResourceBundle(locale, 'common');
217
+ }
218
+ /**
219
+ * Parse an Accept-Language header into ordered language codes.
220
+ *
221
+ * Handles quality values (q=) and returns languages sorted by preference.
222
+ * Example: 'en-US,en;q=0.9,nl;q=0.8' → ['en-US', 'en', 'nl']
223
+ *
224
+ * @param header - Accept-Language header value
225
+ * @returns Array of language codes, highest quality first
226
+ */
227
+ function parseAcceptLanguage(header) {
228
+ return header
229
+ .split(',')
230
+ .map((part) => {
231
+ const [lang, ...params] = part.trim().split(';');
232
+ const qParam = params.find((p) => p.trim().startsWith('q='));
233
+ const q = qParam ? parseFloat(qParam.trim().slice(2)) : 1.0;
234
+ return { lang: lang.trim(), q };
235
+ })
236
+ .sort((a, b) => b.q - a.q)
237
+ .map((entry) => entry.lang)
238
+ .filter(Boolean);
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // Translation function
242
+ // ---------------------------------------------------------------------------
243
+ /**
244
+ * Get a translation function for a specific locale with optional org overrides.
245
+ *
246
+ * Returns a function that looks up translation keys across all namespaces.
247
+ * If an orgSlug is provided, org-specific translations are merged on top
248
+ * of the defaults (overriding matching keys).
249
+ *
250
+ * The returned function uses namespace:key syntax internally but accepts
251
+ * plain keys that auto-resolve by checking each namespace.
252
+ *
253
+ * @param locale - Target locale (e.g., 'en')
254
+ * @param orgSlug - Optional org slug for translation overrides
255
+ * @returns Translation function: (key, options?) => translated string
256
+ */
257
+ export function getTranslationFunction(locale, orgSlug) {
258
+ // Cache for org overrides loaded during this function's lifetime
259
+ const orgOverrideCache = new Map();
260
+ let orgOverridesLoaded = false;
261
+ /**
262
+ * Lazily load all org overrides for the given locale.
263
+ * Only runs once per translation function instance.
264
+ */
265
+ async function ensureOrgOverrides() {
266
+ if (orgOverridesLoaded || !orgSlug)
267
+ return;
268
+ orgOverridesLoaded = true;
269
+ for (const ns of NAMESPACES) {
270
+ const overrides = await loadOrgOverrides(orgSlug, locale, ns);
271
+ if (overrides) {
272
+ orgOverrideCache.set(ns, flattenOverrides(overrides));
273
+ }
274
+ }
275
+ }
276
+ // Pre-load org overrides eagerly (fire-and-forget — they'll be ready by first use)
277
+ if (orgSlug) {
278
+ ensureOrgOverrides().catch((error) => {
279
+ logger.warn({ error, orgSlug, locale }, 'Failed to load org translation overrides');
280
+ });
281
+ }
282
+ /**
283
+ * Translation function that resolves keys across namespaces.
284
+ *
285
+ * Key resolution:
286
+ * 1. Check org overrides (if loaded)
287
+ * 2. Use i18next standard lookup with namespace detection
288
+ * 3. Fall back to key itself if no translation found
289
+ */
290
+ return (key, options) => {
291
+ // Determine namespace and key parts
292
+ const colonIndex = key.indexOf(':');
293
+ let ns;
294
+ let lookupKey;
295
+ if (colonIndex > -1) {
296
+ // Explicit namespace: "login:title"
297
+ ns = key.substring(0, colonIndex);
298
+ lookupKey = key.substring(colonIndex + 1);
299
+ }
300
+ else {
301
+ // Dot-notation: "login.title" — first segment is the namespace
302
+ const dotIndex = key.indexOf('.');
303
+ if (dotIndex > -1) {
304
+ const possibleNs = key.substring(0, dotIndex);
305
+ if (NAMESPACES.includes(possibleNs)) {
306
+ ns = possibleNs;
307
+ lookupKey = key.substring(dotIndex + 1);
308
+ }
309
+ else {
310
+ lookupKey = key;
311
+ }
312
+ }
313
+ else {
314
+ lookupKey = key;
315
+ }
316
+ }
317
+ // Check org overrides first
318
+ if (ns && orgOverrideCache.has(ns)) {
319
+ const overrides = orgOverrideCache.get(ns);
320
+ if (lookupKey in overrides) {
321
+ let result = overrides[lookupKey];
322
+ // Apply simple interpolation for org overrides
323
+ if (options) {
324
+ for (const [varKey, varValue] of Object.entries(options)) {
325
+ result = result.replace(new RegExp(`\\{\\{${varKey}\\}\\}`, 'g'), String(varValue));
326
+ }
327
+ }
328
+ return result;
329
+ }
330
+ }
331
+ // Use i18next for standard lookup
332
+ const i18nKey = ns ? `${ns}:${lookupKey}` : lookupKey;
333
+ const translated = i18next.t(i18nKey, {
334
+ lng: locale,
335
+ ...(options ?? {}),
336
+ });
337
+ let result = typeof translated === 'string' ? translated : key;
338
+ // Fallback interpolation: if i18next did not replace {{variable}} placeholders
339
+ // (e.g., due to version-specific behavior or caching), perform manual replacement.
340
+ // This mirrors the org-override interpolation logic above.
341
+ if (options && result.includes('{{')) {
342
+ for (const [varKey, varValue] of Object.entries(options)) {
343
+ if (varValue !== undefined) {
344
+ result = result.replace(new RegExp(`\\{\\{${varKey}\\}\\}`, 'g'), String(varValue));
345
+ }
346
+ }
347
+ }
348
+ return result;
349
+ };
350
+ }
351
+ // ---------------------------------------------------------------------------
352
+ // Handlebars i18n helper
353
+ // ---------------------------------------------------------------------------
354
+ /**
355
+ * Register the {{t}} Handlebars helper for template translations.
356
+ *
357
+ * Must be called after i18next is initialized. The helper reads the
358
+ * translation function from the template context's `t` property.
359
+ *
360
+ * Usage in templates:
361
+ * {{t "login.title"}}
362
+ * {{t "common.welcome" name="Alice"}}
363
+ *
364
+ * The helper extracts the `t` function from the current Handlebars context
365
+ * and passes hash arguments as interpolation options.
366
+ */
367
+ export function registerHandlebarsI18nHelper() {
368
+ Handlebars.registerHelper('t', function (key, options) {
369
+ // The translation function is passed in the template context.
370
+ // Inside {{#each}} blocks, `this` is the current item (e.g., a string),
371
+ // so we fall back to the root context to find the `t` function.
372
+ const t = (this.t ?? options?.data?.root?.t);
373
+ if (!t) {
374
+ // No translation function available — return the key as fallback
375
+ logger.warn({ key }, 'Handlebars {{t}} helper called without translation function in context');
376
+ return key;
377
+ }
378
+ // Pass Handlebars hash arguments as interpolation options
379
+ // e.g., {{t "common.welcome" name="Alice"}} → t("common.welcome", { name: "Alice" })
380
+ const hashOptions = options?.hash ?? {};
381
+ // Resolve undefined hash values from the root context.
382
+ // Handlebars may pass `undefined` for hash values like `maskedEmail=maskedEmail`
383
+ // if the identifier resolution fails in certain scope contexts. Fall back to
384
+ // the root data context to ensure interpolation variables are available.
385
+ const root = (options?.data?.root ?? this);
386
+ for (const [hashKey, hashValue] of Object.entries(hashOptions)) {
387
+ if (hashValue === undefined && root[hashKey] !== undefined) {
388
+ hashOptions[hashKey] = root[hashKey];
389
+ }
390
+ }
391
+ return t(key, hashOptions);
392
+ });
393
+ logger.debug('Handlebars {{t}} i18n helper registered');
394
+ }
395
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/auth/i18n.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Auth module barrel export.
3
+ *
4
+ * Re-exports all public APIs from the auth module for convenient importing.
5
+ * Consumers should import from this barrel rather than reaching into
6
+ * individual files (respects module boundary convention).
7
+ *
8
+ * @example
9
+ * import { generateToken, hashToken, generateCsrfToken } from './auth/index.js';
10
+ */
11
+ export { generateToken, hashToken } from './tokens.js';
12
+ export type { GeneratedToken } from './tokens.js';
13
+ export { insertToken, insertInvitationToken, findValidToken, findValidInvitationToken, markTokenUsed, deleteExpiredTokens, invalidateUserTokens, } from './token-repository.js';
14
+ export type { TokenTable, GenericInsertTokenTable, TokenRecord, InvitationTokenRecord, } from './token-repository.js';
15
+ export { generateCsrfToken, verifyCsrfToken, setCsrfCookie, getCsrfFromCookie } from './csrf.js';
16
+ export { checkRateLimit, checkRateLimitStrict, resetRateLimit, buildLoginRateLimitKey, buildMagicLinkRateLimitKey, buildMagicLinkCallbackRateLimitKey, buildPasswordResetRateLimitKey, loadLoginRateLimitConfig, loadMagicLinkRateLimitConfig, loadPasswordResetRateLimitConfig, } from './rate-limiter.js';
17
+ export type { RateLimitResult, RateLimitConfig } from './rate-limiter.js';
18
+ export { createSmtpTransport } from './email-transport.js';
19
+ export type { EmailTransport, SendEmailOptions, EmailResult } from './email-transport.js';
20
+ export { renderEmail } from './email-renderer.js';
21
+ export { sendMagicLinkEmail, sendPasswordResetEmail, sendInvitationEmail, renderInvitationEmail, sendWelcomeEmail, sendPasswordChangedEmail, setEmailTransport, } from './email-service.js';
22
+ export type { EmailUser, EmailOrganization, InvitationEmailOptions } from './email-service.js';
23
+ export { initI18n, resolveLocale, getTranslationFunction, registerHandlebarsI18nHelper, } from './i18n.js';
24
+ export { initTemplateEngine, renderPage } from './template-engine.js';
25
+ export type { TemplateContext } from './template-engine.js';
26
+ export { createMagicLinkSession, consumeMagicLinkSession, hasMagicLinkSession, clearMagicLinkSessionCookie, } from './magic-link-session.js';
27
+ export type { MagicLinkSessionData } from './magic-link-session.js';
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,UAAU,EACV,uBAAuB,EACvB,WAAW,EACX,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGjG,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAG1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG1F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG/F,OAAO,EACL,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Auth module barrel export.
3
+ *
4
+ * Re-exports all public APIs from the auth module for convenient importing.
5
+ * Consumers should import from this barrel rather than reaching into
6
+ * individual files (respects module boundary convention).
7
+ *
8
+ * @example
9
+ * import { generateToken, hashToken, generateCsrfToken } from './auth/index.js';
10
+ */
11
+ // Token generation and hashing
12
+ export { generateToken, hashToken } from './tokens.js';
13
+ // Token repository (PostgreSQL CRUD for all 3 token tables)
14
+ export { insertToken, insertInvitationToken, findValidToken, findValidInvitationToken, markTokenUsed, deleteExpiredTokens, invalidateUserTokens, } from './token-repository.js';
15
+ // CSRF protection
16
+ export { generateCsrfToken, verifyCsrfToken, setCsrfCookie, getCsrfFromCookie } from './csrf.js';
17
+ // Rate limiting
18
+ export { checkRateLimit, checkRateLimitStrict, resetRateLimit, buildLoginRateLimitKey, buildMagicLinkRateLimitKey, buildMagicLinkCallbackRateLimitKey, buildPasswordResetRateLimitKey, loadLoginRateLimitConfig, loadMagicLinkRateLimitConfig, loadPasswordResetRateLimitConfig, } from './rate-limiter.js';
19
+ // Email transport
20
+ export { createSmtpTransport } from './email-transport.js';
21
+ // Email renderer
22
+ export { renderEmail } from './email-renderer.js';
23
+ // Email service
24
+ export { sendMagicLinkEmail, sendPasswordResetEmail, sendInvitationEmail, renderInvitationEmail, sendWelcomeEmail, sendPasswordChangedEmail, setEmailTransport, } from './email-service.js';
25
+ // i18n
26
+ export { initI18n, resolveLocale, getTranslationFunction, registerHandlebarsI18nHelper, } from './i18n.js';
27
+ // Template engine
28
+ export { initTemplateEngine, renderPage } from './template-engine.js';
29
+ // Magic link session (cross-browser flow)
30
+ export { createMagicLinkSession, consumeMagicLinkSession, hasMagicLinkSession, clearMagicLinkSessionCookie, } from './magic-link-session.js';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,+BAA+B;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGvD,4DAA4D;AAC5D,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAQ/B,kBAAkB;AAClB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEjG,gBAAgB;AAChB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,EAC1B,kCAAkC,EAClC,8BAA8B,EAC9B,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,GACjC,MAAM,mBAAmB,CAAC;AAG3B,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG3D,iBAAiB;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,gBAAgB;AAChB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO;AACP,OAAO,EACL,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AAEnB,kBAAkB;AAClB,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGtE,0CAA0C;AAC1C,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC"}