@trokky/trokky 2.0.3

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 (639) hide show
  1. package/dist/adapters/filesystem/filesystem-adapter.d.ts +80 -0
  2. package/dist/adapters/filesystem/filesystem-adapter.d.ts.map +1 -0
  3. package/dist/adapters/filesystem/filesystem-adapter.js +1370 -0
  4. package/dist/adapters/filesystem/filesystem-adapter.js.map +1 -0
  5. package/dist/adapters/filesystem/index.d.ts +29 -0
  6. package/dist/adapters/filesystem/index.d.ts.map +1 -0
  7. package/dist/adapters/filesystem/index.js +31 -0
  8. package/dist/adapters/filesystem/index.js.map +1 -0
  9. package/dist/adapters/filesystem/types.d.ts +111 -0
  10. package/dist/adapters/filesystem/types.d.ts.map +1 -0
  11. package/dist/adapters/filesystem/types.js +2 -0
  12. package/dist/adapters/filesystem/types.js.map +1 -0
  13. package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts +111 -0
  14. package/dist/adapters/filesystem-data/filesystem-data-adapter.d.ts.map +1 -0
  15. package/dist/adapters/filesystem-data/filesystem-data-adapter.js +1363 -0
  16. package/dist/adapters/filesystem-data/filesystem-data-adapter.js.map +1 -0
  17. package/dist/adapters/filesystem-data/index.d.ts +3 -0
  18. package/dist/adapters/filesystem-data/index.d.ts.map +1 -0
  19. package/dist/adapters/filesystem-data/index.js +13 -0
  20. package/dist/adapters/filesystem-data/index.js.map +1 -0
  21. package/dist/adapters/filesystem-data/types.d.ts +147 -0
  22. package/dist/adapters/filesystem-data/types.d.ts.map +1 -0
  23. package/dist/adapters/filesystem-data/types.js +2 -0
  24. package/dist/adapters/filesystem-data/types.js.map +1 -0
  25. package/dist/adapters/filesystem-media/filesystem-media-adapter.d.ts +32 -0
  26. package/dist/adapters/filesystem-media/filesystem-media-adapter.d.ts.map +1 -0
  27. package/dist/adapters/filesystem-media/filesystem-media-adapter.js +639 -0
  28. package/dist/adapters/filesystem-media/filesystem-media-adapter.js.map +1 -0
  29. package/dist/adapters/filesystem-media/index.d.ts +3 -0
  30. package/dist/adapters/filesystem-media/index.d.ts.map +1 -0
  31. package/dist/adapters/filesystem-media/index.js +13 -0
  32. package/dist/adapters/filesystem-media/index.js.map +1 -0
  33. package/dist/adapters/filesystem-media/types.d.ts +76 -0
  34. package/dist/adapters/filesystem-media/types.d.ts.map +1 -0
  35. package/dist/adapters/filesystem-media/types.js +2 -0
  36. package/dist/adapters/filesystem-media/types.js.map +1 -0
  37. package/dist/adapters/postgres-data/index.d.ts +3 -0
  38. package/dist/adapters/postgres-data/index.d.ts.map +1 -0
  39. package/dist/adapters/postgres-data/index.js +13 -0
  40. package/dist/adapters/postgres-data/index.js.map +1 -0
  41. package/dist/adapters/postgres-data/postgres-data-adapter.d.ts +154 -0
  42. package/dist/adapters/postgres-data/postgres-data-adapter.d.ts.map +1 -0
  43. package/dist/adapters/postgres-data/postgres-data-adapter.js +1432 -0
  44. package/dist/adapters/postgres-data/postgres-data-adapter.js.map +1 -0
  45. package/dist/adapters/postgres-data/types.d.ts +139 -0
  46. package/dist/adapters/postgres-data/types.d.ts.map +1 -0
  47. package/dist/adapters/postgres-data/types.js +2 -0
  48. package/dist/adapters/postgres-data/types.js.map +1 -0
  49. package/dist/core/adapters/registry.d.ts +79 -0
  50. package/dist/core/adapters/registry.d.ts.map +1 -0
  51. package/dist/core/adapters/registry.js +149 -0
  52. package/dist/core/adapters/registry.js.map +1 -0
  53. package/dist/core/core/engine.d.ts +551 -0
  54. package/dist/core/core/engine.d.ts.map +1 -0
  55. package/dist/core/core/engine.js +1074 -0
  56. package/dist/core/core/engine.js.map +1 -0
  57. package/dist/core/crypto/adapter.d.ts +63 -0
  58. package/dist/core/crypto/adapter.d.ts.map +1 -0
  59. package/dist/core/crypto/adapter.js +63 -0
  60. package/dist/core/crypto/adapter.js.map +1 -0
  61. package/dist/core/crypto/fallback-adapter.d.ts +23 -0
  62. package/dist/core/crypto/fallback-adapter.d.ts.map +1 -0
  63. package/dist/core/crypto/fallback-adapter.js +195 -0
  64. package/dist/core/crypto/fallback-adapter.js.map +1 -0
  65. package/dist/core/crypto/node-adapter.d.ts +20 -0
  66. package/dist/core/crypto/node-adapter.d.ts.map +1 -0
  67. package/dist/core/crypto/node-adapter.js +85 -0
  68. package/dist/core/crypto/node-adapter.js.map +1 -0
  69. package/dist/core/crypto/password-hash.d.ts +73 -0
  70. package/dist/core/crypto/password-hash.d.ts.map +1 -0
  71. package/dist/core/crypto/password-hash.js +244 -0
  72. package/dist/core/crypto/password-hash.js.map +1 -0
  73. package/dist/core/crypto/webcrypto-adapter.d.ts +24 -0
  74. package/dist/core/crypto/webcrypto-adapter.d.ts.map +1 -0
  75. package/dist/core/crypto/webcrypto-adapter.js +158 -0
  76. package/dist/core/crypto/webcrypto-adapter.js.map +1 -0
  77. package/dist/core/errors/index.d.ts +30 -0
  78. package/dist/core/errors/index.d.ts.map +1 -0
  79. package/dist/core/errors/index.js +61 -0
  80. package/dist/core/errors/index.js.map +1 -0
  81. package/dist/core/events/event-bus.d.ts +121 -0
  82. package/dist/core/events/event-bus.d.ts.map +1 -0
  83. package/dist/core/events/event-bus.js +631 -0
  84. package/dist/core/events/event-bus.js.map +1 -0
  85. package/dist/core/events/index.d.ts +17 -0
  86. package/dist/core/events/index.d.ts.map +1 -0
  87. package/dist/core/events/index.js +22 -0
  88. package/dist/core/events/index.js.map +1 -0
  89. package/dist/core/events/memory-storage.d.ts +57 -0
  90. package/dist/core/events/memory-storage.d.ts.map +1 -0
  91. package/dist/core/events/memory-storage.js +175 -0
  92. package/dist/core/events/memory-storage.js.map +1 -0
  93. package/dist/core/events/types.d.ts +434 -0
  94. package/dist/core/events/types.d.ts.map +1 -0
  95. package/dist/core/events/types.js +9 -0
  96. package/dist/core/events/types.js.map +1 -0
  97. package/dist/core/events/utils.d.ts +134 -0
  98. package/dist/core/events/utils.d.ts.map +1 -0
  99. package/dist/core/events/utils.js +333 -0
  100. package/dist/core/events/utils.js.map +1 -0
  101. package/dist/core/fields/conditional.d.ts +115 -0
  102. package/dist/core/fields/conditional.d.ts.map +1 -0
  103. package/dist/core/fields/conditional.js +296 -0
  104. package/dist/core/fields/conditional.js.map +1 -0
  105. package/dist/core/fields/field-type.d.ts +218 -0
  106. package/dist/core/fields/field-type.d.ts.map +1 -0
  107. package/dist/core/fields/field-type.js +17 -0
  108. package/dist/core/fields/field-type.js.map +1 -0
  109. package/dist/core/fields/helpers.d.ts +86 -0
  110. package/dist/core/fields/helpers.d.ts.map +1 -0
  111. package/dist/core/fields/helpers.js +260 -0
  112. package/dist/core/fields/helpers.js.map +1 -0
  113. package/dist/core/fields/index.d.ts +5 -0
  114. package/dist/core/fields/index.d.ts.map +1 -0
  115. package/dist/core/fields/index.js +6 -0
  116. package/dist/core/fields/index.js.map +1 -0
  117. package/dist/core/fields/registry.d.ts +78 -0
  118. package/dist/core/fields/registry.d.ts.map +1 -0
  119. package/dist/core/fields/registry.js +185 -0
  120. package/dist/core/fields/registry.js.map +1 -0
  121. package/dist/core/index.d.ts +39 -0
  122. package/dist/core/index.d.ts.map +1 -0
  123. package/dist/core/index.js +57 -0
  124. package/dist/core/index.js.map +1 -0
  125. package/dist/core/media/image-processor.d.ts +24 -0
  126. package/dist/core/media/image-processor.d.ts.map +1 -0
  127. package/dist/core/media/image-processor.js +69 -0
  128. package/dist/core/media/image-processor.js.map +1 -0
  129. package/dist/core/media/processors/cloudflare-images.d.ts +83 -0
  130. package/dist/core/media/processors/cloudflare-images.d.ts.map +1 -0
  131. package/dist/core/media/processors/cloudflare-images.js +241 -0
  132. package/dist/core/media/processors/cloudflare-images.js.map +1 -0
  133. package/dist/core/media/processors/cloudflare-transform-store.d.ts +127 -0
  134. package/dist/core/media/processors/cloudflare-transform-store.d.ts.map +1 -0
  135. package/dist/core/media/processors/cloudflare-transform-store.js +237 -0
  136. package/dist/core/media/processors/cloudflare-transform-store.js.map +1 -0
  137. package/dist/core/media/processors/cloudflare-transformations.d.ts +81 -0
  138. package/dist/core/media/processors/cloudflare-transformations.d.ts.map +1 -0
  139. package/dist/core/media/processors/cloudflare-transformations.js +144 -0
  140. package/dist/core/media/processors/cloudflare-transformations.js.map +1 -0
  141. package/dist/core/media/processors/index.d.ts +9 -0
  142. package/dist/core/media/processors/index.d.ts.map +1 -0
  143. package/dist/core/media/processors/index.js +13 -0
  144. package/dist/core/media/processors/index.js.map +1 -0
  145. package/dist/core/media/processors/noop.d.ts +22 -0
  146. package/dist/core/media/processors/noop.d.ts.map +1 -0
  147. package/dist/core/media/processors/noop.js +38 -0
  148. package/dist/core/media/processors/noop.js.map +1 -0
  149. package/dist/core/media/processors/sharp.d.ts +30 -0
  150. package/dist/core/media/processors/sharp.d.ts.map +1 -0
  151. package/dist/core/media/processors/sharp.js +126 -0
  152. package/dist/core/media/processors/sharp.js.map +1 -0
  153. package/dist/core/media/processors/types.d.ts +67 -0
  154. package/dist/core/media/processors/types.d.ts.map +1 -0
  155. package/dist/core/media/processors/types.js +42 -0
  156. package/dist/core/media/processors/types.js.map +1 -0
  157. package/dist/core/media/processors/workers-images.d.ts +112 -0
  158. package/dist/core/media/processors/workers-images.d.ts.map +1 -0
  159. package/dist/core/media/processors/workers-images.js +257 -0
  160. package/dist/core/media/processors/workers-images.js.map +1 -0
  161. package/dist/core/schema/registry.d.ts +41 -0
  162. package/dist/core/schema/registry.d.ts.map +1 -0
  163. package/dist/core/schema/registry.js +248 -0
  164. package/dist/core/schema/registry.js.map +1 -0
  165. package/dist/core/schema/singleton.d.ts +107 -0
  166. package/dist/core/schema/singleton.d.ts.map +1 -0
  167. package/dist/core/schema/singleton.js +180 -0
  168. package/dist/core/schema/singleton.js.map +1 -0
  169. package/dist/core/security/auth.d.ts +120 -0
  170. package/dist/core/security/auth.d.ts.map +1 -0
  171. package/dist/core/security/auth.js +274 -0
  172. package/dist/core/security/auth.js.map +1 -0
  173. package/dist/core/security/captcha/index.d.ts +21 -0
  174. package/dist/core/security/captcha/index.d.ts.map +1 -0
  175. package/dist/core/security/captcha/index.js +34 -0
  176. package/dist/core/security/captcha/index.js.map +1 -0
  177. package/dist/core/security/captcha/recaptcha.d.ts +41 -0
  178. package/dist/core/security/captcha/recaptcha.d.ts.map +1 -0
  179. package/dist/core/security/captcha/recaptcha.js +89 -0
  180. package/dist/core/security/captcha/recaptcha.js.map +1 -0
  181. package/dist/core/security/captcha/turnstile.d.ts +41 -0
  182. package/dist/core/security/captcha/turnstile.d.ts.map +1 -0
  183. package/dist/core/security/captcha/turnstile.js +90 -0
  184. package/dist/core/security/captcha/turnstile.js.map +1 -0
  185. package/dist/core/security/captcha/types.d.ts +66 -0
  186. package/dist/core/security/captcha/types.d.ts.map +1 -0
  187. package/dist/core/security/captcha/types.js +7 -0
  188. package/dist/core/security/captcha/types.js.map +1 -0
  189. package/dist/core/security/mfa/email-otp.d.ts +91 -0
  190. package/dist/core/security/mfa/email-otp.d.ts.map +1 -0
  191. package/dist/core/security/mfa/email-otp.js +264 -0
  192. package/dist/core/security/mfa/email-otp.js.map +1 -0
  193. package/dist/core/security/mfa/index.d.ts +8 -0
  194. package/dist/core/security/mfa/index.d.ts.map +1 -0
  195. package/dist/core/security/mfa/index.js +8 -0
  196. package/dist/core/security/mfa/index.js.map +1 -0
  197. package/dist/core/security/mfa/totp.d.ts +87 -0
  198. package/dist/core/security/mfa/totp.d.ts.map +1 -0
  199. package/dist/core/security/mfa/totp.js +293 -0
  200. package/dist/core/security/mfa/totp.js.map +1 -0
  201. package/dist/core/security/middleware.d.ts +102 -0
  202. package/dist/core/security/middleware.d.ts.map +1 -0
  203. package/dist/core/security/middleware.js +261 -0
  204. package/dist/core/security/middleware.js.map +1 -0
  205. package/dist/core/security/oauth/google.d.ts +76 -0
  206. package/dist/core/security/oauth/google.d.ts.map +1 -0
  207. package/dist/core/security/oauth/google.js +154 -0
  208. package/dist/core/security/oauth/google.js.map +1 -0
  209. package/dist/core/security/oauth/index.d.ts +8 -0
  210. package/dist/core/security/oauth/index.d.ts.map +1 -0
  211. package/dist/core/security/oauth/index.js +7 -0
  212. package/dist/core/security/oauth/index.js.map +1 -0
  213. package/dist/core/security/oauth2/authorization-server.d.ts +195 -0
  214. package/dist/core/security/oauth2/authorization-server.d.ts.map +1 -0
  215. package/dist/core/security/oauth2/authorization-server.js +569 -0
  216. package/dist/core/security/oauth2/authorization-server.js.map +1 -0
  217. package/dist/core/security/oauth2/index.d.ts +9 -0
  218. package/dist/core/security/oauth2/index.d.ts.map +1 -0
  219. package/dist/core/security/oauth2/index.js +9 -0
  220. package/dist/core/security/oauth2/index.js.map +1 -0
  221. package/dist/core/security/rate-limiter.d.ts +15 -0
  222. package/dist/core/security/rate-limiter.d.ts.map +1 -0
  223. package/dist/core/security/rate-limiter.js +48 -0
  224. package/dist/core/security/rate-limiter.js.map +1 -0
  225. package/dist/core/security/validation.d.ts +20 -0
  226. package/dist/core/security/validation.d.ts.map +1 -0
  227. package/dist/core/security/validation.js +273 -0
  228. package/dist/core/security/validation.js.map +1 -0
  229. package/dist/core/services/auth-service.d.ts +128 -0
  230. package/dist/core/services/auth-service.d.ts.map +1 -0
  231. package/dist/core/services/auth-service.js +530 -0
  232. package/dist/core/services/auth-service.js.map +1 -0
  233. package/dist/core/services/captcha-service.d.ts +44 -0
  234. package/dist/core/services/captcha-service.d.ts.map +1 -0
  235. package/dist/core/services/captcha-service.js +82 -0
  236. package/dist/core/services/captcha-service.js.map +1 -0
  237. package/dist/core/services/document-service.d.ts +59 -0
  238. package/dist/core/services/document-service.d.ts.map +1 -0
  239. package/dist/core/services/document-service.js +269 -0
  240. package/dist/core/services/document-service.js.map +1 -0
  241. package/dist/core/services/media-service.d.ts +40 -0
  242. package/dist/core/services/media-service.d.ts.map +1 -0
  243. package/dist/core/services/media-service.js +396 -0
  244. package/dist/core/services/media-service.js.map +1 -0
  245. package/dist/core/services/mfa-service.d.ts +123 -0
  246. package/dist/core/services/mfa-service.d.ts.map +1 -0
  247. package/dist/core/services/mfa-service.js +606 -0
  248. package/dist/core/services/mfa-service.js.map +1 -0
  249. package/dist/core/services/oauth-service.d.ts +58 -0
  250. package/dist/core/services/oauth-service.d.ts.map +1 -0
  251. package/dist/core/services/oauth-service.js +253 -0
  252. package/dist/core/services/oauth-service.js.map +1 -0
  253. package/dist/core/services/oauth2-server-service.d.ts +61 -0
  254. package/dist/core/services/oauth2-server-service.d.ts.map +1 -0
  255. package/dist/core/services/oauth2-server-service.js +259 -0
  256. package/dist/core/services/oauth2-server-service.js.map +1 -0
  257. package/dist/core/services/passkey-service.d.ts +59 -0
  258. package/dist/core/services/passkey-service.d.ts.map +1 -0
  259. package/dist/core/services/passkey-service.js +238 -0
  260. package/dist/core/services/passkey-service.js.map +1 -0
  261. package/dist/core/services/token-service.d.ts +31 -0
  262. package/dist/core/services/token-service.d.ts.map +1 -0
  263. package/dist/core/services/token-service.js +132 -0
  264. package/dist/core/services/token-service.js.map +1 -0
  265. package/dist/core/services/trusted-device-service.d.ts +39 -0
  266. package/dist/core/services/trusted-device-service.d.ts.map +1 -0
  267. package/dist/core/services/trusted-device-service.js +123 -0
  268. package/dist/core/services/trusted-device-service.js.map +1 -0
  269. package/dist/core/services/user-service.d.ts +38 -0
  270. package/dist/core/services/user-service.d.ts.map +1 -0
  271. package/dist/core/services/user-service.js +265 -0
  272. package/dist/core/services/user-service.js.map +1 -0
  273. package/dist/core/studio/integration.d.ts +54 -0
  274. package/dist/core/studio/integration.d.ts.map +1 -0
  275. package/dist/core/studio/integration.js +326 -0
  276. package/dist/core/studio/integration.js.map +1 -0
  277. package/dist/core/types/index.d.ts +282 -0
  278. package/dist/core/types/index.d.ts.map +1 -0
  279. package/dist/core/types/index.js +83 -0
  280. package/dist/core/types/index.js.map +1 -0
  281. package/dist/core/types/mail.d.ts +90 -0
  282. package/dist/core/types/mail.d.ts.map +1 -0
  283. package/dist/core/types/mail.js +7 -0
  284. package/dist/core/types/mail.js.map +1 -0
  285. package/dist/core/types/oauth2.d.ts +9 -0
  286. package/dist/core/types/oauth2.d.ts.map +1 -0
  287. package/dist/core/types/oauth2.js +7 -0
  288. package/dist/core/types/oauth2.js.map +1 -0
  289. package/dist/core/types/storage-adapters.d.ts +611 -0
  290. package/dist/core/types/storage-adapters.d.ts.map +1 -0
  291. package/dist/core/types/storage-adapters.js +14 -0
  292. package/dist/core/types/storage-adapters.js.map +1 -0
  293. package/dist/core/types/user.d.ts +10 -0
  294. package/dist/core/types/user.d.ts.map +1 -0
  295. package/dist/core/types/user.js +45 -0
  296. package/dist/core/types/user.js.map +1 -0
  297. package/dist/core/utils/id-generator.d.ts +16 -0
  298. package/dist/core/utils/id-generator.d.ts.map +1 -0
  299. package/dist/core/utils/id-generator.js +61 -0
  300. package/dist/core/utils/id-generator.js.map +1 -0
  301. package/dist/core/utils/logger.d.ts +100 -0
  302. package/dist/core/utils/logger.d.ts.map +1 -0
  303. package/dist/core/utils/logger.js +212 -0
  304. package/dist/core/utils/logger.js.map +1 -0
  305. package/dist/core/utils/reference-expander.d.ts +57 -0
  306. package/dist/core/utils/reference-expander.d.ts.map +1 -0
  307. package/dist/core/utils/reference-expander.js +192 -0
  308. package/dist/core/utils/reference-expander.js.map +1 -0
  309. package/dist/core/utils/universal-crypto.d.ts +46 -0
  310. package/dist/core/utils/universal-crypto.d.ts.map +1 -0
  311. package/dist/core/utils/universal-crypto.js +171 -0
  312. package/dist/core/utils/universal-crypto.js.map +1 -0
  313. package/dist/core/validation/validator.d.ts +11 -0
  314. package/dist/core/validation/validator.d.ts.map +1 -0
  315. package/dist/core/validation/validator.js +164 -0
  316. package/dist/core/validation/validator.js.map +1 -0
  317. package/dist/i18n/config.d.ts +4077 -0
  318. package/dist/i18n/config.d.ts.map +1 -0
  319. package/dist/i18n/config.js +116 -0
  320. package/dist/i18n/config.js.map +1 -0
  321. package/dist/i18n/hooks.d.ts +86 -0
  322. package/dist/i18n/hooks.d.ts.map +1 -0
  323. package/dist/i18n/hooks.js +122 -0
  324. package/dist/i18n/hooks.js.map +1 -0
  325. package/dist/i18n/index.d.ts +39 -0
  326. package/dist/i18n/index.d.ts.map +1 -0
  327. package/dist/i18n/index.js +40 -0
  328. package/dist/i18n/index.js.map +1 -0
  329. package/dist/i18n/locales/en/auth.json +108 -0
  330. package/dist/i18n/locales/en/common.json +100 -0
  331. package/dist/i18n/locales/en/errors.json +55 -0
  332. package/dist/i18n/locales/en/fields.json +456 -0
  333. package/dist/i18n/locales/en/studio.json +1329 -0
  334. package/dist/i18n/locales/fr/auth.json +108 -0
  335. package/dist/i18n/locales/fr/common.json +100 -0
  336. package/dist/i18n/locales/fr/errors.json +55 -0
  337. package/dist/i18n/locales/fr/fields.json +456 -0
  338. package/dist/i18n/locales/fr/studio.json +1274 -0
  339. package/dist/i18n/provider.d.ts +45 -0
  340. package/dist/i18n/provider.d.ts.map +1 -0
  341. package/dist/i18n/provider.js +49 -0
  342. package/dist/i18n/provider.js.map +1 -0
  343. package/dist/i18n/types.d.ts +8 -0
  344. package/dist/i18n/types.d.ts.map +1 -0
  345. package/dist/i18n/types.js +7 -0
  346. package/dist/i18n/types.js.map +1 -0
  347. package/dist/index.d.ts +15 -0
  348. package/dist/index.d.ts.map +1 -0
  349. package/dist/index.js +16 -0
  350. package/dist/index.js.map +1 -0
  351. package/dist/integrations/express/adapter.d.ts +33 -0
  352. package/dist/integrations/express/adapter.d.ts.map +1 -0
  353. package/dist/integrations/express/adapter.js +203 -0
  354. package/dist/integrations/express/adapter.js.map +1 -0
  355. package/dist/integrations/express/config.d.ts +599 -0
  356. package/dist/integrations/express/config.d.ts.map +1 -0
  357. package/dist/integrations/express/config.js +166 -0
  358. package/dist/integrations/express/config.js.map +1 -0
  359. package/dist/integrations/express/index.d.ts +10 -0
  360. package/dist/integrations/express/index.d.ts.map +1 -0
  361. package/dist/integrations/express/index.js +9 -0
  362. package/dist/integrations/express/index.js.map +1 -0
  363. package/dist/integrations/express/integration.d.ts +111 -0
  364. package/dist/integrations/express/integration.d.ts.map +1 -0
  365. package/dist/integrations/express/integration.js +730 -0
  366. package/dist/integrations/express/integration.js.map +1 -0
  367. package/dist/integrations/express/media-rewrite-middleware.d.ts +78 -0
  368. package/dist/integrations/express/media-rewrite-middleware.d.ts.map +1 -0
  369. package/dist/integrations/express/media-rewrite-middleware.js +211 -0
  370. package/dist/integrations/express/media-rewrite-middleware.js.map +1 -0
  371. package/dist/integrations/express/media-url-generator.d.ts +52 -0
  372. package/dist/integrations/express/media-url-generator.d.ts.map +1 -0
  373. package/dist/integrations/express/media-url-generator.js +107 -0
  374. package/dist/integrations/express/media-url-generator.js.map +1 -0
  375. package/dist/integrations/express/middleware.d.ts +25 -0
  376. package/dist/integrations/express/middleware.d.ts.map +1 -0
  377. package/dist/integrations/express/middleware.js +130 -0
  378. package/dist/integrations/express/middleware.js.map +1 -0
  379. package/dist/integrations/express/server.d.ts +99 -0
  380. package/dist/integrations/express/server.d.ts.map +1 -0
  381. package/dist/integrations/express/server.js +597 -0
  382. package/dist/integrations/express/server.js.map +1 -0
  383. package/dist/integrations/express/types.d.ts +106 -0
  384. package/dist/integrations/express/types.d.ts.map +1 -0
  385. package/dist/integrations/express/types.js +2 -0
  386. package/dist/integrations/express/types.js.map +1 -0
  387. package/dist/mail/adapters/console.d.ts +30 -0
  388. package/dist/mail/adapters/console.d.ts.map +1 -0
  389. package/dist/mail/adapters/console.js +169 -0
  390. package/dist/mail/adapters/console.js.map +1 -0
  391. package/dist/mail/adapters/resend.d.ts +18 -0
  392. package/dist/mail/adapters/resend.d.ts.map +1 -0
  393. package/dist/mail/adapters/resend.js +148 -0
  394. package/dist/mail/adapters/resend.js.map +1 -0
  395. package/dist/mail/adapters/smtp.d.ts +22 -0
  396. package/dist/mail/adapters/smtp.d.ts.map +1 -0
  397. package/dist/mail/adapters/smtp.js +180 -0
  398. package/dist/mail/adapters/smtp.js.map +1 -0
  399. package/dist/mail/index.d.ts +15 -0
  400. package/dist/mail/index.d.ts.map +1 -0
  401. package/dist/mail/index.js +13 -0
  402. package/dist/mail/index.js.map +1 -0
  403. package/dist/mail/mail-service.d.ts +180 -0
  404. package/dist/mail/mail-service.d.ts.map +1 -0
  405. package/dist/mail/mail-service.js +370 -0
  406. package/dist/mail/mail-service.js.map +1 -0
  407. package/dist/mail/notification-service.d.ts +82 -0
  408. package/dist/mail/notification-service.d.ts.map +1 -0
  409. package/dist/mail/notification-service.js +262 -0
  410. package/dist/mail/notification-service.js.map +1 -0
  411. package/dist/mail/templates/built-in-templates.d.ts +47 -0
  412. package/dist/mail/templates/built-in-templates.d.ts.map +1 -0
  413. package/dist/mail/templates/built-in-templates.js +416 -0
  414. package/dist/mail/templates/built-in-templates.js.map +1 -0
  415. package/dist/mail/templates/custom-template-renderer.d.ts +115 -0
  416. package/dist/mail/templates/custom-template-renderer.d.ts.map +1 -0
  417. package/dist/mail/templates/custom-template-renderer.js +225 -0
  418. package/dist/mail/templates/custom-template-renderer.js.map +1 -0
  419. package/dist/mail/types.d.ts +7 -0
  420. package/dist/mail/types.d.ts.map +1 -0
  421. package/dist/mail/types.js +7 -0
  422. package/dist/mail/types.js.map +1 -0
  423. package/dist/routes/auth/captcha.d.ts +33 -0
  424. package/dist/routes/auth/captcha.d.ts.map +1 -0
  425. package/dist/routes/auth/captcha.js +102 -0
  426. package/dist/routes/auth/captcha.js.map +1 -0
  427. package/dist/routes/auth/change-password.d.ts +17 -0
  428. package/dist/routes/auth/change-password.d.ts.map +1 -0
  429. package/dist/routes/auth/change-password.js +121 -0
  430. package/dist/routes/auth/change-password.js.map +1 -0
  431. package/dist/routes/auth/index.d.ts +13 -0
  432. package/dist/routes/auth/index.d.ts.map +1 -0
  433. package/dist/routes/auth/index.js +35 -0
  434. package/dist/routes/auth/index.js.map +1 -0
  435. package/dist/routes/auth/mfa.d.ts +121 -0
  436. package/dist/routes/auth/mfa.d.ts.map +1 -0
  437. package/dist/routes/auth/mfa.js +1143 -0
  438. package/dist/routes/auth/mfa.js.map +1 -0
  439. package/dist/routes/auth/oauth.d.ts +37 -0
  440. package/dist/routes/auth/oauth.d.ts.map +1 -0
  441. package/dist/routes/auth/oauth.js +420 -0
  442. package/dist/routes/auth/oauth.js.map +1 -0
  443. package/dist/routes/auth/oauth2-server.d.ts +70 -0
  444. package/dist/routes/auth/oauth2-server.d.ts.map +1 -0
  445. package/dist/routes/auth/oauth2-server.js +775 -0
  446. package/dist/routes/auth/oauth2-server.js.map +1 -0
  447. package/dist/routes/auth/passkey.d.ts +65 -0
  448. package/dist/routes/auth/passkey.d.ts.map +1 -0
  449. package/dist/routes/auth/passkey.js +910 -0
  450. package/dist/routes/auth/passkey.js.map +1 -0
  451. package/dist/routes/auth/password-reset.d.ts +23 -0
  452. package/dist/routes/auth/password-reset.d.ts.map +1 -0
  453. package/dist/routes/auth/password-reset.js +336 -0
  454. package/dist/routes/auth/password-reset.js.map +1 -0
  455. package/dist/routes/handlers/audit.d.ts +21 -0
  456. package/dist/routes/handlers/audit.d.ts.map +1 -0
  457. package/dist/routes/handlers/audit.js +124 -0
  458. package/dist/routes/handlers/audit.js.map +1 -0
  459. package/dist/routes/handlers/auth.d.ts +150 -0
  460. package/dist/routes/handlers/auth.d.ts.map +1 -0
  461. package/dist/routes/handlers/auth.js +512 -0
  462. package/dist/routes/handlers/auth.js.map +1 -0
  463. package/dist/routes/handlers/base.d.ts +34 -0
  464. package/dist/routes/handlers/base.d.ts.map +1 -0
  465. package/dist/routes/handlers/base.js +366 -0
  466. package/dist/routes/handlers/base.js.map +1 -0
  467. package/dist/routes/handlers/config.d.ts +31 -0
  468. package/dist/routes/handlers/config.d.ts.map +1 -0
  469. package/dist/routes/handlers/config.js +483 -0
  470. package/dist/routes/handlers/config.js.map +1 -0
  471. package/dist/routes/handlers/documents.d.ts +50 -0
  472. package/dist/routes/handlers/documents.d.ts.map +1 -0
  473. package/dist/routes/handlers/documents.js +708 -0
  474. package/dist/routes/handlers/documents.js.map +1 -0
  475. package/dist/routes/handlers/index.d.ts +12 -0
  476. package/dist/routes/handlers/index.d.ts.map +1 -0
  477. package/dist/routes/handlers/index.js +11 -0
  478. package/dist/routes/handlers/index.js.map +1 -0
  479. package/dist/routes/handlers/media.d.ts +24 -0
  480. package/dist/routes/handlers/media.d.ts.map +1 -0
  481. package/dist/routes/handlers/media.js +432 -0
  482. package/dist/routes/handlers/media.js.map +1 -0
  483. package/dist/routes/handlers/search.d.ts +10 -0
  484. package/dist/routes/handlers/search.d.ts.map +1 -0
  485. package/dist/routes/handlers/search.js +153 -0
  486. package/dist/routes/handlers/search.js.map +1 -0
  487. package/dist/routes/handlers/tokens.d.ts +14 -0
  488. package/dist/routes/handlers/tokens.d.ts.map +1 -0
  489. package/dist/routes/handlers/tokens.js +109 -0
  490. package/dist/routes/handlers/tokens.js.map +1 -0
  491. package/dist/routes/handlers/types.d.ts +13 -0
  492. package/dist/routes/handlers/types.d.ts.map +1 -0
  493. package/dist/routes/handlers/types.js +5 -0
  494. package/dist/routes/handlers/types.js.map +1 -0
  495. package/dist/routes/handlers/users.d.ts +16 -0
  496. package/dist/routes/handlers/users.d.ts.map +1 -0
  497. package/dist/routes/handlers/users.js +198 -0
  498. package/dist/routes/handlers/users.js.map +1 -0
  499. package/dist/routes/handlers/webhooks.d.ts +37 -0
  500. package/dist/routes/handlers/webhooks.d.ts.map +1 -0
  501. package/dist/routes/handlers/webhooks.js +343 -0
  502. package/dist/routes/handlers/webhooks.js.map +1 -0
  503. package/dist/routes/index.d.ts +5 -0
  504. package/dist/routes/index.d.ts.map +1 -0
  505. package/dist/routes/index.js +5 -0
  506. package/dist/routes/index.js.map +1 -0
  507. package/dist/routes/routes.d.ts +29 -0
  508. package/dist/routes/routes.d.ts.map +1 -0
  509. package/dist/routes/routes.js +531 -0
  510. package/dist/routes/routes.js.map +1 -0
  511. package/dist/routes/slug-processor.d.ts +32 -0
  512. package/dist/routes/slug-processor.d.ts.map +1 -0
  513. package/dist/routes/slug-processor.js +328 -0
  514. package/dist/routes/slug-processor.js.map +1 -0
  515. package/dist/routes/types.d.ts +31 -0
  516. package/dist/routes/types.d.ts.map +1 -0
  517. package/dist/routes/types.js +7 -0
  518. package/dist/routes/types.js.map +1 -0
  519. package/dist/routes/users/index.d.ts +7 -0
  520. package/dist/routes/users/index.d.ts.map +1 -0
  521. package/dist/routes/users/index.js +7 -0
  522. package/dist/routes/users/index.js.map +1 -0
  523. package/dist/structure/builder/StructureBuilder.d.ts +209 -0
  524. package/dist/structure/builder/StructureBuilder.d.ts.map +1 -0
  525. package/dist/structure/builder/StructureBuilder.js +425 -0
  526. package/dist/structure/builder/StructureBuilder.js.map +1 -0
  527. package/dist/structure/builder/index.d.ts +8 -0
  528. package/dist/structure/builder/index.d.ts.map +1 -0
  529. package/dist/structure/builder/index.js +6 -0
  530. package/dist/structure/builder/index.js.map +1 -0
  531. package/dist/structure/builder/navigation-tree-builder.d.ts +33 -0
  532. package/dist/structure/builder/navigation-tree-builder.d.ts.map +1 -0
  533. package/dist/structure/builder/navigation-tree-builder.js +284 -0
  534. package/dist/structure/builder/navigation-tree-builder.js.map +1 -0
  535. package/dist/structure/errors/index.d.ts +72 -0
  536. package/dist/structure/errors/index.d.ts.map +1 -0
  537. package/dist/structure/errors/index.js +136 -0
  538. package/dist/structure/errors/index.js.map +1 -0
  539. package/dist/structure/index.d.ts +14 -0
  540. package/dist/structure/index.d.ts.map +1 -0
  541. package/dist/structure/index.js +16 -0
  542. package/dist/structure/index.js.map +1 -0
  543. package/dist/structure/types/filters.d.ts +167 -0
  544. package/dist/structure/types/filters.d.ts.map +1 -0
  545. package/dist/structure/types/filters.js +38 -0
  546. package/dist/structure/types/filters.js.map +1 -0
  547. package/dist/structure/types/index.d.ts +11 -0
  548. package/dist/structure/types/index.d.ts.map +1 -0
  549. package/dist/structure/types/index.js +7 -0
  550. package/dist/structure/types/index.js.map +1 -0
  551. package/dist/structure/types/permissions.d.ts +159 -0
  552. package/dist/structure/types/permissions.d.ts.map +1 -0
  553. package/dist/structure/types/permissions.js +49 -0
  554. package/dist/structure/types/permissions.js.map +1 -0
  555. package/dist/structure/types/structure.d.ts +342 -0
  556. package/dist/structure/types/structure.d.ts.map +1 -0
  557. package/dist/structure/types/structure.js +6 -0
  558. package/dist/structure/types/structure.js.map +1 -0
  559. package/dist/structure/types/views.d.ts +278 -0
  560. package/dist/structure/types/views.d.ts.map +1 -0
  561. package/dist/structure/types/views.js +6 -0
  562. package/dist/structure/types/views.js.map +1 -0
  563. package/dist/structure/utils/hash.d.ts +61 -0
  564. package/dist/structure/utils/hash.d.ts.map +1 -0
  565. package/dist/structure/utils/hash.js +118 -0
  566. package/dist/structure/utils/hash.js.map +1 -0
  567. package/dist/structure/utils/index.d.ts +10 -0
  568. package/dist/structure/utils/index.d.ts.map +1 -0
  569. package/dist/structure/utils/index.js +7 -0
  570. package/dist/structure/utils/index.js.map +1 -0
  571. package/dist/structure/utils/permission-checker.d.ts +57 -0
  572. package/dist/structure/utils/permission-checker.d.ts.map +1 -0
  573. package/dist/structure/utils/permission-checker.js +286 -0
  574. package/dist/structure/utils/permission-checker.js.map +1 -0
  575. package/dist/structure/utils/query-builder.d.ts +82 -0
  576. package/dist/structure/utils/query-builder.d.ts.map +1 -0
  577. package/dist/structure/utils/query-builder.js +489 -0
  578. package/dist/structure/utils/query-builder.js.map +1 -0
  579. package/dist/structure/utils/structure-merger.d.ts +91 -0
  580. package/dist/structure/utils/structure-merger.d.ts.map +1 -0
  581. package/dist/structure/utils/structure-merger.js +445 -0
  582. package/dist/structure/utils/structure-merger.js.map +1 -0
  583. package/dist/structure/validation/schemas.d.ts +3107 -0
  584. package/dist/structure/validation/schemas.d.ts.map +1 -0
  585. package/dist/structure/validation/schemas.js +436 -0
  586. package/dist/structure/validation/schemas.js.map +1 -0
  587. package/dist/types/api-requests.d.ts +334 -0
  588. package/dist/types/api-requests.d.ts.map +1 -0
  589. package/dist/types/api-requests.js +8 -0
  590. package/dist/types/api-requests.js.map +1 -0
  591. package/dist/types/auth.d.ts +394 -0
  592. package/dist/types/auth.d.ts.map +1 -0
  593. package/dist/types/auth.js +8 -0
  594. package/dist/types/auth.js.map +1 -0
  595. package/dist/types/document.d.ts +49 -0
  596. package/dist/types/document.d.ts.map +1 -0
  597. package/dist/types/document.js +6 -0
  598. package/dist/types/document.js.map +1 -0
  599. package/dist/types/field-system.d.ts +197 -0
  600. package/dist/types/field-system.d.ts.map +1 -0
  601. package/dist/types/field-system.js +8 -0
  602. package/dist/types/field-system.js.map +1 -0
  603. package/dist/types/fields.d.ts +17 -0
  604. package/dist/types/fields.d.ts.map +1 -0
  605. package/dist/types/fields.js +21 -0
  606. package/dist/types/fields.js.map +1 -0
  607. package/dist/types/http.d.ts +162 -0
  608. package/dist/types/http.d.ts.map +1 -0
  609. package/dist/types/http.js +8 -0
  610. package/dist/types/http.js.map +1 -0
  611. package/dist/types/i18n.d.ts +56 -0
  612. package/dist/types/i18n.d.ts.map +1 -0
  613. package/dist/types/i18n.js +25 -0
  614. package/dist/types/i18n.js.map +1 -0
  615. package/dist/types/index.d.ts +22 -0
  616. package/dist/types/index.d.ts.map +1 -0
  617. package/dist/types/index.js +10 -0
  618. package/dist/types/index.js.map +1 -0
  619. package/dist/types/mail.d.ts +224 -0
  620. package/dist/types/mail.d.ts.map +1 -0
  621. package/dist/types/mail.js +8 -0
  622. package/dist/types/mail.js.map +1 -0
  623. package/dist/types/media.d.ts +56 -0
  624. package/dist/types/media.d.ts.map +1 -0
  625. package/dist/types/media.js +6 -0
  626. package/dist/types/media.js.map +1 -0
  627. package/dist/types/oauth2.d.ts +287 -0
  628. package/dist/types/oauth2.d.ts.map +1 -0
  629. package/dist/types/oauth2.js +43 -0
  630. package/dist/types/oauth2.js.map +1 -0
  631. package/dist/types/passkey.d.ts +217 -0
  632. package/dist/types/passkey.d.ts.map +1 -0
  633. package/dist/types/passkey.js +8 -0
  634. package/dist/types/passkey.js.map +1 -0
  635. package/dist/types/slug.d.ts +99 -0
  636. package/dist/types/slug.d.ts.map +1 -0
  637. package/dist/types/slug.js +8 -0
  638. package/dist/types/slug.js.map +1 -0
  639. package/package.json +183 -0
@@ -0,0 +1,606 @@
1
+ import { detectCryptoAdapter } from '../crypto/adapter.js';
2
+ import { InvalidInputError } from '../errors/index.js';
3
+ import { TOTPService, EmailOTPService } from '../security/mfa/index.js';
4
+ /**
5
+ * Generate a cryptographically secure random secret.
6
+ * Standalone so TrokkyCore can use it before its services exist.
7
+ */
8
+ export function generateSecureSecret() {
9
+ // Generate a cryptographically secure random secret using crypto adapter
10
+ // This will be called during initialization, but we need to create a temporary adapter
11
+ const tempAdapter = detectCryptoAdapter();
12
+ const secret = tempAdapter.generateSecureRandom(64);
13
+ // Warn if using generated secret (should use environment variable in production)
14
+ const isTestEnv = (typeof process !== 'undefined' && process.env?.NODE_ENV === 'test');
15
+ if (!isTestEnv) {
16
+ console.warn('⚠️ Using auto-generated JWT secret. Set TROKKY_JWT_SECRET environment variable for production.');
17
+ }
18
+ return secret;
19
+ }
20
+ /**
21
+ * Multi-factor authentication service: TOTP and email OTP enrolment,
22
+ * verification, backup codes and administrative resets.
23
+ */
24
+ export class MFAService {
25
+ deps;
26
+ constructor(deps) {
27
+ this.deps = deps;
28
+ }
29
+ /**
30
+ * Get the TOTP service instance
31
+ * Creates one with a default issuer (can be overridden via settings)
32
+ */
33
+ getTOTPService(issuer) {
34
+ // Default issuer - can be configured via settings
35
+ return new TOTPService({ issuer: issuer || 'Trokky' });
36
+ }
37
+ /**
38
+ * Get the Email OTP service instance
39
+ */
40
+ getEmailOTPService() {
41
+ return new EmailOTPService({
42
+ codeLength: 6,
43
+ expiryMinutes: 10,
44
+ maxAttempts: 5
45
+ });
46
+ }
47
+ /**
48
+ * Check if MFA is required for a user
49
+ * Returns whether MFA is required and available methods
50
+ */
51
+ async checkMFARequired(userId) {
52
+ const user = await this.deps.getUser(userId);
53
+ if (!user) {
54
+ throw new InvalidInputError('User not found', 'userId');
55
+ }
56
+ // Check if user has MFA enabled
57
+ const userHasMFA = user.mfa?.enabled === true && (user.mfa.methods?.length ?? 0) > 0;
58
+ const userMethods = user.mfa?.methods?.filter(m => m.enabled && m.verified).map(m => m.type) || [];
59
+ // Check organization-level MFA requirement
60
+ const settings = await this.deps.getSettings();
61
+ const orgRequiresMFA = settings?.mfaRequired === true;
62
+ // Check role-based MFA enforcement
63
+ const enforcedRoles = settings?.mfaEnforcedRoles || [];
64
+ const roleRequiresMFA = user.role !== 'api' && enforcedRoles.includes(user.role);
65
+ if (userHasMFA) {
66
+ return {
67
+ required: true,
68
+ methods: userMethods,
69
+ reason: 'user_enabled',
70
+ userHasMFA: true
71
+ };
72
+ }
73
+ if (orgRequiresMFA) {
74
+ // Org requires MFA but user hasn't set it up yet
75
+ const allowedMethods = settings?.mfaAllowedMethods || ['totp', 'email'];
76
+ return {
77
+ required: true,
78
+ methods: allowedMethods,
79
+ reason: 'org_required',
80
+ userHasMFA: false
81
+ };
82
+ }
83
+ if (roleRequiresMFA) {
84
+ // User's role requires MFA but user hasn't set it up yet
85
+ const allowedMethods = settings?.mfaAllowedMethods || ['totp', 'email'];
86
+ return {
87
+ required: true,
88
+ methods: allowedMethods,
89
+ reason: 'role_required',
90
+ userHasMFA: false
91
+ };
92
+ }
93
+ return {
94
+ required: false,
95
+ methods: [],
96
+ reason: 'not_required',
97
+ userHasMFA: false
98
+ };
99
+ }
100
+ /**
101
+ * Initialize TOTP setup for a user
102
+ * Returns QR code and secret for authenticator app
103
+ */
104
+ async initializeTOTPSetup(userId) {
105
+ const user = await this.deps.getUser(userId);
106
+ if (!user) {
107
+ throw new InvalidInputError('User not found', 'userId');
108
+ }
109
+ // Get issuer from settings or use default
110
+ const settings = await this.deps.getSettings();
111
+ const issuer = settings?.studioTitle || settings?.organizationName || 'Trokky';
112
+ const totpService = this.getTOTPService(issuer);
113
+ const result = await totpService.generateSecret(user.email || user.username);
114
+ // Store the secret temporarily in user preferences (unverified)
115
+ const pendingTOTP = {
116
+ type: 'totp',
117
+ enabled: false,
118
+ verified: false,
119
+ secret: result.secret // Will be encrypted by storage adapter
120
+ };
121
+ // Update user with pending TOTP setup
122
+ const currentMFA = user.mfa || { enabled: false, methods: [] };
123
+ const existingMethods = (currentMFA.methods || []).filter(m => m.type !== 'totp');
124
+ await this.deps.updateUser(userId, {
125
+ mfa: {
126
+ ...currentMFA,
127
+ methods: [...existingMethods, pendingTOTP]
128
+ }
129
+ });
130
+ this.deps.logger.info('TOTP setup initialized', { userId });
131
+ return result;
132
+ }
133
+ /**
134
+ * Verify and enable TOTP for a user
135
+ * Must be called after initializeTOTPSetup with a valid code from authenticator
136
+ */
137
+ async verifyAndEnableTOTP(userId, code) {
138
+ const user = await this.deps.getUser(userId);
139
+ if (!user) {
140
+ throw new InvalidInputError('User not found', 'userId');
141
+ }
142
+ // Find pending TOTP method
143
+ const pendingTOTP = user.mfa?.methods?.find(m => m.type === 'totp' && !m.verified);
144
+ if (!pendingTOTP || !pendingTOTP.secret) {
145
+ throw new InvalidInputError('No pending TOTP setup found. Call initializeTOTPSetup first.', 'totp');
146
+ }
147
+ // Verify the code
148
+ const totpService = this.getTOTPService();
149
+ const isValid = totpService.verifyCode(pendingTOTP.secret, code);
150
+ if (!isValid) {
151
+ throw new InvalidInputError('Invalid TOTP code', 'code');
152
+ }
153
+ // Update TOTP method as verified and enabled
154
+ const verifiedTOTP = {
155
+ ...pendingTOTP,
156
+ enabled: true,
157
+ verified: true,
158
+ verifiedAt: new Date().toISOString()
159
+ };
160
+ const currentMFA = user.mfa || { enabled: false, methods: [] };
161
+ const otherMethods = (currentMFA.methods || []).filter(m => m.type !== 'totp');
162
+ // Generate backup codes only if this is the first MFA method
163
+ let backupCodes;
164
+ let hashedBackupCodes = currentMFA.backupCodes;
165
+ let backupCodesGeneratedAt = currentMFA.backupCodesGeneratedAt;
166
+ if (!hashedBackupCodes || hashedBackupCodes.length === 0) {
167
+ backupCodes = totpService.generateBackupCodes(10);
168
+ hashedBackupCodes = backupCodes.map(c => totpService.hashBackupCode(c));
169
+ backupCodesGeneratedAt = new Date().toISOString();
170
+ }
171
+ await this.deps.updateUser(userId, {
172
+ mfa: {
173
+ enabled: true,
174
+ methods: [...otherMethods, verifiedTOTP],
175
+ backupCodes: hashedBackupCodes,
176
+ backupCodesGeneratedAt,
177
+ trustedDevices: currentMFA.trustedDevices || []
178
+ }
179
+ });
180
+ this.deps.logger.info('TOTP enabled for user', { userId });
181
+ // Log audit event
182
+ this.deps.logAuditEvent({
183
+ type: 'user_updated',
184
+ userId,
185
+ username: user.username,
186
+ action: 'MFA TOTP enabled',
187
+ timestamp: new Date().toISOString(),
188
+ success: true,
189
+ details: { mfaMethod: 'totp' }
190
+ });
191
+ return {
192
+ enabled: true,
193
+ backupCodes // Return plain codes - user must save them
194
+ };
195
+ }
196
+ /**
197
+ * Initialize Email OTP setup for a user
198
+ * Sends verification code to user's email
199
+ */
200
+ async initializeEmailOTPSetup(userId) {
201
+ const user = await this.deps.getUser(userId);
202
+ if (!user || !user.email) {
203
+ throw new InvalidInputError('User not found or has no email', 'userId');
204
+ }
205
+ const emailService = this.getEmailOTPService();
206
+ const result = emailService.generateCode();
207
+ // Store the OTP in user preferences
208
+ const storedOTP = emailService.createStoredOTP(result);
209
+ // Store in user preferences for later verification
210
+ const currentPreferences = user.preferences || {};
211
+ await this.deps.updateUser(userId, {
212
+ preferences: {
213
+ ...currentPreferences,
214
+ _pendingEmailOTP: storedOTP
215
+ }
216
+ });
217
+ // Emit event for email notification
218
+ if (this.deps.eventsEnabled) {
219
+ this.deps.eventBus.emitEvent({
220
+ type: 'user.mfa_otp_requested',
221
+ source: 'trokky-core',
222
+ data: {
223
+ userId,
224
+ email: user.email,
225
+ firstName: user.firstName,
226
+ otpCode: result.code,
227
+ expiryMinutes: 10,
228
+ purpose: 'MFA setup',
229
+ },
230
+ }).catch(error => {
231
+ this.deps.logger.warn('Failed to emit MFA OTP event', error);
232
+ });
233
+ }
234
+ this.deps.logger.info('Email OTP generated for MFA setup', {
235
+ userId,
236
+ email: user.email,
237
+ expiresAt: result.expiresAt
238
+ });
239
+ return { expiresIn: 10 * 60 }; // 10 minutes in seconds
240
+ }
241
+ /**
242
+ * Verify and enable Email OTP for a user
243
+ */
244
+ async verifyAndEnableEmailOTP(userId, code) {
245
+ const user = await this.deps.getUser(userId);
246
+ if (!user) {
247
+ throw new InvalidInputError('User not found', 'userId');
248
+ }
249
+ // Get stored OTP from preferences
250
+ const storedOTP = user.preferences?._pendingEmailOTP;
251
+ if (!storedOTP) {
252
+ throw new InvalidInputError('No pending email OTP found. Call initializeEmailOTPSetup first.', 'emailOtp');
253
+ }
254
+ // Verify the code
255
+ const emailService = this.getEmailOTPService();
256
+ const verificationResult = emailService.verifyCode(code, storedOTP);
257
+ if (!verificationResult.valid) {
258
+ if (verificationResult.expired) {
259
+ throw new InvalidInputError('Email OTP has expired', 'code');
260
+ }
261
+ if (verificationResult.maxAttemptsExceeded) {
262
+ throw new InvalidInputError('Maximum verification attempts exceeded', 'code');
263
+ }
264
+ // Update attempt count
265
+ const updatedOTP = emailService.incrementAttempts(storedOTP);
266
+ await this.deps.updateUser(userId, {
267
+ preferences: {
268
+ ...user.preferences,
269
+ _pendingEmailOTP: updatedOTP
270
+ }
271
+ });
272
+ throw new InvalidInputError(`Invalid code. ${verificationResult.attemptsRemaining} attempts remaining.`, 'code');
273
+ }
274
+ // Create verified email MFA method
275
+ const emailMethod = {
276
+ type: 'email',
277
+ enabled: true,
278
+ verified: true,
279
+ verifiedAt: new Date().toISOString()
280
+ };
281
+ const currentMFA = user.mfa || { enabled: false, methods: [] };
282
+ const otherMethods = (currentMFA.methods || []).filter(m => m.type !== 'email');
283
+ // Generate backup codes if this is the first MFA method
284
+ let backupCodes;
285
+ let hashedBackupCodes = currentMFA.backupCodes;
286
+ let backupCodesGeneratedAt = currentMFA.backupCodesGeneratedAt;
287
+ if (!hashedBackupCodes || hashedBackupCodes.length === 0) {
288
+ const totpService = this.getTOTPService();
289
+ backupCodes = totpService.generateBackupCodes(10);
290
+ hashedBackupCodes = backupCodes.map(c => totpService.hashBackupCode(c));
291
+ backupCodesGeneratedAt = new Date().toISOString();
292
+ }
293
+ // Remove pending OTP and update MFA config
294
+ const { _pendingEmailOTP, ...cleanPreferences } = user.preferences || {};
295
+ await this.deps.updateUser(userId, {
296
+ preferences: cleanPreferences,
297
+ mfa: {
298
+ enabled: true,
299
+ methods: [...otherMethods, emailMethod],
300
+ backupCodes: hashedBackupCodes,
301
+ backupCodesGeneratedAt,
302
+ trustedDevices: currentMFA.trustedDevices || []
303
+ }
304
+ });
305
+ this.deps.logger.info('Email OTP enabled for user', { userId });
306
+ return { enabled: true, backupCodes };
307
+ }
308
+ /**
309
+ * Verify MFA code during login
310
+ * Supports TOTP, email, and backup codes
311
+ */
312
+ async verifyMFACode(userId, code, method) {
313
+ const user = await this.deps.getUser(userId);
314
+ if (!user) {
315
+ throw new InvalidInputError('User not found', 'userId');
316
+ }
317
+ if (method === 'totp') {
318
+ const totpMethod = user.mfa?.methods?.find(m => m.type === 'totp' && m.enabled && m.verified);
319
+ if (!totpMethod?.secret) {
320
+ throw new InvalidInputError('TOTP not configured for this user', 'method');
321
+ }
322
+ const totpService = this.getTOTPService();
323
+ return totpService.verifyCode(totpMethod.secret, code);
324
+ }
325
+ if (method === 'backup') {
326
+ const hashedCodes = user.mfa?.backupCodes || [];
327
+ if (hashedCodes.length === 0) {
328
+ throw new InvalidInputError('No backup codes available', 'method');
329
+ }
330
+ const totpService = this.getTOTPService();
331
+ const result = totpService.verifyBackupCode(hashedCodes, code);
332
+ if (result.valid) {
333
+ // Update user with remaining backup codes
334
+ await this.deps.updateUser(userId, {
335
+ mfa: {
336
+ ...user.mfa,
337
+ backupCodes: result.remainingCodes
338
+ }
339
+ });
340
+ this.deps.logger.info('Backup code used', {
341
+ userId,
342
+ remainingCodes: result.remainingCodes.length
343
+ });
344
+ }
345
+ return result.valid;
346
+ }
347
+ if (method === 'email') {
348
+ // Email OTP verification during login
349
+ const storedOTP = user.preferences?._loginEmailOTP;
350
+ if (!storedOTP) {
351
+ throw new InvalidInputError('No email OTP sent. Call sendMFAEmailOTP first.', 'method');
352
+ }
353
+ const emailService = this.getEmailOTPService();
354
+ const result = emailService.verifyCode(code, storedOTP);
355
+ if (result.valid) {
356
+ // Clear the OTP
357
+ const { _loginEmailOTP, ...cleanPreferences } = user.preferences || {};
358
+ await this.deps.updateUser(userId, {
359
+ preferences: cleanPreferences
360
+ });
361
+ }
362
+ else if (!result.expired && !result.maxAttemptsExceeded) {
363
+ // Update attempt count
364
+ const updatedOTP = emailService.incrementAttempts(storedOTP);
365
+ await this.deps.updateUser(userId, {
366
+ preferences: {
367
+ ...user.preferences,
368
+ _loginEmailOTP: updatedOTP
369
+ }
370
+ });
371
+ }
372
+ return result.valid;
373
+ }
374
+ return false;
375
+ }
376
+ /**
377
+ * Send Email OTP for MFA verification during login
378
+ */
379
+ async sendMFAEmailOTP(userId) {
380
+ const user = await this.deps.getUser(userId);
381
+ if (!user || !user.email) {
382
+ throw new InvalidInputError('User not found or has no email', 'userId');
383
+ }
384
+ // Check if email MFA is enabled for this user
385
+ const emailMethod = user.mfa?.methods?.find(m => m.type === 'email' && m.enabled && m.verified);
386
+ if (!emailMethod) {
387
+ throw new InvalidInputError('Email MFA not enabled for this user', 'method');
388
+ }
389
+ const emailService = this.getEmailOTPService();
390
+ const result = emailService.generateCode();
391
+ const storedOTP = emailService.createStoredOTP(result);
392
+ // Store for verification
393
+ await this.deps.updateUser(userId, {
394
+ preferences: {
395
+ ...user.preferences,
396
+ _loginEmailOTP: storedOTP
397
+ }
398
+ });
399
+ // Emit event for email notification
400
+ if (this.deps.eventsEnabled) {
401
+ this.deps.eventBus.emitEvent({
402
+ type: 'user.mfa_otp_requested',
403
+ source: 'trokky-core',
404
+ data: {
405
+ userId,
406
+ email: user.email,
407
+ firstName: user.firstName,
408
+ otpCode: result.code,
409
+ expiryMinutes: 10,
410
+ purpose: 'login verification',
411
+ },
412
+ }).catch(error => {
413
+ this.deps.logger.warn('Failed to emit MFA OTP event', error);
414
+ });
415
+ }
416
+ this.deps.logger.info('Login email OTP generated', {
417
+ userId,
418
+ email: user.email,
419
+ expiresAt: result.expiresAt
420
+ });
421
+ return { expiresIn: 10 * 60 };
422
+ }
423
+ /**
424
+ * Disable MFA method for a user
425
+ * Requires password verification
426
+ */
427
+ async disableMFAMethod(userId, method, password) {
428
+ const user = await this.deps.getUser(userId);
429
+ if (!user) {
430
+ throw new InvalidInputError('User not found', 'userId');
431
+ }
432
+ // Verify password
433
+ const isPasswordValid = await this.deps.verifyPassword(password, user.passwordHash);
434
+ if (!isPasswordValid) {
435
+ throw new InvalidInputError('Invalid password', 'password');
436
+ }
437
+ // Check if this is the last MFA method
438
+ const enabledMethods = user.mfa?.methods?.filter(m => m.enabled && m.verified) || [];
439
+ if (enabledMethods.length <= 1 && enabledMethods[0]?.type === method) {
440
+ // Check if org requires MFA
441
+ const settings = await this.deps.getSettings();
442
+ if (settings?.mfaRequired) {
443
+ throw new InvalidInputError('Cannot disable last MFA method when organization requires MFA', 'method');
444
+ }
445
+ }
446
+ // Remove the method
447
+ const updatedMethods = (user.mfa?.methods || []).filter(m => m.type !== method);
448
+ const stillHasMFA = updatedMethods.some(m => m.enabled && m.verified);
449
+ await this.deps.updateUser(userId, {
450
+ mfa: {
451
+ ...user.mfa,
452
+ enabled: stillHasMFA,
453
+ methods: updatedMethods
454
+ }
455
+ });
456
+ this.deps.logger.info('MFA method disabled', { userId, method });
457
+ this.deps.logAuditEvent({
458
+ type: 'user_updated',
459
+ userId,
460
+ username: user.username,
461
+ action: `MFA ${method} disabled`,
462
+ timestamp: new Date().toISOString(),
463
+ success: true,
464
+ details: { mfaMethod: method }
465
+ });
466
+ }
467
+ /**
468
+ * Disable all MFA for a user (removes all methods and backup codes)
469
+ * Requires password verification
470
+ */
471
+ async disableAllMFA(userId, password) {
472
+ const user = await this.deps.getUser(userId);
473
+ if (!user) {
474
+ throw new InvalidInputError('User not found', 'userId');
475
+ }
476
+ // Verify password
477
+ const isPasswordValid = await this.deps.verifyPassword(password, user.passwordHash);
478
+ if (!isPasswordValid) {
479
+ throw new InvalidInputError('Invalid password', 'password');
480
+ }
481
+ // Check if org requires MFA
482
+ const settings = await this.deps.getSettings();
483
+ if (settings?.mfaRequired) {
484
+ throw new InvalidInputError('Cannot disable MFA when organization requires MFA', 'mfa');
485
+ }
486
+ // Completely reset MFA
487
+ await this.deps.updateUser(userId, {
488
+ mfa: {
489
+ enabled: false,
490
+ methods: [],
491
+ backupCodes: [],
492
+ backupCodesGeneratedAt: undefined,
493
+ trustedDevices: []
494
+ }
495
+ });
496
+ this.deps.logger.info('All MFA disabled for user', { userId });
497
+ this.deps.logAuditEvent({
498
+ type: 'user_updated',
499
+ userId,
500
+ username: user.username,
501
+ action: 'All MFA disabled',
502
+ timestamp: new Date().toISOString(),
503
+ success: true,
504
+ details: { mfaDisabled: true }
505
+ });
506
+ }
507
+ /**
508
+ * Regenerate backup codes for a user
509
+ * Requires password verification
510
+ */
511
+ async regenerateBackupCodes(userId, password) {
512
+ const user = await this.deps.getUser(userId);
513
+ if (!user) {
514
+ throw new InvalidInputError('User not found', 'userId');
515
+ }
516
+ // Verify password
517
+ const isPasswordValid = await this.deps.verifyPassword(password, user.passwordHash);
518
+ if (!isPasswordValid) {
519
+ throw new InvalidInputError('Invalid password', 'password');
520
+ }
521
+ // Check if user has MFA enabled
522
+ if (!user.mfa?.enabled) {
523
+ throw new InvalidInputError('MFA is not enabled', 'mfa');
524
+ }
525
+ const totpService = this.getTOTPService();
526
+ const backupCodes = totpService.generateBackupCodes(10);
527
+ const hashedBackupCodes = backupCodes.map(c => totpService.hashBackupCode(c));
528
+ await this.deps.updateUser(userId, {
529
+ mfa: {
530
+ ...user.mfa,
531
+ backupCodes: hashedBackupCodes,
532
+ backupCodesGeneratedAt: new Date().toISOString()
533
+ }
534
+ });
535
+ this.deps.logger.info('Backup codes regenerated', { userId });
536
+ return backupCodes;
537
+ }
538
+ /**
539
+ * Admin: Reset MFA for a user (emergency recovery)
540
+ * Removes all MFA configuration
541
+ */
542
+ async adminResetUserMFA(adminUserId, targetUserId) {
543
+ // Verify admin has permission
544
+ const admin = await this.deps.getUser(adminUserId);
545
+ if (!admin || admin.role !== 'admin') {
546
+ throw new InvalidInputError('Unauthorized: Admin access required', 'adminUserId');
547
+ }
548
+ const targetUser = await this.deps.getUser(targetUserId);
549
+ if (!targetUser) {
550
+ throw new InvalidInputError('Target user not found', 'targetUserId');
551
+ }
552
+ // Reset MFA configuration
553
+ await this.deps.updateUser(targetUserId, {
554
+ mfa: {
555
+ enabled: false,
556
+ methods: [],
557
+ backupCodes: [],
558
+ trustedDevices: []
559
+ }
560
+ });
561
+ this.deps.logger.warn('Admin reset MFA for user', {
562
+ adminUserId,
563
+ adminUsername: admin.username,
564
+ targetUserId,
565
+ targetUsername: targetUser.username
566
+ });
567
+ this.deps.logAuditEvent({
568
+ type: 'admin_access',
569
+ userId: adminUserId,
570
+ targetUserId,
571
+ username: admin.username,
572
+ action: 'Admin reset MFA for user',
573
+ timestamp: new Date().toISOString(),
574
+ success: true,
575
+ details: {
576
+ targetUsername: targetUser.username
577
+ }
578
+ });
579
+ }
580
+ /**
581
+ * Get MFA status for a user
582
+ */
583
+ async getMFAStatus(userId) {
584
+ const user = await this.deps.getUser(userId);
585
+ if (!user) {
586
+ throw new InvalidInputError('User not found', 'userId');
587
+ }
588
+ const mfa = user.mfa || { enabled: false, methods: [] };
589
+ return {
590
+ enabled: mfa.enabled,
591
+ methods: (mfa.methods || []).map(m => ({
592
+ type: m.type,
593
+ enabled: m.enabled,
594
+ verified: m.verified,
595
+ verifiedAt: m.verifiedAt
596
+ })),
597
+ backupCodesRemaining: (mfa.backupCodes || []).length,
598
+ backupCodesGeneratedAt: mfa.backupCodesGeneratedAt,
599
+ trustedDevicesCount: (mfa.trustedDevices || []).filter(d => new Date(d.expiresAt) > new Date()).length
600
+ };
601
+ }
602
+ generateSecureSecret() {
603
+ return generateSecureSecret();
604
+ }
605
+ }
606
+ //# sourceMappingURL=mfa-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mfa-service.js","sourceRoot":"","sources":["../../../src/core/services/mfa-service.ts"],"names":[],"mappings":"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"}