@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,58 @@
1
+ import type { TrokkyLogger } from '../utils/logger.js';
2
+ import type { AuditEvent } from '../core/engine.js';
3
+ import type { MFARequirement } from './mfa-service.js';
4
+ import type { AuthenticationResult, AuthenticationSuccessResult, DataStorageAdapter, MFAMethodType, OAuthProvider, OAuthProviderType, TrokkyConfig, UpdateUserData, User, UserListOptions, UserSession } from '../types/index.js';
5
+ export interface OAuthServiceDependencies {
6
+ config: TrokkyConfig;
7
+ logger: TrokkyLogger;
8
+ dataStorage: DataStorageAdapter;
9
+ getUser: (id: string) => Promise<User | null>;
10
+ updateUser: (id: string, userData: UpdateUserData) => Promise<User>;
11
+ listUsers: (options?: UserListOptions) => Promise<User[]>;
12
+ logAuditEvent: (event: AuditEvent) => void;
13
+ checkMFARequired: (userId: string) => Promise<MFARequirement>;
14
+ isDeviceTrusted: (userId: string, deviceId: string) => Promise<boolean>;
15
+ issueFullTokens: (user: User, options?: {
16
+ rememberMe?: boolean;
17
+ }) => Promise<AuthenticationSuccessResult>;
18
+ generateMFAPendingToken: (user: User, methods: MFAMethodType[]) => Promise<string>;
19
+ generateMFASetupToken: (user: User, allowedMethods: MFAMethodType[]) => Promise<string>;
20
+ generateAuthToken: (user: User, expiresIn?: string, rememberMe?: boolean) => Promise<string>;
21
+ verifyAuthToken: (token: string) => Promise<UserSession | null>;
22
+ }
23
+ /**
24
+ * OAuth provider linking and login.
25
+ */
26
+ export declare class OAuthService {
27
+ private readonly deps;
28
+ constructor(deps: OAuthServiceDependencies);
29
+ /**
30
+ * Link an OAuth provider to an existing user
31
+ */
32
+ linkOAuthProvider(userId: string, provider: OAuthProvider): Promise<User>;
33
+ /**
34
+ * Unlink an OAuth provider from a user
35
+ */
36
+ unlinkOAuthProvider(userId: string, providerName: OAuthProviderType): Promise<User>;
37
+ /**
38
+ * Authenticate a user via OAuth provider
39
+ * Returns null if no user is linked to this provider
40
+ * Returns AuthenticationResult which may require MFA verification or setup
41
+ */
42
+ authenticateWithOAuth(providerName: OAuthProviderType, providerId: string, options?: {
43
+ deviceId?: string;
44
+ }): Promise<AuthenticationResult | null>;
45
+ /**
46
+ * Find a user by OAuth provider
47
+ */
48
+ getUserByOAuthProvider(providerName: OAuthProviderType, providerId: string): Promise<User | null>;
49
+ /**
50
+ * Check if OAuth is configured for a provider
51
+ */
52
+ isOAuthConfigured(providerName: OAuthProviderType): boolean;
53
+ /**
54
+ * Get OAuth configuration for a provider
55
+ */
56
+ getOAuthConfig(providerName: OAuthProviderType): Record<string, string> | null;
57
+ }
58
+ //# sourceMappingURL=oauth-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/oauth-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,253 @@
1
+ import { InvalidInputError } from '../errors/index.js';
2
+ /**
3
+ * OAuth provider linking and login.
4
+ */
5
+ export class OAuthService {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ /**
11
+ * Link an OAuth provider to an existing user
12
+ */
13
+ async linkOAuthProvider(userId, provider) {
14
+ const user = await this.deps.getUser(userId);
15
+ if (!user) {
16
+ throw new InvalidInputError('User not found');
17
+ }
18
+ // Check if this provider is already linked to another user
19
+ const existingUser = await this.getUserByOAuthProvider(provider.provider, provider.providerId);
20
+ if (existingUser && existingUser.id !== userId) {
21
+ throw new InvalidInputError('This account is already linked to another user');
22
+ }
23
+ // Check if user already has this provider linked
24
+ const existingProviders = user.oauthProviders || [];
25
+ const alreadyLinked = existingProviders.some((p) => p.provider === provider.provider);
26
+ if (alreadyLinked) {
27
+ throw new InvalidInputError(`${provider.provider} account is already linked`);
28
+ }
29
+ // Add the provider
30
+ const updatedProviders = [...existingProviders, provider];
31
+ const updatedUser = await this.deps.updateUser(userId, {
32
+ oauthProviders: updatedProviders,
33
+ });
34
+ this.deps.logAuditEvent({
35
+ type: 'user_updated',
36
+ userId: user.id,
37
+ username: user.username,
38
+ action: `Linked ${provider.provider} OAuth account`,
39
+ timestamp: new Date().toISOString(),
40
+ success: true,
41
+ details: {
42
+ provider: provider.provider,
43
+ providerEmail: provider.email,
44
+ },
45
+ });
46
+ return updatedUser;
47
+ }
48
+ /**
49
+ * Unlink an OAuth provider from a user
50
+ */
51
+ async unlinkOAuthProvider(userId, providerName) {
52
+ const user = await this.deps.getUser(userId);
53
+ if (!user) {
54
+ throw new InvalidInputError('User not found');
55
+ }
56
+ const existingProviders = user.oauthProviders || [];
57
+ const providerToRemove = existingProviders.find((p) => p.provider === providerName);
58
+ if (!providerToRemove) {
59
+ throw new InvalidInputError(`${providerName} account is not linked`);
60
+ }
61
+ // Remove the provider
62
+ const updatedProviders = existingProviders.filter((p) => p.provider !== providerName);
63
+ const updatedUser = await this.deps.updateUser(userId, {
64
+ oauthProviders: updatedProviders,
65
+ });
66
+ this.deps.logAuditEvent({
67
+ type: 'user_updated',
68
+ userId: user.id,
69
+ username: user.username,
70
+ action: `Unlinked ${providerName} OAuth account`,
71
+ timestamp: new Date().toISOString(),
72
+ success: true,
73
+ details: {
74
+ provider: providerName,
75
+ },
76
+ });
77
+ return updatedUser;
78
+ }
79
+ /**
80
+ * Authenticate a user via OAuth provider
81
+ * Returns null if no user is linked to this provider
82
+ * Returns AuthenticationResult which may require MFA verification or setup
83
+ */
84
+ async authenticateWithOAuth(providerName, providerId, options) {
85
+ try {
86
+ // Find user by OAuth provider
87
+ const user = await this.getUserByOAuthProvider(providerName, providerId);
88
+ if (!user || !user.isActive) {
89
+ return null;
90
+ }
91
+ // Update last login time and lastUsedAt for the OAuth provider
92
+ const now = new Date().toISOString();
93
+ const updatedProviders = (user.oauthProviders || []).map((p) => p.provider === providerName && p.providerId === providerId
94
+ ? { ...p, lastUsedAt: now }
95
+ : p);
96
+ await this.deps.updateUser(user.id, {
97
+ lastLoginAt: now,
98
+ oauthProviders: updatedProviders,
99
+ });
100
+ // Check MFA requirements (same as regular login)
101
+ const mfaStatus = await this.deps.checkMFARequired(user.id);
102
+ if (mfaStatus.required) {
103
+ // User has MFA set up - check if device is trusted first
104
+ if (mfaStatus.userHasMFA) {
105
+ // Check if device is trusted (can skip MFA)
106
+ if (options?.deviceId) {
107
+ const isTrusted = await this.deps.isDeviceTrusted(user.id, options.deviceId);
108
+ if (isTrusted) {
109
+ this.deps.logger.info('OAuth login - skipping MFA for trusted device', {
110
+ userId: user.id,
111
+ provider: providerName,
112
+ deviceId: options.deviceId.substring(0, 8) + '...',
113
+ });
114
+ // Device is trusted, issue full tokens (skip MFA)
115
+ return this.deps.issueFullTokens(user, {});
116
+ }
117
+ }
118
+ const mfaToken = await this.deps.generateMFAPendingToken(user, mfaStatus.methods);
119
+ this.deps.logAuditEvent({
120
+ type: 'user_login',
121
+ userId: user.id,
122
+ username: user.username,
123
+ action: `OAuth login - MFA verification required`,
124
+ timestamp: now,
125
+ success: true,
126
+ details: {
127
+ mfaRequired: true,
128
+ methods: mfaStatus.methods,
129
+ provider: providerName,
130
+ },
131
+ });
132
+ return {
133
+ type: 'mfa_required',
134
+ requiresMFA: true,
135
+ mfaToken,
136
+ methods: mfaStatus.methods,
137
+ expiresIn: 300, // 5 minutes
138
+ };
139
+ }
140
+ // Org/role requires MFA but user hasn't set it up
141
+ if (mfaStatus.reason === 'org_required' || mfaStatus.reason === 'role_required') {
142
+ const setupToken = await this.deps.generateMFASetupToken(user, mfaStatus.methods);
143
+ const message = mfaStatus.reason === 'role_required'
144
+ ? `Your role (${user.role}) requires MFA. Please set up multi-factor authentication.`
145
+ : 'Your organization requires MFA. Please set up multi-factor authentication.';
146
+ this.deps.logAuditEvent({
147
+ type: 'user_login',
148
+ userId: user.id,
149
+ username: user.username,
150
+ action: `OAuth login - MFA setup required`,
151
+ timestamp: now,
152
+ success: true,
153
+ details: {
154
+ mfaSetupRequired: true,
155
+ allowedMethods: mfaStatus.methods,
156
+ reason: mfaStatus.reason,
157
+ provider: providerName,
158
+ },
159
+ });
160
+ return {
161
+ type: 'mfa_setup_required',
162
+ requiresMFASetup: true,
163
+ setupToken,
164
+ allowedMethods: mfaStatus.methods,
165
+ message,
166
+ expiresIn: 900, // 15 minutes
167
+ };
168
+ }
169
+ }
170
+ // No MFA required - generate full tokens
171
+ const securityConfig = this.deps.config.security?.tokens;
172
+ const tokenExpiresIn = securityConfig?.accessTokenTtl || '2h';
173
+ const refreshTokenExpiresIn = securityConfig?.refreshTokenTtl || '7d';
174
+ const token = await this.deps.generateAuthToken(user, tokenExpiresIn, false);
175
+ const refreshToken = await this.deps.generateAuthToken(user, refreshTokenExpiresIn, false);
176
+ // Log successful login
177
+ this.deps.logAuditEvent({
178
+ type: 'user_login',
179
+ userId: user.id,
180
+ username: user.username,
181
+ action: `User authenticated via ${providerName} OAuth`,
182
+ timestamp: now,
183
+ success: true,
184
+ details: {
185
+ role: user.role,
186
+ provider: providerName,
187
+ },
188
+ });
189
+ // Return user without password hash
190
+ const { passwordHash, ...safeUser } = user;
191
+ // Get token expiration time
192
+ const session = await this.deps.verifyAuthToken(token);
193
+ return {
194
+ type: 'success',
195
+ user: { ...safeUser, passwordHash: '' },
196
+ token,
197
+ refreshToken,
198
+ expiresAt: session?.expiresAt || new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString(),
199
+ };
200
+ }
201
+ catch (error) {
202
+ this.deps.logger.error('OAuth authentication failed', {
203
+ error: error instanceof Error ? error.message : String(error),
204
+ provider: providerName,
205
+ });
206
+ return null;
207
+ }
208
+ }
209
+ /**
210
+ * Find a user by OAuth provider
211
+ */
212
+ async getUserByOAuthProvider(providerName, providerId) {
213
+ // First try storage adapter method if available
214
+ if (this.deps.dataStorage.getUserByOAuthProvider) {
215
+ return this.deps.dataStorage.getUserByOAuthProvider(providerName, providerId);
216
+ }
217
+ // Fallback: list all users and search (inefficient, but works as fallback)
218
+ this.deps.logger.warn('getUserByOAuthProvider not implemented in storage adapter, using fallback');
219
+ const users = await this.deps.listUsers({ limit: 10000 });
220
+ for (const user of users) {
221
+ const provider = (user.oauthProviders || []).find((p) => p.provider === providerName && p.providerId === providerId);
222
+ if (provider) {
223
+ return user;
224
+ }
225
+ }
226
+ return null;
227
+ }
228
+ /**
229
+ * Check if OAuth is configured for a provider
230
+ */
231
+ isOAuthConfigured(providerName) {
232
+ if (providerName === 'google') {
233
+ const config = this.deps.config.oauth?.google;
234
+ return !!(config?.clientId && config?.clientSecret && config?.redirectUri);
235
+ }
236
+ return false;
237
+ }
238
+ /**
239
+ * Get OAuth configuration for a provider
240
+ */
241
+ getOAuthConfig(providerName) {
242
+ if (providerName === 'google' && this.isOAuthConfigured('google')) {
243
+ const config = this.deps.config.oauth.google;
244
+ return {
245
+ clientId: config.clientId,
246
+ clientSecret: config.clientSecret,
247
+ redirectUri: config.redirectUri,
248
+ };
249
+ }
250
+ return null;
251
+ }
252
+ }
253
+ //# sourceMappingURL=oauth-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-service.js","sourceRoot":"","sources":["../../../src/core/services/oauth-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { CryptoAdapter } from '../crypto/adapter.js';
2
+ import type { TrokkyLogger } from '../utils/logger.js';
3
+ import { OAuth2AuthorizationServer } from '../security/oauth2/index.js';
4
+ import type { OAuth2Scope, TokenResponse } from '../types/oauth2.js';
5
+ import { User, UpdateUserData } from '../types/index.js';
6
+ export interface OAuth2ServerServiceDependencies {
7
+ logger: TrokkyLogger;
8
+ cryptoAdapter: CryptoAdapter;
9
+ jwtSecret: string;
10
+ getOAuth2Server: () => OAuth2AuthorizationServer | null;
11
+ getOAuth2Options: () => {
12
+ accessTokenTtl?: number;
13
+ refreshTokenTtl?: number;
14
+ } | undefined;
15
+ getUser: (id: string) => Promise<User | null>;
16
+ updateUser: (id: string, userData: UpdateUserData) => Promise<User>;
17
+ }
18
+ /**
19
+ * OAuth2 authorization-server token issuance and consent management.
20
+ */
21
+ export declare class OAuth2ServerService {
22
+ private readonly deps;
23
+ constructor(deps: OAuth2ServerServiceDependencies);
24
+ /**
25
+ * Get the OAuth2 Authorization Server instance
26
+ * Returns null if OAuth2 is not enabled
27
+ */
28
+ getOAuth2Server(): OAuth2AuthorizationServer | null;
29
+ /**
30
+ * Generate OAuth2 tokens for a user
31
+ * Used by the OAuth2 routes to create access and refresh tokens
32
+ */
33
+ generateOAuth2Tokens(user: User, scopes: OAuth2Scope[], clientId: string): Promise<{
34
+ accessToken: string;
35
+ refreshToken?: string;
36
+ expiresIn: number;
37
+ }>;
38
+ /**
39
+ * Refresh an OAuth2 access token using a refresh token
40
+ * Returns new tokens if the refresh token is valid
41
+ */
42
+ refreshOAuth2Token(refreshToken: string, clientId: string, requestedScope?: string): Promise<TokenResponse | null>;
43
+ /**
44
+ * Check if a user has an existing consent for a client with the given scopes
45
+ * Returns the consent if all requested scopes are already consented, null otherwise
46
+ */
47
+ getUserConsent(userId: string, clientId: string, requestedScopes: OAuth2Scope[]): Promise<{
48
+ hasConsent: boolean;
49
+ consentedScopes: OAuth2Scope[];
50
+ }>;
51
+ /**
52
+ * Save user consent for a client
53
+ * Stores in user preferences for persistence
54
+ */
55
+ saveUserConsent(userId: string, clientId: string, scopes: OAuth2Scope[], expiresInDays?: number): Promise<boolean>;
56
+ /**
57
+ * Revoke user consent for a client
58
+ */
59
+ revokeUserConsent(userId: string, clientId: string): Promise<boolean>;
60
+ }
61
+ //# sourceMappingURL=oauth2-server-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2-server-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/oauth2-server-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAExD,MAAM,WAAW,+BAA+B;IAC9C,MAAM,EAAE,YAAY,CAAA;IACpB,aAAa,EAAE,aAAa,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,yBAAyB,GAAG,IAAI,CAAA;IACvD,gBAAgB,EAAE,MAAM;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACzF,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;IAC7C,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACpE;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,+BAA+B;IAElE;;;OAGG;IACI,eAAe,IAAI,yBAAyB,GAAG,IAAI;IAI1D;;;OAGG;IACU,oBAAoB,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,SAAS,EAAE,MAAM,CAAA;KAClB,CAAC;IAoDF;;;OAGG;IACU,kBAAkB,CAC7B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqEhC;;;OAGG;IACU,cAAc,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,WAAW,EAAE,GAC7B,OAAO,CAAC;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAsDnE;;;OAGG;IACU,eAAe,CAC1B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EAAE,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC;IAqEnB;;OAEG;IACU,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA+BnF"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * OAuth2 authorization-server token issuance and consent management.
3
+ */
4
+ export class OAuth2ServerService {
5
+ deps;
6
+ constructor(deps) {
7
+ this.deps = deps;
8
+ }
9
+ /**
10
+ * Get the OAuth2 Authorization Server instance
11
+ * Returns null if OAuth2 is not enabled
12
+ */
13
+ getOAuth2Server() {
14
+ return this.deps.getOAuth2Server();
15
+ }
16
+ /**
17
+ * Generate OAuth2 tokens for a user
18
+ * Used by the OAuth2 routes to create access and refresh tokens
19
+ */
20
+ async generateOAuth2Tokens(user, scopes, clientId) {
21
+ const accessTokenTtl = this.deps.getOAuth2Options()?.accessTokenTtl ?? 3600;
22
+ const refreshTokenTtl = this.deps.getOAuth2Options()?.refreshTokenTtl ?? 2592000;
23
+ const includeRefreshToken = scopes.includes('offline_access');
24
+ // Convert OAuth2 scopes to permissions for the token payload
25
+ const permissions = this.deps.getOAuth2Server()?.scopesToPermissions(scopes) || [];
26
+ // Generate access token
27
+ const accessTokenPayload = {
28
+ sub: user.id,
29
+ type: 'oauth2_access',
30
+ clientId,
31
+ scopes,
32
+ permissions,
33
+ username: user.username,
34
+ email: user.email,
35
+ role: user.role
36
+ };
37
+ const accessToken = await this.deps.cryptoAdapter.generateJWT(accessTokenPayload, this.deps.jwtSecret, {
38
+ expiresIn: accessTokenTtl
39
+ });
40
+ let refreshToken;
41
+ if (includeRefreshToken) {
42
+ const refreshTokenPayload = {
43
+ sub: user.id,
44
+ type: 'oauth2_refresh',
45
+ clientId,
46
+ scopes
47
+ };
48
+ refreshToken = await this.deps.cryptoAdapter.generateJWT(refreshTokenPayload, this.deps.jwtSecret, {
49
+ expiresIn: refreshTokenTtl
50
+ });
51
+ }
52
+ this.deps.logger.info('OAuth2 tokens generated', {
53
+ userId: user.id,
54
+ clientId,
55
+ scopes,
56
+ includeRefreshToken
57
+ });
58
+ return {
59
+ accessToken,
60
+ refreshToken,
61
+ expiresIn: accessTokenTtl
62
+ };
63
+ }
64
+ /**
65
+ * Refresh an OAuth2 access token using a refresh token
66
+ * Returns new tokens if the refresh token is valid
67
+ */
68
+ async refreshOAuth2Token(refreshToken, clientId, requestedScope) {
69
+ try {
70
+ // Verify refresh token
71
+ const payload = await this.deps.cryptoAdapter.verifyJWT(refreshToken, this.deps.jwtSecret);
72
+ if (!payload) {
73
+ this.deps.logger.warn('Invalid refresh token');
74
+ return null;
75
+ }
76
+ // Validate token type and client
77
+ if (payload.type !== 'oauth2_refresh') {
78
+ this.deps.logger.warn('Invalid token type for refresh', { type: payload.type });
79
+ return null;
80
+ }
81
+ if (payload.clientId !== clientId) {
82
+ this.deps.logger.warn('Client ID mismatch for refresh', {
83
+ expected: payload.clientId,
84
+ received: clientId
85
+ });
86
+ return null;
87
+ }
88
+ // Get user to ensure they still exist and are active
89
+ const user = await this.deps.getUser(payload.sub);
90
+ if (!user || !user.isActive) {
91
+ this.deps.logger.warn('User not found or inactive for refresh', { userId: payload.sub });
92
+ return null;
93
+ }
94
+ // Determine scopes - can only narrow, not expand
95
+ let scopes = payload.scopes;
96
+ if (requestedScope) {
97
+ const requestedScopes = requestedScope.split(' ').filter(Boolean);
98
+ scopes = requestedScopes.filter(s => payload.scopes.includes(s));
99
+ }
100
+ // Generate new tokens
101
+ const tokens = await this.generateOAuth2Tokens(user, scopes, clientId);
102
+ this.deps.logger.info('OAuth2 token refreshed', {
103
+ userId: user.id,
104
+ clientId,
105
+ scopes
106
+ });
107
+ return {
108
+ access_token: tokens.accessToken,
109
+ token_type: 'Bearer',
110
+ expires_in: tokens.expiresIn,
111
+ refresh_token: tokens.refreshToken,
112
+ scope: scopes.join(' ')
113
+ };
114
+ }
115
+ catch (error) {
116
+ this.deps.logger.warn('OAuth2 token refresh failed', { error });
117
+ return null;
118
+ }
119
+ }
120
+ // ============================================
121
+ // OAuth2 Consent Management
122
+ // ============================================
123
+ /**
124
+ * Check if a user has an existing consent for a client with the given scopes
125
+ * Returns the consent if all requested scopes are already consented, null otherwise
126
+ */
127
+ async getUserConsent(userId, clientId, requestedScopes) {
128
+ try {
129
+ const user = await this.deps.getUser(userId);
130
+ if (!user) {
131
+ this.deps.logger.debug('getUserConsent: user not found', { userId });
132
+ return { hasConsent: false, consentedScopes: [] };
133
+ }
134
+ this.deps.logger.debug('getUserConsent: checking consent', {
135
+ userId,
136
+ clientId,
137
+ requestedScopes,
138
+ userPreferences: user.preferences
139
+ });
140
+ // Get consents from user preferences
141
+ const consents = (user.preferences?._oauth2Consents || {});
142
+ const consent = consents[clientId];
143
+ if (!consent) {
144
+ this.deps.logger.debug('getUserConsent: no consent found for client', { clientId, consents });
145
+ return { hasConsent: false, consentedScopes: [] };
146
+ }
147
+ // Check if consent has expired
148
+ if (consent.expiresAt && new Date(consent.expiresAt) < new Date()) {
149
+ this.deps.logger.debug('getUserConsent: consent expired', { consent });
150
+ return { hasConsent: false, consentedScopes: [] };
151
+ }
152
+ // Check if all requested scopes are already consented
153
+ const consentedScopes = consent.scopes || [];
154
+ const hasAllScopes = requestedScopes.every(scope => consentedScopes.includes(scope));
155
+ this.deps.logger.debug('getUserConsent: result', {
156
+ hasAllScopes,
157
+ consentedScopes,
158
+ requestedScopes
159
+ });
160
+ return {
161
+ hasConsent: hasAllScopes,
162
+ consentedScopes
163
+ };
164
+ }
165
+ catch (error) {
166
+ this.deps.logger.warn('Failed to check user consent', { error, userId, clientId });
167
+ return { hasConsent: false, consentedScopes: [] };
168
+ }
169
+ }
170
+ /**
171
+ * Save user consent for a client
172
+ * Stores in user preferences for persistence
173
+ */
174
+ async saveUserConsent(userId, clientId, scopes, expiresInDays) {
175
+ try {
176
+ this.deps.logger.info('saveUserConsent: starting', { userId, clientId, scopes });
177
+ const user = await this.deps.getUser(userId);
178
+ if (!user) {
179
+ this.deps.logger.warn('Cannot save consent - user not found', { userId });
180
+ return false;
181
+ }
182
+ // Get existing consents
183
+ const currentPreferences = user.preferences || {};
184
+ const existingConsents = (currentPreferences._oauth2Consents || {});
185
+ this.deps.logger.debug('saveUserConsent: existing state', {
186
+ currentPreferences,
187
+ existingConsents
188
+ });
189
+ // Merge scopes if consent already exists
190
+ const existingConsent = existingConsents[clientId];
191
+ const mergedScopes = existingConsent
192
+ ? [...new Set([...existingConsent.scopes, ...scopes])]
193
+ : scopes;
194
+ // Calculate expiry (default: 365 days, or never if not specified)
195
+ const expiresAt = expiresInDays
196
+ ? new Date(Date.now() + expiresInDays * 24 * 60 * 60 * 1000).toISOString()
197
+ : undefined;
198
+ // Update consents
199
+ const updatedConsents = {
200
+ ...existingConsents,
201
+ [clientId]: {
202
+ scopes: mergedScopes,
203
+ grantedAt: new Date().toISOString(),
204
+ expiresAt
205
+ }
206
+ };
207
+ const newPreferences = {
208
+ ...currentPreferences,
209
+ _oauth2Consents: updatedConsents
210
+ };
211
+ this.deps.logger.debug('saveUserConsent: saving new preferences', { newPreferences });
212
+ // Save to user preferences
213
+ await this.deps.updateUser(userId, {
214
+ preferences: newPreferences
215
+ });
216
+ this.deps.logger.info('User consent saved successfully', {
217
+ userId,
218
+ clientId,
219
+ scopes: mergedScopes
220
+ });
221
+ return true;
222
+ }
223
+ catch (error) {
224
+ this.deps.logger.error('Failed to save user consent', { error, userId, clientId });
225
+ return false;
226
+ }
227
+ }
228
+ /**
229
+ * Revoke user consent for a client
230
+ */
231
+ async revokeUserConsent(userId, clientId) {
232
+ try {
233
+ const user = await this.deps.getUser(userId);
234
+ if (!user) {
235
+ return false;
236
+ }
237
+ const currentPreferences = user.preferences || {};
238
+ const existingConsents = (currentPreferences._oauth2Consents || {});
239
+ if (!existingConsents[clientId]) {
240
+ return true; // Already revoked
241
+ }
242
+ // Remove the consent for this client
243
+ const { [clientId]: _removed, ...remainingConsents } = existingConsents;
244
+ await this.deps.updateUser(userId, {
245
+ preferences: {
246
+ ...currentPreferences,
247
+ _oauth2Consents: remainingConsents
248
+ }
249
+ });
250
+ this.deps.logger.info('User consent revoked', { userId, clientId });
251
+ return true;
252
+ }
253
+ catch (error) {
254
+ this.deps.logger.error('Failed to revoke user consent', { error, userId, clientId });
255
+ return false;
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=oauth2-server-service.js.map