@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,293 @@
1
+ /**
2
+ * TOTP (Time-based One-Time Password) Service
3
+ *
4
+ * Implements RFC 6238 TOTP for authenticator app-based MFA.
5
+ * Uses the otpauth library for TOTP generation/verification.
6
+ */
7
+ import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
8
+ import { createLogger } from '../../utils/logger.js';
9
+ const logger = createLogger('security', 'TOTP');
10
+ // =============================================================================
11
+ // CONSTANTS
12
+ // =============================================================================
13
+ const DEFAULT_ALGORITHM = 'SHA1';
14
+ const DEFAULT_DIGITS = 6;
15
+ const DEFAULT_PERIOD = 30;
16
+ const SECRET_LENGTH = 20; // 160 bits, recommended for SHA1
17
+ const BACKUP_CODE_LENGTH = 8; // 8 character backup codes
18
+ const BACKUP_CODE_COUNT = 10; // Number of backup codes to generate
19
+ // Base32 alphabet for secret encoding
20
+ const BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
21
+ // =============================================================================
22
+ // TOTP SERVICE
23
+ // =============================================================================
24
+ export class TOTPService {
25
+ config;
26
+ constructor(config) {
27
+ this.config = {
28
+ issuer: config.issuer,
29
+ algorithm: config.algorithm || DEFAULT_ALGORITHM,
30
+ digits: config.digits || DEFAULT_DIGITS,
31
+ period: config.period || DEFAULT_PERIOD,
32
+ };
33
+ logger.debug('TOTPService initialized', { issuer: config.issuer });
34
+ }
35
+ /**
36
+ * Generate a new TOTP secret for a user
37
+ * Returns the secret, URI for QR code generation, and a data URL for the QR code
38
+ */
39
+ async generateSecret(accountName) {
40
+ // Generate cryptographically secure random bytes
41
+ const secretBytes = randomBytes(SECRET_LENGTH);
42
+ // Encode as base32
43
+ const secret = this.base32Encode(secretBytes);
44
+ // Build otpauth URI
45
+ const uri = this.buildTOTPUri(secret, accountName);
46
+ // Generate QR code data URL
47
+ const qrCodeDataUrl = await this.generateQRCode(uri);
48
+ // Format secret for manual entry (groups of 4 for readability)
49
+ const manualEntryKey = secret.match(/.{1,4}/g)?.join(' ') || secret;
50
+ logger.info('Generated TOTP secret', { accountName });
51
+ return {
52
+ secret,
53
+ uri,
54
+ qrCodeDataUrl,
55
+ manualEntryKey,
56
+ };
57
+ }
58
+ /**
59
+ * Verify a TOTP code against a secret
60
+ * Allows for time drift by checking adjacent time windows
61
+ */
62
+ verifyCode(secret, code, window = 1) {
63
+ if (!code || code.length !== this.config.digits) {
64
+ return false;
65
+ }
66
+ // Clean the code (remove spaces, ensure digits only)
67
+ const cleanCode = code.replace(/\s/g, '');
68
+ if (!/^\d+$/.test(cleanCode)) {
69
+ return false;
70
+ }
71
+ const currentTime = Math.floor(Date.now() / 1000);
72
+ // Check current time step and adjacent windows
73
+ for (let i = -window; i <= window; i++) {
74
+ const timeStep = Math.floor((currentTime + i * this.config.period) / this.config.period);
75
+ const expectedCode = this.generateTOTP(secret, timeStep);
76
+ if (this.timingSafeCompare(cleanCode, expectedCode)) {
77
+ logger.debug('TOTP code verified', { window: i });
78
+ return true;
79
+ }
80
+ }
81
+ logger.debug('TOTP code verification failed');
82
+ return false;
83
+ }
84
+ /**
85
+ * Generate backup codes for account recovery
86
+ * These are one-time use codes stored hashed
87
+ */
88
+ generateBackupCodes(count = BACKUP_CODE_COUNT) {
89
+ const codes = [];
90
+ for (let i = 0; i < count; i++) {
91
+ // Generate random bytes and convert to alphanumeric
92
+ const bytes = randomBytes(BACKUP_CODE_LENGTH);
93
+ let code = '';
94
+ for (const byte of bytes) {
95
+ // Map to alphanumeric (0-9, A-Z)
96
+ const char = byte % 36;
97
+ code += char < 10 ? char.toString() : String.fromCharCode(55 + char); // A=65, but we start at 10
98
+ }
99
+ // Format with dash for readability: XXXX-XXXX
100
+ codes.push(`${code.slice(0, 4)}-${code.slice(4, 8)}`);
101
+ }
102
+ logger.info('Generated backup codes', { count });
103
+ return codes;
104
+ }
105
+ /**
106
+ * Hash a backup code for secure storage
107
+ * Uses SHA-256 for fast comparison while still being secure
108
+ */
109
+ hashBackupCode(code) {
110
+ // Normalize: remove dashes, uppercase
111
+ const normalized = code.replace(/-/g, '').toUpperCase();
112
+ return createHash('sha256').update(normalized).digest('hex');
113
+ }
114
+ /**
115
+ * Verify a backup code against stored hashed codes
116
+ * Returns the updated list with the used code removed (consumed)
117
+ */
118
+ verifyBackupCode(hashedCodes, code) {
119
+ // Hash the provided code
120
+ const hashedInput = this.hashBackupCode(code);
121
+ // Find and remove matching code
122
+ const index = hashedCodes.findIndex((stored) => this.timingSafeCompareHex(stored, hashedInput));
123
+ if (index === -1) {
124
+ logger.debug('Backup code verification failed');
125
+ return {
126
+ valid: false,
127
+ remainingCodes: hashedCodes,
128
+ };
129
+ }
130
+ // Remove the used code
131
+ const remainingCodes = [...hashedCodes];
132
+ remainingCodes.splice(index, 1);
133
+ logger.info('Backup code verified and consumed', {
134
+ remainingCount: remainingCodes.length,
135
+ });
136
+ return {
137
+ valid: true,
138
+ remainingCodes,
139
+ };
140
+ }
141
+ // ===========================================================================
142
+ // PRIVATE METHODS
143
+ // ===========================================================================
144
+ /**
145
+ * Build otpauth:// URI for QR code
146
+ */
147
+ buildTOTPUri(secret, accountName) {
148
+ const params = new URLSearchParams({
149
+ secret,
150
+ issuer: this.config.issuer,
151
+ algorithm: this.config.algorithm,
152
+ digits: this.config.digits.toString(),
153
+ period: this.config.period.toString(),
154
+ });
155
+ // Encode account name and issuer for the label
156
+ const label = encodeURIComponent(`${this.config.issuer}:${accountName}`);
157
+ return `otpauth://totp/${label}?${params.toString()}`;
158
+ }
159
+ /**
160
+ * Generate QR code as data URL
161
+ * Uses dynamic import to handle optional qrcode dependency
162
+ * If qrcode is not installed, returns the URI as base64 for client-side QR generation
163
+ */
164
+ async generateQRCode(data) {
165
+ try {
166
+ // Dynamic import to handle optional dependency
167
+ const QRCode = await import('qrcode').catch(() => null);
168
+ if (QRCode && typeof QRCode.toDataURL === 'function') {
169
+ return await QRCode.toDataURL(data, {
170
+ width: 256,
171
+ margin: 2,
172
+ color: {
173
+ dark: '#000000',
174
+ light: '#FFFFFF',
175
+ },
176
+ });
177
+ }
178
+ // Fallback: return URI as base64 encoded data URL
179
+ // The frontend can generate the QR code using a client-side library
180
+ logger.debug('QR code package not available, returning URI as fallback');
181
+ return `data:text/plain;base64,${Buffer.from(data).toString('base64')}`;
182
+ }
183
+ catch (error) {
184
+ // If qrcode package is not available, return the URI
185
+ logger.debug('QR code generation failed, returning URI as fallback', { error });
186
+ return `data:text/plain;base64,${Buffer.from(data).toString('base64')}`;
187
+ }
188
+ }
189
+ /**
190
+ * Generate TOTP code for a given time step
191
+ * Implements RFC 6238
192
+ */
193
+ generateTOTP(secret, timeStep) {
194
+ // Decode base32 secret
195
+ const secretBytes = this.base32Decode(secret);
196
+ // Convert time step to 8-byte big-endian buffer
197
+ const timeBuffer = Buffer.alloc(8);
198
+ timeBuffer.writeBigInt64BE(BigInt(timeStep));
199
+ // Generate HMAC using the configured algorithm
200
+ const algorithm = this.config.algorithm.toLowerCase();
201
+ const hmacResult = createHmac(algorithm, secretBytes)
202
+ .update(timeBuffer)
203
+ .digest();
204
+ // Dynamic truncation (RFC 4226)
205
+ const offset = hmacResult[hmacResult.length - 1] & 0x0f;
206
+ const binary = ((hmacResult[offset] & 0x7f) << 24) |
207
+ ((hmacResult[offset + 1] & 0xff) << 16) |
208
+ ((hmacResult[offset + 2] & 0xff) << 8) |
209
+ (hmacResult[offset + 3] & 0xff);
210
+ // Generate code with specified number of digits
211
+ const code = binary % Math.pow(10, this.config.digits);
212
+ return code.toString().padStart(this.config.digits, '0');
213
+ }
214
+ /**
215
+ * Base32 encode bytes
216
+ */
217
+ base32Encode(buffer) {
218
+ let result = '';
219
+ let bits = 0;
220
+ let value = 0;
221
+ for (const byte of buffer) {
222
+ value = (value << 8) | byte;
223
+ bits += 8;
224
+ while (bits >= 5) {
225
+ result += BASE32_ALPHABET[(value >>> (bits - 5)) & 31];
226
+ bits -= 5;
227
+ }
228
+ }
229
+ if (bits > 0) {
230
+ result += BASE32_ALPHABET[(value << (5 - bits)) & 31];
231
+ }
232
+ return result;
233
+ }
234
+ /**
235
+ * Base32 decode string to bytes
236
+ */
237
+ base32Decode(encoded) {
238
+ // Remove padding and convert to uppercase
239
+ const input = encoded.replace(/=+$/, '').toUpperCase();
240
+ const bytes = [];
241
+ let bits = 0;
242
+ let value = 0;
243
+ for (const char of input) {
244
+ const index = BASE32_ALPHABET.indexOf(char);
245
+ if (index === -1)
246
+ continue;
247
+ value = (value << 5) | index;
248
+ bits += 5;
249
+ if (bits >= 8) {
250
+ bytes.push((value >>> (bits - 8)) & 255);
251
+ bits -= 8;
252
+ }
253
+ }
254
+ return Buffer.from(bytes);
255
+ }
256
+ /**
257
+ * Timing-safe string comparison
258
+ */
259
+ timingSafeCompare(a, b) {
260
+ if (a.length !== b.length) {
261
+ return false;
262
+ }
263
+ const bufA = Buffer.from(a);
264
+ const bufB = Buffer.from(b);
265
+ return timingSafeEqual(bufA, bufB);
266
+ }
267
+ /**
268
+ * Timing-safe hex string comparison
269
+ */
270
+ timingSafeCompareHex(a, b) {
271
+ if (a.length !== b.length) {
272
+ return false;
273
+ }
274
+ try {
275
+ const bufA = Buffer.from(a, 'hex');
276
+ const bufB = Buffer.from(b, 'hex');
277
+ return timingSafeEqual(bufA, bufB);
278
+ }
279
+ catch {
280
+ return false;
281
+ }
282
+ }
283
+ }
284
+ // =============================================================================
285
+ // FACTORY FUNCTION
286
+ // =============================================================================
287
+ /**
288
+ * Create a new TOTP service instance
289
+ */
290
+ export function createTOTPService(config) {
291
+ return new TOTPService(config);
292
+ }
293
+ //# sourceMappingURL=totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"totp.js","sourceRoot":"","sources":["../../../../src/core/security/mfa/totp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Authentication and Authorization Middleware
3
+ *
4
+ * Provides Express middleware for protecting routes with authentication
5
+ * and permission-based authorization.
6
+ */
7
+ import type { Request, Response, NextFunction } from 'express';
8
+ import type { AuthContext, Permission } from '../types/user.js';
9
+ import type { AuthenticationService } from './auth.js';
10
+ declare global {
11
+ namespace Express {
12
+ interface Request {
13
+ auth?: AuthContext;
14
+ }
15
+ }
16
+ }
17
+ export interface AuthMiddlewareConfig {
18
+ authService: AuthenticationService;
19
+ getUserById?: (id: string) => Promise<any>;
20
+ getAppTokenByHash?: (hash: string) => Promise<any>;
21
+ }
22
+ export declare class AuthMiddleware {
23
+ private authService;
24
+ private getUserById?;
25
+ private getAppTokenByHash?;
26
+ constructor(config: AuthMiddlewareConfig);
27
+ /**
28
+ * Middleware to authenticate requests
29
+ * Supports both JWT tokens (Authorization: Bearer) and App tokens (X-API-Token)
30
+ */
31
+ authenticate(): (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
32
+ /**
33
+ * Middleware to require authentication
34
+ */
35
+ requireAuth(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
36
+ /**
37
+ * Middleware to require specific permissions
38
+ */
39
+ requirePermission(permission: Permission): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
40
+ /**
41
+ * Middleware to require any of the specified permissions
42
+ */
43
+ requireAnyPermission(permissions: Permission[]): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
44
+ /**
45
+ * Middleware to require all of the specified permissions
46
+ */
47
+ requireAllPermissions(permissions: Permission[]): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
48
+ /**
49
+ * Middleware to require admin role (user authentication only)
50
+ */
51
+ requireAdmin(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
52
+ /**
53
+ * Middleware to require Studio access
54
+ */
55
+ requireStudioAccess(): (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
56
+ /**
57
+ * Middleware for optional authentication (sets context but doesn't require it)
58
+ */
59
+ optionalAuth(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
60
+ /**
61
+ * Get current authentication context from request
62
+ */
63
+ static getAuthContext(req: Request): AuthContext;
64
+ /**
65
+ * Check if current request is from an authenticated user
66
+ */
67
+ static isAuthenticatedUser(req: Request): boolean;
68
+ /**
69
+ * Check if current request is from an app token
70
+ */
71
+ static isAppToken(req: Request): boolean;
72
+ /**
73
+ * Get user ID from authenticated request (if user auth)
74
+ */
75
+ static getUserId(req: Request): string | null;
76
+ /**
77
+ * Get app token ID from authenticated request (if app token auth)
78
+ */
79
+ static getAppTokenId(req: Request): string | null;
80
+ }
81
+ /**
82
+ * Helper function to create common middleware combinations
83
+ */
84
+ export declare function createAuthMiddleware(config: AuthMiddlewareConfig): {
85
+ authenticate: (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
86
+ requireAuth: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
87
+ optionalAuth: (req: Request, res: Response, next: NextFunction) => Promise<void>;
88
+ requirePermission: (permission: Permission) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
89
+ requireAnyPermission: (permissions: Permission[]) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
90
+ requireAllPermissions: (permissions: Permission[]) => (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
91
+ requireAdmin: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
92
+ requireStudioAccess: (req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
93
+ authAndPermission: (permission: Permission) => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
94
+ studioAuth: () => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
95
+ adminAuth: () => (((req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>) | ((req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined))[];
96
+ getAuthContext: typeof AuthMiddleware.getAuthContext;
97
+ isAuthenticatedUser: typeof AuthMiddleware.isAuthenticatedUser;
98
+ isAppToken: typeof AuthMiddleware.isAppToken;
99
+ getUserId: typeof AuthMiddleware.getUserId;
100
+ getAppTokenId: typeof AuthMiddleware.getAppTokenId;
101
+ };
102
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/core/security/middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Authentication and Authorization Middleware
3
+ *
4
+ * Provides Express middleware for protecting routes with authentication
5
+ * and permission-based authorization.
6
+ */
7
+ export class AuthMiddleware {
8
+ authService;
9
+ getUserById;
10
+ getAppTokenByHash;
11
+ constructor(config) {
12
+ this.authService = config.authService;
13
+ this.getUserById = config.getUserById;
14
+ this.getAppTokenByHash = config.getAppTokenByHash;
15
+ }
16
+ /**
17
+ * Middleware to authenticate requests
18
+ * Supports both JWT tokens (Authorization: Bearer) and App tokens (X-API-Token)
19
+ */
20
+ authenticate() {
21
+ return async (req, res, next) => {
22
+ try {
23
+ // Try JWT authentication first (Authorization header)
24
+ const authHeader = req.headers.authorization;
25
+ if (authHeader?.startsWith('Bearer ')) {
26
+ const token = authHeader.substring(7);
27
+ const result = await this.authService.validateToken(token);
28
+ if (result.valid && result.context) {
29
+ // For user tokens, verify user still exists and is active
30
+ if (result.context.type === 'user' && this.getUserById) {
31
+ const user = await this.getUserById(result.context.user.id);
32
+ if (!user || !user.isActive) {
33
+ return res.status(401).json({ error: 'User account is inactive' });
34
+ }
35
+ // Update context with fresh user data
36
+ result.context.user = {
37
+ ...result.context.user,
38
+ email: user.email,
39
+ firstName: user.firstName,
40
+ lastName: user.lastName,
41
+ isActive: user.isActive
42
+ };
43
+ }
44
+ req.auth = result.context;
45
+ return next();
46
+ }
47
+ }
48
+ // Try app token authentication (X-API-Token header)
49
+ const apiToken = req.headers['x-api-token'];
50
+ if (apiToken && this.getAppTokenByHash) {
51
+ const validation = await this.authService.validateAppToken(apiToken);
52
+ if (validation.valid && validation.hash) {
53
+ const appToken = await this.getAppTokenByHash(validation.hash);
54
+ if (appToken && appToken.isActive) {
55
+ // Check expiration
56
+ if (appToken.expiresAt && new Date() > new Date(appToken.expiresAt)) {
57
+ return res.status(401).json({ error: 'App token has expired' });
58
+ }
59
+ // Update usage tracking
60
+ appToken.lastUsedAt = new Date().toISOString();
61
+ appToken.usageCount = (appToken.usageCount || 0) + 1;
62
+ req.auth = {
63
+ type: 'app_token',
64
+ token: {
65
+ id: appToken.id,
66
+ name: appToken.name,
67
+ permissions: appToken.permissions,
68
+ createdBy: appToken.createdBy,
69
+ isActive: appToken.isActive
70
+ }
71
+ };
72
+ return next();
73
+ }
74
+ }
75
+ }
76
+ // No valid authentication found
77
+ req.auth = { type: 'anonymous' };
78
+ next();
79
+ }
80
+ catch (error) {
81
+ console.error('Authentication error:', error);
82
+ return res.status(500).json({ error: 'Authentication service error' });
83
+ }
84
+ };
85
+ }
86
+ /**
87
+ * Middleware to require authentication
88
+ */
89
+ requireAuth() {
90
+ return (req, res, next) => {
91
+ if (!req.auth || req.auth.type === 'anonymous') {
92
+ return res.status(401).json({
93
+ error: 'Authentication required',
94
+ message: 'Please provide a valid Bearer token or X-API-Token header'
95
+ });
96
+ }
97
+ next();
98
+ };
99
+ }
100
+ /**
101
+ * Middleware to require specific permissions
102
+ */
103
+ requirePermission(permission) {
104
+ return (req, res, next) => {
105
+ if (!req.auth || req.auth.type === 'anonymous') {
106
+ return res.status(401).json({ error: 'Authentication required' });
107
+ }
108
+ if (!this.authService.hasPermission(req.auth, permission)) {
109
+ return res.status(403).json({
110
+ error: 'Insufficient permissions',
111
+ required: permission
112
+ });
113
+ }
114
+ next();
115
+ };
116
+ }
117
+ /**
118
+ * Middleware to require any of the specified permissions
119
+ */
120
+ requireAnyPermission(permissions) {
121
+ return (req, res, next) => {
122
+ if (!req.auth || req.auth.type === 'anonymous') {
123
+ return res.status(401).json({ error: 'Authentication required' });
124
+ }
125
+ if (!this.authService.hasAnyPermission(req.auth, permissions)) {
126
+ return res.status(403).json({
127
+ error: 'Insufficient permissions',
128
+ required: `One of: ${permissions.join(', ')}`
129
+ });
130
+ }
131
+ next();
132
+ };
133
+ }
134
+ /**
135
+ * Middleware to require all of the specified permissions
136
+ */
137
+ requireAllPermissions(permissions) {
138
+ return (req, res, next) => {
139
+ if (!req.auth || req.auth.type === 'anonymous') {
140
+ return res.status(401).json({ error: 'Authentication required' });
141
+ }
142
+ if (!this.authService.hasAllPermissions(req.auth, permissions)) {
143
+ return res.status(403).json({
144
+ error: 'Insufficient permissions',
145
+ required: `All of: ${permissions.join(', ')}`
146
+ });
147
+ }
148
+ next();
149
+ };
150
+ }
151
+ /**
152
+ * Middleware to require admin role (user authentication only)
153
+ */
154
+ requireAdmin() {
155
+ return (req, res, next) => {
156
+ if (!req.auth || req.auth.type !== 'user') {
157
+ return res.status(401).json({ error: 'User authentication required' });
158
+ }
159
+ if (req.auth.user.role !== 'admin') {
160
+ return res.status(403).json({
161
+ error: 'Admin access required',
162
+ currentRole: req.auth.user.role
163
+ });
164
+ }
165
+ next();
166
+ };
167
+ }
168
+ /**
169
+ * Middleware to require Studio access
170
+ */
171
+ requireStudioAccess() {
172
+ return this.requirePermission('studio:access');
173
+ }
174
+ /**
175
+ * Middleware for optional authentication (sets context but doesn't require it)
176
+ */
177
+ optionalAuth() {
178
+ return async (req, res, next) => {
179
+ // Use the authenticate middleware but don't fail on anonymous
180
+ await this.authenticate()(req, res, (error) => {
181
+ // Always continue, even if authentication failed
182
+ if (!req.auth) {
183
+ req.auth = { type: 'anonymous' };
184
+ }
185
+ next(error);
186
+ });
187
+ };
188
+ }
189
+ /**
190
+ * Get current authentication context from request
191
+ */
192
+ static getAuthContext(req) {
193
+ return req.auth || { type: 'anonymous' };
194
+ }
195
+ /**
196
+ * Check if current request is from an authenticated user
197
+ */
198
+ static isAuthenticatedUser(req) {
199
+ return req.auth?.type === 'user';
200
+ }
201
+ /**
202
+ * Check if current request is from an app token
203
+ */
204
+ static isAppToken(req) {
205
+ return req.auth?.type === 'app_token';
206
+ }
207
+ /**
208
+ * Get user ID from authenticated request (if user auth)
209
+ */
210
+ static getUserId(req) {
211
+ return req.auth?.type === 'user' ? req.auth.user.id : null;
212
+ }
213
+ /**
214
+ * Get app token ID from authenticated request (if app token auth)
215
+ */
216
+ static getAppTokenId(req) {
217
+ return req.auth?.type === 'app_token' ? req.auth.token.id : null;
218
+ }
219
+ }
220
+ /**
221
+ * Helper function to create common middleware combinations
222
+ */
223
+ export function createAuthMiddleware(config) {
224
+ const middleware = new AuthMiddleware(config);
225
+ return {
226
+ // Core middleware
227
+ authenticate: middleware.authenticate(),
228
+ requireAuth: middleware.requireAuth(),
229
+ optionalAuth: middleware.optionalAuth(),
230
+ // Permission-based middleware
231
+ requirePermission: (permission) => middleware.requirePermission(permission),
232
+ requireAnyPermission: (permissions) => middleware.requireAnyPermission(permissions),
233
+ requireAllPermissions: (permissions) => middleware.requireAllPermissions(permissions),
234
+ // Role-based middleware
235
+ requireAdmin: middleware.requireAdmin(),
236
+ requireStudioAccess: middleware.requireStudioAccess(),
237
+ // Common combinations
238
+ authAndPermission: (permission) => [
239
+ middleware.authenticate(),
240
+ middleware.requireAuth(),
241
+ middleware.requirePermission(permission)
242
+ ],
243
+ studioAuth: () => [
244
+ middleware.authenticate(),
245
+ middleware.requireAuth(),
246
+ middleware.requireStudioAccess()
247
+ ],
248
+ adminAuth: () => [
249
+ middleware.authenticate(),
250
+ middleware.requireAuth(),
251
+ middleware.requireAdmin()
252
+ ],
253
+ // Utility functions
254
+ getAuthContext: AuthMiddleware.getAuthContext,
255
+ isAuthenticatedUser: AuthMiddleware.isAuthenticatedUser,
256
+ isAppToken: AuthMiddleware.isAppToken,
257
+ getUserId: AuthMiddleware.getUserId,
258
+ getAppTokenId: AuthMiddleware.getAppTokenId
259
+ };
260
+ }
261
+ //# sourceMappingURL=middleware.js.map