@contember/engine-tenant-api 2.2.0-alpha.3 → 2.2.0-alpha.5

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 (1181) hide show
  1. package/CLAUDE.md +35 -2
  2. package/dist/development/index.cjs +30 -0
  3. package/dist/development/index.cjs.map +1 -1
  4. package/dist/development/index.js +31 -1
  5. package/dist/development/index.js.map +1 -1
  6. package/dist/development/src/TenantContainer.cjs +15 -3
  7. package/dist/development/src/TenantContainer.cjs.map +1 -1
  8. package/dist/development/src/TenantContainer.js +15 -3
  9. package/dist/development/src/TenantContainer.js.map +1 -1
  10. package/dist/development/src/bridges/system/IdentityFetcher.cjs +2 -1
  11. package/dist/development/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  12. package/dist/development/src/bridges/system/IdentityFetcher.js +2 -1
  13. package/dist/development/src/bridges/system/IdentityFetcher.js.map +1 -1
  14. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
  15. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
  16. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
  17. package/dist/development/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
  18. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
  19. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
  20. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
  21. package/dist/development/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
  22. package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
  23. package/dist/development/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
  24. package/dist/development/src/migrations/2026-08-04-120000-config-panel.js +12 -0
  25. package/dist/development/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
  26. package/dist/development/src/migrations/runner.cjs +9 -2
  27. package/dist/development/src/migrations/runner.cjs.map +1 -1
  28. package/dist/development/src/migrations/runner.js +9 -2
  29. package/dist/development/src/migrations/runner.js.map +1 -1
  30. package/dist/development/src/migrations/snapshot.cjs +6 -1
  31. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  32. package/dist/development/src/migrations/snapshot.js +6 -1
  33. package/dist/development/src/migrations/snapshot.js.map +1 -1
  34. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
  35. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  36. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
  37. package/dist/development/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  38. package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
  39. package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
  40. package/dist/development/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
  41. package/dist/development/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
  42. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
  43. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  44. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
  45. package/dist/development/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  46. package/dist/development/src/model/commands/person/EnablePersonCommand.cjs +17 -0
  47. package/dist/development/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
  48. package/dist/development/src/model/commands/person/EnablePersonCommand.js +17 -0
  49. package/dist/development/src/model/commands/person/EnablePersonCommand.js.map +1 -0
  50. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
  51. package/dist/development/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  52. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js +4 -0
  53. package/dist/development/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  54. package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
  55. package/dist/development/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  56. package/dist/development/src/model/queries/membership/ProjectMembersQuery.js +1 -1
  57. package/dist/development/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  58. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs +1 -1
  59. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  60. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js +1 -1
  61. package/dist/development/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  62. package/dist/development/src/model/service/AuthLogService.cjs +8 -2
  63. package/dist/development/src/model/service/AuthLogService.cjs.map +1 -1
  64. package/dist/development/src/model/service/AuthLogService.js +8 -2
  65. package/dist/development/src/model/service/AuthLogService.js.map +1 -1
  66. package/dist/development/src/model/service/IDPSignInManager.cjs +29 -2
  67. package/dist/development/src/model/service/IDPSignInManager.cjs.map +1 -1
  68. package/dist/development/src/model/service/IDPSignInManager.js +29 -2
  69. package/dist/development/src/model/service/IDPSignInManager.js.map +1 -1
  70. package/dist/development/src/model/service/PanelAccessResolver.cjs +31 -0
  71. package/dist/development/src/model/service/PanelAccessResolver.cjs.map +1 -0
  72. package/dist/development/src/model/service/PanelAccessResolver.js +31 -0
  73. package/dist/development/src/model/service/PanelAccessResolver.js.map +1 -0
  74. package/dist/development/src/model/service/PersonAccessManager.cjs +10 -2
  75. package/dist/development/src/model/service/PersonAccessManager.cjs.map +1 -1
  76. package/dist/development/src/model/service/PersonAccessManager.js +10 -2
  77. package/dist/development/src/model/service/PersonAccessManager.js.map +1 -1
  78. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs +4 -3
  79. package/dist/development/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  80. package/dist/development/src/model/service/apiKey/ApiKeyManager.js +4 -3
  81. package/dist/development/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  82. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +7 -0
  83. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
  84. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js +8 -1
  85. package/dist/development/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
  86. package/dist/development/src/model/service/idp/ClaimMapping.cjs +187 -0
  87. package/dist/development/src/model/service/idp/ClaimMapping.cjs.map +1 -0
  88. package/dist/development/src/model/service/idp/ClaimMapping.js +170 -0
  89. package/dist/development/src/model/service/idp/ClaimMapping.js.map +1 -0
  90. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
  91. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
  92. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
  93. package/dist/development/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
  94. package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
  95. package/dist/development/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
  96. package/dist/development/src/model/service/idp/ClaimMappingValidation.js +83 -0
  97. package/dist/development/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
  98. package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs +260 -0
  99. package/dist/development/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
  100. package/dist/development/src/model/service/idp/IDPClaimSyncService.js +260 -0
  101. package/dist/development/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
  102. package/dist/development/src/model/service/idp/IDPManager.cjs +96 -20
  103. package/dist/development/src/model/service/idp/IDPManager.cjs.map +1 -1
  104. package/dist/development/src/model/service/idp/IDPManager.js +96 -20
  105. package/dist/development/src/model/service/idp/IDPManager.js.map +1 -1
  106. package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs +55 -1
  107. package/dist/development/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
  108. package/dist/development/src/model/service/idp/IdpSessionRevalidator.js +55 -1
  109. package/dist/development/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
  110. package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
  111. package/dist/development/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  112. package/dist/development/src/model/service/idp/providers/OIDCHelpers.js +69 -33
  113. package/dist/development/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  114. package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
  115. package/dist/development/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  116. package/dist/development/src/model/service/idp/providers/OIDCProvider.js +4 -1
  117. package/dist/development/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  118. package/dist/development/src/model/utils/DatabaseContext.cjs +7 -2
  119. package/dist/development/src/model/utils/DatabaseContext.cjs.map +1 -1
  120. package/dist/development/src/model/utils/DatabaseContext.js +8 -3
  121. package/dist/development/src/model/utils/DatabaseContext.js.map +1 -1
  122. package/dist/development/src/resolvers/ResolverFactory.cjs +6 -2
  123. package/dist/development/src/resolvers/ResolverFactory.cjs.map +1 -1
  124. package/dist/development/src/resolvers/ResolverFactory.js +6 -2
  125. package/dist/development/src/resolvers/ResolverFactory.js.map +1 -1
  126. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +2 -1
  127. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  128. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  129. package/dist/development/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  130. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +2 -1
  131. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  132. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +2 -1
  133. package/dist/development/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  134. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +2 -1
  135. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
  136. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +2 -1
  137. package/dist/development/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
  138. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +2 -1
  139. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  140. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +2 -1
  141. package/dist/development/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  142. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +2 -1
  143. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  144. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +2 -1
  145. package/dist/development/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  146. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +2 -1
  147. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  148. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js +2 -1
  149. package/dist/development/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  150. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +2 -1
  151. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  152. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +2 -1
  153. package/dist/development/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  154. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +2 -1
  155. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
  156. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +2 -1
  157. package/dist/development/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
  158. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +2 -1
  159. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  160. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +2 -1
  161. package/dist/development/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  162. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +2 -1
  163. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  164. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +2 -1
  165. package/dist/development/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  166. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +2 -1
  167. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  168. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +2 -1
  169. package/dist/development/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  170. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +2 -1
  171. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  172. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +2 -1
  173. package/dist/development/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  174. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +2 -1
  175. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  176. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +2 -1
  177. package/dist/development/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  178. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +4 -3
  179. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  180. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js +4 -3
  181. package/dist/development/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  182. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +2 -1
  183. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
  184. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js +2 -1
  185. package/dist/development/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
  186. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +2 -1
  187. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
  188. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +2 -1
  189. package/dist/development/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
  190. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +60 -0
  191. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
  192. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js +60 -0
  193. package/dist/development/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
  194. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +2 -1
  195. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
  196. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +2 -1
  197. package/dist/development/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
  198. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs +27 -1
  199. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  200. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js +27 -1
  201. package/dist/development/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  202. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs +2 -1
  203. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  204. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  205. package/dist/development/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  206. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs +2 -1
  207. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  208. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js +2 -1
  209. package/dist/development/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  210. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +2 -1
  211. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  212. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js +2 -1
  213. package/dist/development/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  214. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +2 -1
  215. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
  216. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +2 -1
  217. package/dist/development/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
  218. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +2 -1
  219. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  220. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +2 -1
  221. package/dist/development/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  222. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +2 -1
  223. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
  224. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +2 -1
  225. package/dist/development/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
  226. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +2 -1
  227. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
  228. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +2 -1
  229. package/dist/development/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
  230. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs +2 -1
  231. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  232. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js +2 -1
  233. package/dist/development/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  234. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs +2 -1
  235. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  236. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js +2 -1
  237. package/dist/development/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  238. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  239. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  240. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  241. package/dist/development/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  242. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +2 -1
  243. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  244. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +2 -1
  245. package/dist/development/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  246. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +2 -1
  247. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  248. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  249. package/dist/development/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  250. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +2 -1
  251. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  252. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +2 -1
  253. package/dist/development/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  254. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +2 -1
  255. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  256. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +2 -1
  257. package/dist/development/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  258. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +2 -1
  259. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  260. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +2 -1
  261. package/dist/development/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  262. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +2 -1
  263. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  264. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +2 -1
  265. package/dist/development/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  266. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +2 -1
  267. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  268. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +2 -1
  269. package/dist/development/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  270. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs +2 -1
  271. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
  272. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js +2 -1
  273. package/dist/development/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
  274. package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs +2 -1
  275. package/dist/development/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
  276. package/dist/development/src/resolvers/query/AuthLogQueryResolver.js +2 -1
  277. package/dist/development/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
  278. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs +2 -1
  279. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
  280. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js +2 -1
  281. package/dist/development/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
  282. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs +2 -1
  283. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  284. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js +2 -1
  285. package/dist/development/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  286. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs +2 -1
  287. package/dist/development/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  288. package/dist/development/src/resolvers/query/IDPQueryResolver.js +2 -1
  289. package/dist/development/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  290. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs +2 -1
  291. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  292. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js +2 -1
  293. package/dist/development/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  294. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs +2 -1
  295. package/dist/development/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  296. package/dist/development/src/resolvers/query/PersonQueryResolver.js +2 -1
  297. package/dist/development/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  298. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs +2 -1
  299. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  300. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js +2 -1
  301. package/dist/development/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  302. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs +5 -3
  303. package/dist/development/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  304. package/dist/development/src/resolvers/query/ProjectQueryResolver.js +5 -3
  305. package/dist/development/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  306. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +2 -1
  307. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
  308. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +2 -1
  309. package/dist/development/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
  310. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
  311. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  312. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
  313. package/dist/development/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  314. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
  315. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
  316. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
  317. package/dist/development/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
  318. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs +2 -1
  319. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  320. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js +2 -1
  321. package/dist/development/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  322. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs +37 -4
  323. package/dist/development/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  324. package/dist/development/src/resolvers/types/IdentityTypeResolver.js +37 -4
  325. package/dist/development/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  326. package/dist/development/src/resolvers/types/PersonTypeResolver.cjs +30 -1
  327. package/dist/development/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
  328. package/dist/development/src/resolvers/types/PersonTypeResolver.js +30 -1
  329. package/dist/development/src/resolvers/types/PersonTypeResolver.js.map +1 -1
  330. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs +25 -1
  331. package/dist/development/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  332. package/dist/development/src/resolvers/types/ProjectTypeResolver.js +25 -1
  333. package/dist/development/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  334. package/dist/development/src/schema/tenant.graphql.cjs +116 -0
  335. package/dist/development/src/schema/tenant.graphql.cjs.map +1 -1
  336. package/dist/development/src/schema/tenant.graphql.js +116 -0
  337. package/dist/development/src/schema/tenant.graphql.js.map +1 -1
  338. package/dist/production/index.cjs +30 -0
  339. package/dist/production/index.cjs.map +1 -1
  340. package/dist/production/index.js +31 -1
  341. package/dist/production/index.js.map +1 -1
  342. package/dist/production/src/TenantContainer.cjs +15 -3
  343. package/dist/production/src/TenantContainer.cjs.map +1 -1
  344. package/dist/production/src/TenantContainer.js +15 -3
  345. package/dist/production/src/TenantContainer.js.map +1 -1
  346. package/dist/production/src/bridges/system/IdentityFetcher.cjs +2 -1
  347. package/dist/production/src/bridges/system/IdentityFetcher.cjs.map +1 -1
  348. package/dist/production/src/bridges/system/IdentityFetcher.js +2 -1
  349. package/dist/production/src/bridges/system/IdentityFetcher.js.map +1 -1
  350. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs +10 -0
  351. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.cjs.map +1 -0
  352. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js +11 -0
  353. package/dist/production/src/migrations/2026-06-18-120000-idp-claim-mapping.js.map +1 -0
  354. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs +9 -0
  355. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.cjs.map +1 -0
  356. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js +10 -0
  357. package/dist/production/src/migrations/2026-08-03-120000-person-enable-auth-log.js.map +1 -0
  358. package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs +11 -0
  359. package/dist/production/src/migrations/2026-08-04-120000-config-panel.cjs.map +1 -0
  360. package/dist/production/src/migrations/2026-08-04-120000-config-panel.js +12 -0
  361. package/dist/production/src/migrations/2026-08-04-120000-config-panel.js.map +1 -0
  362. package/dist/production/src/migrations/runner.cjs +9 -2
  363. package/dist/production/src/migrations/runner.cjs.map +1 -1
  364. package/dist/production/src/migrations/runner.js +9 -2
  365. package/dist/production/src/migrations/runner.js.map +1 -1
  366. package/dist/production/src/migrations/snapshot.cjs +6 -1
  367. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  368. package/dist/production/src/migrations/snapshot.js +6 -1
  369. package/dist/production/src/migrations/snapshot.js.map +1 -1
  370. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs +5 -3
  371. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.cjs.map +1 -1
  372. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js +5 -3
  373. package/dist/production/src/model/commands/configuration/UpdateConfigurationCommand.js.map +1 -1
  374. package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.cjs → RemoveProjectMembershipCommand.cjs} +1 -1
  375. package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.cjs.map +1 -0
  376. package/dist/production/src/model/commands/membership/{RemoveProjectMembershipsCommand.js → RemoveProjectMembershipCommand.js} +1 -1
  377. package/dist/production/src/model/commands/membership/RemoveProjectMembershipCommand.js.map +1 -0
  378. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs +2 -2
  379. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.cjs.map +1 -1
  380. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js +1 -1
  381. package/dist/production/src/model/commands/membership/UpdateProjectMemberCommand.js.map +1 -1
  382. package/dist/production/src/model/commands/person/EnablePersonCommand.cjs +17 -0
  383. package/dist/production/src/model/commands/person/EnablePersonCommand.cjs.map +1 -0
  384. package/dist/production/src/model/commands/person/EnablePersonCommand.js +17 -0
  385. package/dist/production/src/model/commands/person/EnablePersonCommand.js.map +1 -0
  386. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs +4 -0
  387. package/dist/production/src/model/queries/configuration/ConfigurationQuery.cjs.map +1 -1
  388. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js +4 -0
  389. package/dist/production/src/model/queries/configuration/ConfigurationQuery.js.map +1 -1
  390. package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs +1 -1
  391. package/dist/production/src/model/queries/membership/ProjectMembersQuery.cjs.map +1 -1
  392. package/dist/production/src/model/queries/membership/ProjectMembersQuery.js +1 -1
  393. package/dist/production/src/model/queries/membership/ProjectMembersQuery.js.map +1 -1
  394. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs +1 -1
  395. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.cjs.map +1 -1
  396. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js +1 -1
  397. package/dist/production/src/model/queries/person/PersonQueryBuilderFactory.js.map +1 -1
  398. package/dist/production/src/model/service/AuthLogService.cjs +8 -2
  399. package/dist/production/src/model/service/AuthLogService.cjs.map +1 -1
  400. package/dist/production/src/model/service/AuthLogService.js +8 -2
  401. package/dist/production/src/model/service/AuthLogService.js.map +1 -1
  402. package/dist/production/src/model/service/IDPSignInManager.cjs +29 -2
  403. package/dist/production/src/model/service/IDPSignInManager.cjs.map +1 -1
  404. package/dist/production/src/model/service/IDPSignInManager.js +29 -2
  405. package/dist/production/src/model/service/IDPSignInManager.js.map +1 -1
  406. package/dist/production/src/model/service/PanelAccessResolver.cjs +31 -0
  407. package/dist/production/src/model/service/PanelAccessResolver.cjs.map +1 -0
  408. package/dist/production/src/model/service/PanelAccessResolver.js +31 -0
  409. package/dist/production/src/model/service/PanelAccessResolver.js.map +1 -0
  410. package/dist/production/src/model/service/PersonAccessManager.cjs +10 -2
  411. package/dist/production/src/model/service/PersonAccessManager.cjs.map +1 -1
  412. package/dist/production/src/model/service/PersonAccessManager.js +10 -2
  413. package/dist/production/src/model/service/PersonAccessManager.js.map +1 -1
  414. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs +4 -3
  415. package/dist/production/src/model/service/apiKey/ApiKeyManager.cjs.map +1 -1
  416. package/dist/production/src/model/service/apiKey/ApiKeyManager.js +4 -3
  417. package/dist/production/src/model/service/apiKey/ApiKeyManager.js.map +1 -1
  418. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs +7 -0
  419. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.cjs.map +1 -1
  420. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js +8 -1
  421. package/dist/production/src/model/service/apiKey/UnpersistedApiKeyManager.js.map +1 -1
  422. package/dist/production/src/model/service/idp/ClaimMapping.cjs +187 -0
  423. package/dist/production/src/model/service/idp/ClaimMapping.cjs.map +1 -0
  424. package/dist/production/src/model/service/idp/ClaimMapping.js +170 -0
  425. package/dist/production/src/model/service/idp/ClaimMapping.js.map +1 -0
  426. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs +155 -0
  427. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.cjs.map +1 -0
  428. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js +155 -0
  429. package/dist/production/src/model/service/idp/ClaimMappingEvaluator.js.map +1 -0
  430. package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs +83 -0
  431. package/dist/production/src/model/service/idp/ClaimMappingValidation.cjs.map +1 -0
  432. package/dist/production/src/model/service/idp/ClaimMappingValidation.js +83 -0
  433. package/dist/production/src/model/service/idp/ClaimMappingValidation.js.map +1 -0
  434. package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs +260 -0
  435. package/dist/production/src/model/service/idp/IDPClaimSyncService.cjs.map +1 -0
  436. package/dist/production/src/model/service/idp/IDPClaimSyncService.js +260 -0
  437. package/dist/production/src/model/service/idp/IDPClaimSyncService.js.map +1 -0
  438. package/dist/production/src/model/service/idp/IDPManager.cjs +96 -20
  439. package/dist/production/src/model/service/idp/IDPManager.cjs.map +1 -1
  440. package/dist/production/src/model/service/idp/IDPManager.js +96 -20
  441. package/dist/production/src/model/service/idp/IDPManager.js.map +1 -1
  442. package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs +55 -1
  443. package/dist/production/src/model/service/idp/IdpSessionRevalidator.cjs.map +1 -1
  444. package/dist/production/src/model/service/idp/IdpSessionRevalidator.js +55 -1
  445. package/dist/production/src/model/service/idp/IdpSessionRevalidator.js.map +1 -1
  446. package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs +69 -33
  447. package/dist/production/src/model/service/idp/providers/OIDCHelpers.cjs.map +1 -1
  448. package/dist/production/src/model/service/idp/providers/OIDCHelpers.js +69 -33
  449. package/dist/production/src/model/service/idp/providers/OIDCHelpers.js.map +1 -1
  450. package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs +4 -1
  451. package/dist/production/src/model/service/idp/providers/OIDCProvider.cjs.map +1 -1
  452. package/dist/production/src/model/service/idp/providers/OIDCProvider.js +4 -1
  453. package/dist/production/src/model/service/idp/providers/OIDCProvider.js.map +1 -1
  454. package/dist/production/src/model/utils/DatabaseContext.cjs +7 -2
  455. package/dist/production/src/model/utils/DatabaseContext.cjs.map +1 -1
  456. package/dist/production/src/model/utils/DatabaseContext.js +8 -3
  457. package/dist/production/src/model/utils/DatabaseContext.js.map +1 -1
  458. package/dist/production/src/resolvers/ResolverFactory.cjs +6 -2
  459. package/dist/production/src/resolvers/ResolverFactory.cjs.map +1 -1
  460. package/dist/production/src/resolvers/ResolverFactory.js +6 -2
  461. package/dist/production/src/resolvers/ResolverFactory.js.map +1 -1
  462. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs +2 -1
  463. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.cjs.map +1 -1
  464. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js +2 -1
  465. package/dist/production/src/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.js.map +1 -1
  466. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs +2 -1
  467. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.cjs.map +1 -1
  468. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js +2 -1
  469. package/dist/production/src/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.js.map +1 -1
  470. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs +2 -1
  471. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.cjs.map +1 -1
  472. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js +2 -1
  473. package/dist/production/src/resolvers/mutation/configuration/AuthPolicyMutationResolver.js.map +1 -1
  474. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs +2 -1
  475. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.cjs.map +1 -1
  476. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js +2 -1
  477. package/dist/production/src/resolvers/mutation/configuration/ConfigurationMutationResolver.js.map +1 -1
  478. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs +2 -1
  479. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.cjs.map +1 -1
  480. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js +2 -1
  481. package/dist/production/src/resolvers/mutation/identity/GlobalRolesMutationResolver.js.map +1 -1
  482. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs +2 -1
  483. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.cjs.map +1 -1
  484. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js +2 -1
  485. package/dist/production/src/resolvers/mutation/idp/AddIDPMutationResolver.js.map +1 -1
  486. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs +2 -1
  487. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.cjs.map +1 -1
  488. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js +2 -1
  489. package/dist/production/src/resolvers/mutation/idp/DisableIDPMutationResolver.js.map +1 -1
  490. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs +2 -1
  491. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.cjs.map +1 -1
  492. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js +2 -1
  493. package/dist/production/src/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.js.map +1 -1
  494. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs +2 -1
  495. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.cjs.map +1 -1
  496. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js +2 -1
  497. package/dist/production/src/resolvers/mutation/idp/EnableIDPMutationResolver.js.map +1 -1
  498. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs +2 -1
  499. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.cjs.map +1 -1
  500. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js +2 -1
  501. package/dist/production/src/resolvers/mutation/idp/UpdateIDPMutationResolver.js.map +1 -1
  502. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs +2 -1
  503. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.cjs.map +1 -1
  504. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js +2 -1
  505. package/dist/production/src/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.js.map +1 -1
  506. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs +2 -1
  507. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.cjs.map +1 -1
  508. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js +2 -1
  509. package/dist/production/src/resolvers/mutation/person/ChangePasswordMutationResolver.js.map +1 -1
  510. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs +2 -1
  511. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.cjs.map +1 -1
  512. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js +2 -1
  513. package/dist/production/src/resolvers/mutation/person/ChangeProfileMutationResolver.js.map +1 -1
  514. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs +4 -3
  515. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.cjs.map +1 -1
  516. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js +4 -3
  517. package/dist/production/src/resolvers/mutation/person/DisablePersonMutationResolver.js.map +1 -1
  518. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs +2 -1
  519. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.cjs.map +1 -1
  520. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js +2 -1
  521. package/dist/production/src/resolvers/mutation/person/EmailOtpMutationResolver.js.map +1 -1
  522. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs +2 -1
  523. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.cjs.map +1 -1
  524. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js +2 -1
  525. package/dist/production/src/resolvers/mutation/person/EmailVerificationMutationResolver.js.map +1 -1
  526. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs +60 -0
  527. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.cjs.map +1 -0
  528. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js +60 -0
  529. package/dist/production/src/resolvers/mutation/person/EnablePersonMutationResolver.js.map +1 -0
  530. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs +2 -1
  531. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.cjs.map +1 -1
  532. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js +2 -1
  533. package/dist/production/src/resolvers/mutation/person/ForceSignOutMutationResolver.js.map +1 -1
  534. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs +27 -1
  535. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.cjs.map +1 -1
  536. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js +27 -1
  537. package/dist/production/src/resolvers/mutation/person/IDPMutationResolver.js.map +1 -1
  538. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs +2 -1
  539. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.cjs.map +1 -1
  540. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js +2 -1
  541. package/dist/production/src/resolvers/mutation/person/InviteMutationResolver.js.map +1 -1
  542. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs +2 -1
  543. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.cjs.map +1 -1
  544. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js +2 -1
  545. package/dist/production/src/resolvers/mutation/person/OtpMutationResolver.js.map +1 -1
  546. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs +2 -1
  547. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.cjs.map +1 -1
  548. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js +2 -1
  549. package/dist/production/src/resolvers/mutation/person/PasswordlessMutationResolver.js.map +1 -1
  550. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs +2 -1
  551. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.cjs.map +1 -1
  552. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js +2 -1
  553. package/dist/production/src/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.js.map +1 -1
  554. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs +2 -1
  555. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.cjs.map +1 -1
  556. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js +2 -1
  557. package/dist/production/src/resolvers/mutation/person/ResetPasswordMutationResolver.js.map +1 -1
  558. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs +2 -1
  559. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.cjs.map +1 -1
  560. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js +2 -1
  561. package/dist/production/src/resolvers/mutation/person/ResetPersonMfaMutationResolver.js.map +1 -1
  562. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs +2 -1
  563. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.cjs.map +1 -1
  564. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js +2 -1
  565. package/dist/production/src/resolvers/mutation/person/RevokeSessionMutationResolver.js.map +1 -1
  566. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs +2 -1
  567. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.cjs.map +1 -1
  568. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js +2 -1
  569. package/dist/production/src/resolvers/mutation/person/SignInMutationResolver.js.map +1 -1
  570. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs +2 -1
  571. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.cjs.map +1 -1
  572. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js +2 -1
  573. package/dist/production/src/resolvers/mutation/person/SignOutMutationResolver.js.map +1 -1
  574. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs +2 -1
  575. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.cjs.map +1 -1
  576. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js +2 -1
  577. package/dist/production/src/resolvers/mutation/person/SignUpMutationResolver.js.map +1 -1
  578. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs +2 -1
  579. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.cjs.map +1 -1
  580. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js +2 -1
  581. package/dist/production/src/resolvers/mutation/person/TogglePasswordlessMutationResolver.js.map +1 -1
  582. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs +2 -1
  583. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.cjs.map +1 -1
  584. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js +2 -1
  585. package/dist/production/src/resolvers/mutation/project/CreateProjectMutationResolver.js.map +1 -1
  586. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs +2 -1
  587. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.cjs.map +1 -1
  588. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js +2 -1
  589. package/dist/production/src/resolvers/mutation/project/SetProjectSecretMutationResolver.js.map +1 -1
  590. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs +2 -1
  591. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.cjs.map +1 -1
  592. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js +2 -1
  593. package/dist/production/src/resolvers/mutation/project/UpdateProjectMutationResolver.js.map +1 -1
  594. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs +2 -1
  595. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.cjs.map +1 -1
  596. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js +2 -1
  597. package/dist/production/src/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.js.map +1 -1
  598. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs +2 -1
  599. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.cjs.map +1 -1
  600. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js +2 -1
  601. package/dist/production/src/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.js.map +1 -1
  602. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs +2 -1
  603. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.cjs.map +1 -1
  604. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js +2 -1
  605. package/dist/production/src/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.js.map +1 -1
  606. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs +2 -1
  607. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.cjs.map +1 -1
  608. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js +2 -1
  609. package/dist/production/src/resolvers/query/ApiKeyQueryResolver.js.map +1 -1
  610. package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs +2 -1
  611. package/dist/production/src/resolvers/query/AuthLogQueryResolver.cjs.map +1 -1
  612. package/dist/production/src/resolvers/query/AuthLogQueryResolver.js +2 -1
  613. package/dist/production/src/resolvers/query/AuthLogQueryResolver.js.map +1 -1
  614. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs +2 -1
  615. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.cjs.map +1 -1
  616. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js +2 -1
  617. package/dist/production/src/resolvers/query/AuthPolicyQueryResolver.js.map +1 -1
  618. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs +2 -1
  619. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.cjs.map +1 -1
  620. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js +2 -1
  621. package/dist/production/src/resolvers/query/ConfigurationQueryResolver.js.map +1 -1
  622. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs +2 -1
  623. package/dist/production/src/resolvers/query/IDPQueryResolver.cjs.map +1 -1
  624. package/dist/production/src/resolvers/query/IDPQueryResolver.js +2 -1
  625. package/dist/production/src/resolvers/query/IDPQueryResolver.js.map +1 -1
  626. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs +2 -1
  627. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.cjs.map +1 -1
  628. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js +2 -1
  629. package/dist/production/src/resolvers/query/MailTemplateQueryResolver.js.map +1 -1
  630. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs +2 -1
  631. package/dist/production/src/resolvers/query/PersonQueryResolver.cjs.map +1 -1
  632. package/dist/production/src/resolvers/query/PersonQueryResolver.js +2 -1
  633. package/dist/production/src/resolvers/query/PersonQueryResolver.js.map +1 -1
  634. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs +2 -1
  635. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.cjs.map +1 -1
  636. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js +2 -1
  637. package/dist/production/src/resolvers/query/ProjectMembersQueryResolver.js.map +1 -1
  638. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs +5 -3
  639. package/dist/production/src/resolvers/query/ProjectQueryResolver.cjs.map +1 -1
  640. package/dist/production/src/resolvers/query/ProjectQueryResolver.js +5 -3
  641. package/dist/production/src/resolvers/query/ProjectQueryResolver.js.map +1 -1
  642. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs +2 -1
  643. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.cjs.map +1 -1
  644. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js +2 -1
  645. package/dist/production/src/resolvers/responseHelpers/ApiKeyResponseFactory.js.map +1 -1
  646. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs +5 -0
  647. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.cjs.map +1 -1
  648. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js +5 -0
  649. package/dist/production/src/resolvers/responseHelpers/PersonResponseFactory.js.map +1 -1
  650. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs +23 -0
  651. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.cjs.map +1 -0
  652. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js +23 -0
  653. package/dist/production/src/resolvers/responseHelpers/ProjectResponseFactory.js.map +1 -0
  654. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs +2 -1
  655. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.cjs.map +1 -1
  656. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js +2 -1
  657. package/dist/production/src/resolvers/responseHelpers/SignInResponseFactory.js.map +1 -1
  658. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs +37 -4
  659. package/dist/production/src/resolvers/types/IdentityTypeResolver.cjs.map +1 -1
  660. package/dist/production/src/resolvers/types/IdentityTypeResolver.js +37 -4
  661. package/dist/production/src/resolvers/types/IdentityTypeResolver.js.map +1 -1
  662. package/dist/production/src/resolvers/types/PersonTypeResolver.cjs +30 -1
  663. package/dist/production/src/resolvers/types/PersonTypeResolver.cjs.map +1 -1
  664. package/dist/production/src/resolvers/types/PersonTypeResolver.js +30 -1
  665. package/dist/production/src/resolvers/types/PersonTypeResolver.js.map +1 -1
  666. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs +25 -1
  667. package/dist/production/src/resolvers/types/ProjectTypeResolver.cjs.map +1 -1
  668. package/dist/production/src/resolvers/types/ProjectTypeResolver.js +25 -1
  669. package/dist/production/src/resolvers/types/ProjectTypeResolver.js.map +1 -1
  670. package/dist/production/src/schema/tenant.graphql.cjs +116 -0
  671. package/dist/production/src/schema/tenant.graphql.cjs.map +1 -1
  672. package/dist/production/src/schema/tenant.graphql.js +116 -0
  673. package/dist/production/src/schema/tenant.graphql.js.map +1 -1
  674. package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts +2 -0
  675. package/dist/tests/cases/integration/mocked/configurationPanel.test.d.ts.map +1 -0
  676. package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts +2 -0
  677. package/dist/tests/cases/integration/mocked/disablePersonMutation.test.d.ts.map +1 -0
  678. package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts +2 -0
  679. package/dist/tests/cases/integration/mocked/enablePersonMutation.test.d.ts.map +1 -0
  680. package/dist/tests/cases/integration/mocked/gql/addProjectMember.d.ts.map +1 -1
  681. package/dist/tests/cases/integration/mocked/gql/changeMyPassword.d.ts.map +1 -1
  682. package/dist/tests/cases/integration/mocked/gql/changeMyProfile.d.ts.map +1 -1
  683. package/dist/tests/cases/integration/mocked/gql/changePassword.d.ts.map +1 -1
  684. package/dist/tests/cases/integration/mocked/gql/changeProfile.d.ts.map +1 -1
  685. package/dist/tests/cases/integration/mocked/gql/confirmOtp.d.ts.map +1 -1
  686. package/dist/tests/cases/integration/mocked/gql/createApiKey.d.ts.map +1 -1
  687. package/dist/tests/cases/integration/mocked/gql/createResetPasswordRequest.d.ts.map +1 -1
  688. package/dist/tests/cases/integration/mocked/gql/createSessionToken.d.ts.map +1 -1
  689. package/dist/tests/cases/integration/mocked/gql/emailOtp.d.ts.map +1 -1
  690. package/dist/tests/cases/integration/mocked/gql/emailVerification.d.ts.map +1 -1
  691. package/dist/tests/cases/integration/mocked/gql/invite.d.ts.map +1 -1
  692. package/dist/tests/cases/integration/mocked/gql/myIdentityProviders.d.ts.map +1 -1
  693. package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts +1 -1
  694. package/dist/tests/cases/integration/mocked/gql/passwordless.d.ts.map +1 -1
  695. package/dist/tests/cases/integration/mocked/gql/prepareOtp.d.ts.map +1 -1
  696. package/dist/tests/cases/integration/mocked/gql/resetPassword.d.ts.map +1 -1
  697. package/dist/tests/cases/integration/mocked/gql/signIn.d.ts.map +1 -1
  698. package/dist/tests/cases/integration/mocked/gql/signInIdp.d.ts.map +1 -1
  699. package/dist/tests/cases/integration/mocked/gql/signUp.d.ts.map +1 -1
  700. package/dist/tests/cases/integration/mocked/gql/unmanagedInvite.d.ts.map +1 -1
  701. package/dist/tests/cases/integration/mocked/gql/updateProjectMember.d.ts.map +1 -1
  702. package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts +2 -0
  703. package/dist/tests/cases/integration/mocked/idpClaimMappingConfig.test.d.ts.map +1 -0
  704. package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts +2 -0
  705. package/dist/tests/cases/integration/mocked/permissionsQuery.test.d.ts.map +1 -0
  706. package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts +2 -0
  707. package/dist/tests/cases/integration/mocked/signInIdpClaimMapping.test.d.ts.map +1 -0
  708. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts +2 -0
  709. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.d.ts.map +1 -0
  710. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts +2 -0
  711. package/dist/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.d.ts.map +1 -0
  712. package/dist/tests/cases/integration/mocked/sql/authLogSql.d.ts.map +1 -1
  713. package/dist/tests/cases/integration/mocked/sql/authPolicySql.d.ts.map +1 -1
  714. package/dist/tests/cases/integration/mocked/sql/consumeBackupCodeSql.d.ts.map +1 -1
  715. package/dist/tests/cases/integration/mocked/sql/createApiKeySql.d.ts.map +1 -1
  716. package/dist/tests/cases/integration/mocked/sql/createIdentitySql.d.ts.map +1 -1
  717. package/dist/tests/cases/integration/mocked/sql/createMembershipSql.d.ts.map +1 -1
  718. package/dist/tests/cases/integration/mocked/sql/createMembershipVariableSql.d.ts.map +1 -1
  719. package/dist/tests/cases/integration/mocked/sql/createPersonSql.d.ts.map +1 -1
  720. package/dist/tests/cases/integration/mocked/sql/createPersonTokenSql.d.ts.map +1 -1
  721. package/dist/tests/cases/integration/mocked/sql/createSessionKeySql.d.ts.map +1 -1
  722. package/dist/tests/cases/integration/mocked/sql/disableApiKeySql.d.ts.map +1 -1
  723. package/dist/tests/cases/integration/mocked/sql/disableOneOffKeySql.d.ts.map +1 -1
  724. package/dist/tests/cases/integration/mocked/sql/emailOtpSql.d.ts.map +1 -1
  725. package/dist/tests/cases/integration/mocked/sql/generateBackupCodesSql.d.ts.map +1 -1
  726. package/dist/tests/cases/integration/mocked/sql/getApiKeySql.d.ts.map +1 -1
  727. package/dist/tests/cases/integration/mocked/sql/getConfigSql.d.ts.map +1 -1
  728. package/dist/tests/cases/integration/mocked/sql/getIdentityByIdSql.d.ts.map +1 -1
  729. package/dist/tests/cases/integration/mocked/sql/getIdentityProjectsSql.d.ts.map +1 -1
  730. package/dist/tests/cases/integration/mocked/sql/getIdpBySlugSql.d.ts.map +1 -1
  731. package/dist/tests/cases/integration/mocked/sql/getIdpSessionByApiKeySql.d.ts.map +1 -1
  732. package/dist/tests/cases/integration/mocked/sql/getMailTemplateSql.d.ts.map +1 -1
  733. package/dist/tests/cases/integration/mocked/sql/getNextLoginAttemptSql.d.ts.map +1 -1
  734. package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts +1 -1
  735. package/dist/tests/cases/integration/mocked/sql/getNextMailAttemptSql.d.ts.map +1 -1
  736. package/dist/tests/cases/integration/mocked/sql/getPersonByEmailSql.d.ts.map +1 -1
  737. package/dist/tests/cases/integration/mocked/sql/getPersonByIdSql.d.ts.map +1 -1
  738. package/dist/tests/cases/integration/mocked/sql/getPersonByIdentity.d.ts.map +1 -1
  739. package/dist/tests/cases/integration/mocked/sql/getPersonByIdpSql.d.ts.map +1 -1
  740. package/dist/tests/cases/integration/mocked/sql/getPersonsByIdentitySql.d.ts.map +1 -1
  741. package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts +1 -1
  742. package/dist/tests/cases/integration/mocked/sql/getProjectBySlugSql.d.ts.map +1 -1
  743. package/dist/tests/cases/integration/mocked/sql/getProjectMembershipSql.d.ts.map +1 -1
  744. package/dist/tests/cases/integration/mocked/sql/listApiKeysSql.d.ts.map +1 -1
  745. package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts +2 -0
  746. package/dist/tests/cases/integration/mocked/sql/listPersonsSql.d.ts.map +1 -1
  747. package/dist/tests/cases/integration/mocked/sql/listProjectSecretsSql.d.ts.map +1 -1
  748. package/dist/tests/cases/integration/mocked/sql/listSessionsSql.d.ts.map +1 -1
  749. package/dist/tests/cases/integration/mocked/sql/loginHistorySql.d.ts.map +1 -1
  750. package/dist/tests/cases/integration/mocked/sql/patchVariablesSql.d.ts.map +1 -1
  751. package/dist/tests/cases/integration/mocked/sql/personIdentityProvidersSql.d.ts.map +1 -1
  752. package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts +8 -0
  753. package/dist/tests/cases/integration/mocked/sql/removeMembershipSql.d.ts.map +1 -0
  754. package/dist/tests/cases/integration/mocked/sql/selectMembershipsSql.d.ts.map +1 -1
  755. package/dist/tests/cases/integration/mocked/sql/setEmailOtpEnabledSql.d.ts.map +1 -1
  756. package/dist/tests/cases/integration/mocked/sql/sqlTransaction.d.ts.map +1 -1
  757. package/dist/tests/cases/integration/mocked/sql/updatePesonNameSql.d.ts.map +1 -1
  758. package/dist/tests/cases/integration/mocked/sql/updatePesonPasswordSql.d.ts.map +1 -1
  759. package/dist/tests/cases/unit/databaseContextRetry.test.d.ts +2 -0
  760. package/dist/tests/cases/unit/databaseContextRetry.test.d.ts.map +1 -0
  761. package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts +2 -0
  762. package/dist/tests/cases/unit/idp/claimMappingEvaluator.test.d.ts.map +1 -0
  763. package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts +2 -0
  764. package/dist/tests/cases/unit/idp/claimMappingValidation.test.d.ts.map +1 -0
  765. package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts +2 -0
  766. package/dist/tests/cases/unit/idp/idpManagerConfigMerge.test.d.ts.map +1 -0
  767. package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts +2 -0
  768. package/dist/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.d.ts.map +1 -0
  769. package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts +2 -0
  770. package/dist/tests/cases/unit/idp/oidcClaims.test.d.ts.map +1 -0
  771. package/dist/tests/cases/unit/panelAccessResolver.test.d.ts +2 -0
  772. package/dist/tests/cases/unit/panelAccessResolver.test.d.ts.map +1 -0
  773. package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts +2 -0
  774. package/dist/tests/cases/unit/updateConfigurationCommand.test.d.ts.map +1 -0
  775. package/dist/tests/src/IdPMock.d.ts.map +1 -1
  776. package/dist/tests/src/dbUtils.d.ts.map +1 -1
  777. package/dist/tests/src/tags.d.ts.map +1 -1
  778. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  779. package/dist/tests/src/testTenant.d.ts +7 -1
  780. package/dist/tests/src/testTenant.d.ts.map +1 -1
  781. package/dist/tests/src/testUuid.d.ts.map +1 -1
  782. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  783. package/dist/types/TenantContainer.d.ts +21 -13
  784. package/dist/types/TenantContainer.d.ts.map +1 -1
  785. package/dist/types/bridges/system/IdentityFetcher.d.ts +2 -2
  786. package/dist/types/bridges/system/IdentityFetcher.d.ts.map +1 -1
  787. package/dist/types/exceptions.d.ts.map +1 -1
  788. package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts +3 -0
  789. package/dist/types/migrations/2026-06-18-120000-idp-claim-mapping.d.ts.map +1 -0
  790. package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts +3 -0
  791. package/dist/types/migrations/2026-08-03-120000-person-enable-auth-log.d.ts.map +1 -0
  792. package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts +3 -0
  793. package/dist/types/migrations/2026-08-04-120000-config-panel.d.ts.map +1 -0
  794. package/dist/types/migrations/runner.d.ts.map +1 -1
  795. package/dist/types/migrations/snapshot-factory.d.ts.map +1 -1
  796. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  797. package/dist/types/migrations/tenantCredentials.d.ts.map +1 -1
  798. package/dist/types/model/authorization/AclSchemaAccessNodeFactory.d.ts.map +1 -1
  799. package/dist/types/model/authorization/DirectPermissionsAccessNode.d.ts.map +1 -1
  800. package/dist/types/model/authorization/Identity.d.ts.map +1 -1
  801. package/dist/types/model/authorization/IdentityFactory.d.ts.map +1 -1
  802. package/dist/types/model/authorization/IdentityScope.d.ts.map +1 -1
  803. package/dist/types/model/authorization/MembershipMatcher.d.ts.map +1 -1
  804. package/dist/types/model/authorization/PermissionActions.d.ts.map +1 -1
  805. package/dist/types/model/authorization/PermissionContext.d.ts.map +1 -1
  806. package/dist/types/model/authorization/PermissionContextFactory.d.ts.map +1 -1
  807. package/dist/types/model/authorization/PermissionsFactory.d.ts.map +1 -1
  808. package/dist/types/model/authorization/ProjectScope.d.ts.map +1 -1
  809. package/dist/types/model/authorization/ProjectScopeFactory.d.ts.map +1 -1
  810. package/dist/types/model/commands/CommandBus.d.ts.map +1 -1
  811. package/dist/types/model/commands/apiKey/ApiKeyHelper.d.ts.map +1 -1
  812. package/dist/types/model/commands/apiKey/CreateApiKeyCommand.d.ts.map +1 -1
  813. package/dist/types/model/commands/apiKey/DisableApiKeyCommand.d.ts.map +1 -1
  814. package/dist/types/model/commands/apiKey/DisableIdentityApiKeysCommand.d.ts.map +1 -1
  815. package/dist/types/model/commands/apiKey/DisableOneOffApiKeyCommand.d.ts.map +1 -1
  816. package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts +1 -1
  817. package/dist/types/model/commands/apiKey/ProlongApiKeyCommand.d.ts.map +1 -1
  818. package/dist/types/model/commands/authLog/CreateAuthLogEntryCommand.d.ts.map +1 -1
  819. package/dist/types/model/commands/authPolicy/CreateAuthPolicyCommand.d.ts.map +1 -1
  820. package/dist/types/model/commands/authPolicy/DeleteAuthPolicyCommand.d.ts.map +1 -1
  821. package/dist/types/model/commands/authPolicy/UpdateAuthPolicyCommand.d.ts.map +1 -1
  822. package/dist/types/model/commands/backupCode/ConsumeBackupCodeCommand.d.ts.map +1 -1
  823. package/dist/types/model/commands/backupCode/CreateBackupCodeCommand.d.ts.map +1 -1
  824. package/dist/types/model/commands/backupCode/DeleteBackupCodesCommand.d.ts.map +1 -1
  825. package/dist/types/model/commands/configuration/UpdateConfigurationCommand.d.ts.map +1 -1
  826. package/dist/types/model/commands/identity/CreateIdentityCommand.d.ts.map +1 -1
  827. package/dist/types/model/commands/identity/PatchIdentityGlobalRoles.d.ts.map +1 -1
  828. package/dist/types/model/commands/idp/ClaimIdpRevalidationCommand.d.ts.map +1 -1
  829. package/dist/types/model/commands/idp/CreateIdpCommand.d.ts.map +1 -1
  830. package/dist/types/model/commands/idp/CreateIdpSessionCommand.d.ts.map +1 -1
  831. package/dist/types/model/commands/idp/DisableIdpCommand.d.ts.map +1 -1
  832. package/dist/types/model/commands/idp/DisconnectPersonIdentityProviderCommand.d.ts.map +1 -1
  833. package/dist/types/model/commands/idp/EnableIdpCommand.d.ts.map +1 -1
  834. package/dist/types/model/commands/idp/UpdateIdpCommand.d.ts.map +1 -1
  835. package/dist/types/model/commands/idp/UpdateIdpSessionCommand.d.ts.map +1 -1
  836. package/dist/types/model/commands/mailTemplate/AddMailTemplateCommand.d.ts.map +1 -1
  837. package/dist/types/model/commands/mailTemplate/RemoveMailTemplateCommand.d.ts.map +1 -1
  838. package/dist/types/model/commands/membership/AddProjectMemberCommand.d.ts.map +1 -1
  839. package/dist/types/model/commands/membership/CreateOrUpdateProjectMembershipCommand.d.ts.map +1 -1
  840. package/dist/types/model/commands/membership/RemoveProjectMemberCommand.d.ts.map +1 -1
  841. package/dist/types/model/commands/membership/{RemoveProjectMembershipsCommand.d.ts → RemoveProjectMembershipCommand.d.ts} +1 -1
  842. package/dist/types/model/commands/membership/RemoveProjectMembershipCommand.d.ts.map +1 -0
  843. package/dist/types/model/commands/membership/UpdateProjectMemberCommand.d.ts.map +1 -1
  844. package/dist/types/model/commands/membership/index.d.ts +2 -1
  845. package/dist/types/model/commands/membership/index.d.ts.map +1 -1
  846. package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariableValuesCommand.d.ts.map +1 -1
  847. package/dist/types/model/commands/membership/variables/PatchProjectMembershipVariablesCommand.d.ts.map +1 -1
  848. package/dist/types/model/commands/membership/variables/SetProjectMembershipVariableValuesCommand.d.ts.map +1 -1
  849. package/dist/types/model/commands/membership/variables/index.d.ts +1 -0
  850. package/dist/types/model/commands/membership/variables/index.d.ts.map +1 -1
  851. package/dist/types/model/commands/otp/ConfirmOtpCommand.d.ts.map +1 -1
  852. package/dist/types/model/commands/otp/DisableOtpCommand.d.ts.map +1 -1
  853. package/dist/types/model/commands/otp/PrepareOtpCommand.d.ts.map +1 -1
  854. package/dist/types/model/commands/otp/ReEncryptOtpSecretCommand.d.ts.map +1 -1
  855. package/dist/types/model/commands/otp/SetEmailOtpEnabledCommand.d.ts.map +1 -1
  856. package/dist/types/model/commands/person/ChangePasswordCommand.d.ts.map +1 -1
  857. package/dist/types/model/commands/person/ChangeProfileCommand.d.ts.map +1 -1
  858. package/dist/types/model/commands/person/CreatePersonCommand.d.ts.map +1 -1
  859. package/dist/types/model/commands/person/CreatePersonIdentityProviderIdentifierCommand.d.ts.map +1 -1
  860. package/dist/types/model/commands/person/DisablePersonCommand.d.ts.map +1 -1
  861. package/dist/types/model/commands/person/EnablePersonCommand.d.ts +7 -0
  862. package/dist/types/model/commands/person/EnablePersonCommand.d.ts.map +1 -0
  863. package/dist/types/model/commands/person/MarkEmailVerifiedCommand.d.ts.map +1 -1
  864. package/dist/types/model/commands/person/ResetPersonMfaCommand.d.ts.map +1 -1
  865. package/dist/types/model/commands/person/SetMfaGraceUntilCommand.d.ts.map +1 -1
  866. package/dist/types/model/commands/person/TogglePersonPasswordlessCommand.d.ts.map +1 -1
  867. package/dist/types/model/commands/personToken/ActivateOtpCommand.d.ts.map +1 -1
  868. package/dist/types/model/commands/personToken/ClaimOtpAttemptCommand.d.ts.map +1 -1
  869. package/dist/types/model/commands/personToken/CreatePersonTokenCommand.d.ts.map +1 -1
  870. package/dist/types/model/commands/personToken/IncreaseOtpAttemptCommand.d.ts.map +1 -1
  871. package/dist/types/model/commands/personToken/InvalidateEmailOtpTokensCommand.d.ts.map +1 -1
  872. package/dist/types/model/commands/personToken/InvalidateTokenCommand.d.ts.map +1 -1
  873. package/dist/types/model/commands/personToken/ResetPasswordCommand.d.ts.map +1 -1
  874. package/dist/types/model/commands/personToken/SaveEmailOtpTokenCommand.d.ts.map +1 -1
  875. package/dist/types/model/commands/personToken/SavePersonTokenCommand.d.ts.map +1 -1
  876. package/dist/types/model/commands/project/CreateProjectCommand.d.ts.map +1 -1
  877. package/dist/types/model/commands/project/SetProjectSecretCommand.d.ts.map +1 -1
  878. package/dist/types/model/commands/project/UpdateProjectCommand.d.ts.map +1 -1
  879. package/dist/types/model/commands/rateLimit/RecordRateLimitEventCommand.d.ts.map +1 -1
  880. package/dist/types/model/dtos/Password.d.ts.map +1 -1
  881. package/dist/types/model/mailing/UserMailer.d.ts.map +1 -1
  882. package/dist/types/model/mailing/templates/BackupCodesExhausted.mustache.d.ts.map +1 -1
  883. package/dist/types/model/mailing/templates/EmailChangeNotify.mustache.d.ts.map +1 -1
  884. package/dist/types/model/mailing/templates/EmailChangeVerify.mustache.d.ts.map +1 -1
  885. package/dist/types/model/mailing/templates/EmailOtp.mustache.d.ts.map +1 -1
  886. package/dist/types/model/mailing/templates/EmailVerification.mustache.d.ts.map +1 -1
  887. package/dist/types/model/mailing/templates/ExistingUserInvited.mustache.d.ts.map +1 -1
  888. package/dist/types/model/mailing/templates/ForcedSignOut.mustache.d.ts.map +1 -1
  889. package/dist/types/model/mailing/templates/Layout.mustache.d.ts.map +1 -1
  890. package/dist/types/model/mailing/templates/NewUserInvited.mustache.d.ts.map +1 -1
  891. package/dist/types/model/mailing/templates/PasswordReset.mustache.d.ts.map +1 -1
  892. package/dist/types/model/mailing/templates/PasswordlessSignIn.mustache.d.ts.map +1 -1
  893. package/dist/types/model/mailing/templates/UnusualLogin.mustache.d.ts.map +1 -1
  894. package/dist/types/model/mailing/type.d.ts.map +1 -1
  895. package/dist/types/model/queries/apiKey/ApiKeyListQuery.d.ts.map +1 -1
  896. package/dist/types/model/queries/apiKey/ApiKeyQuery.d.ts.map +1 -1
  897. package/dist/types/model/queries/apiKey/ApiKeySessionsQuery.d.ts.map +1 -1
  898. package/dist/types/model/queries/authLog/AuthLogQuery.d.ts.map +1 -1
  899. package/dist/types/model/queries/authLog/NextLoginAttemptQuery.d.ts.map +1 -1
  900. package/dist/types/model/queries/authLog/NextMailAttemptQuery.d.ts.map +1 -1
  901. package/dist/types/model/queries/authPolicy/AuthPoliciesQuery.d.ts.map +1 -1
  902. package/dist/types/model/queries/configuration/ConfigurationQuery.d.ts.map +1 -1
  903. package/dist/types/model/queries/identity/IdentityQuery.d.ts.map +1 -1
  904. package/dist/types/model/queries/idp/IdentityProviderBySlugQuery.d.ts.map +1 -1
  905. package/dist/types/model/queries/idp/IdentityProvidersQuery.d.ts.map +1 -1
  906. package/dist/types/model/queries/idp/IdpSessionByApiKeyQuery.d.ts.map +1 -1
  907. package/dist/types/model/queries/idp/IdpSessionsBySidQuery.d.ts.map +1 -1
  908. package/dist/types/model/queries/idp/IdpSessionsBySubQuery.d.ts.map +1 -1
  909. package/dist/types/model/queries/idp/PersonIdentityProvidersQuery.d.ts.map +1 -1
  910. package/dist/types/model/queries/idp/helpers.d.ts.map +1 -1
  911. package/dist/types/model/queries/mailTemplate/MailTemplateListQuery.d.ts.map +1 -1
  912. package/dist/types/model/queries/mailTemplate/MailTemplateQuery.d.ts.map +1 -1
  913. package/dist/types/model/queries/membership/AllProjectRolesByIdentityQuery.d.ts.map +1 -1
  914. package/dist/types/model/queries/membership/ProjectMembersQuery.d.ts.map +1 -1
  915. package/dist/types/model/queries/membership/ProjectMembershipByIdentityQuery.d.ts.map +1 -1
  916. package/dist/types/model/queries/membership/ProjectRolesByIdentityQuery.d.ts.map +1 -1
  917. package/dist/types/model/queries/membership/ProjectSlugSpecification.d.ts.map +1 -1
  918. package/dist/types/model/queries/person/PersonByIdPQuery.d.ts.map +1 -1
  919. package/dist/types/model/queries/person/PersonByIdentityBatchQuery.d.ts.map +1 -1
  920. package/dist/types/model/queries/person/PersonQuery.d.ts.map +1 -1
  921. package/dist/types/model/queries/person/PersonQueryBuilderFactory.d.ts.map +1 -1
  922. package/dist/types/model/queries/person/PersonsQuery.d.ts.map +1 -1
  923. package/dist/types/model/queries/person/types.d.ts +1 -0
  924. package/dist/types/model/queries/person/types.d.ts.map +1 -1
  925. package/dist/types/model/queries/personToken/PersonTokenQuery.d.ts.map +1 -1
  926. package/dist/types/model/queries/project/ProjectBySlugQuery.d.ts.map +1 -1
  927. package/dist/types/model/queries/project/ProjectSecretKeysQuery.d.ts.map +1 -1
  928. package/dist/types/model/queries/project/ProjectSecretsQuery.d.ts.map +1 -1
  929. package/dist/types/model/queries/project/ProjectUpdateTimestampQuery.d.ts.map +1 -1
  930. package/dist/types/model/queries/project/ProjectsByIdentityQuery.d.ts.map +1 -1
  931. package/dist/types/model/queries/project/ProjectsQuery.d.ts.map +1 -1
  932. package/dist/types/model/queries/rateLimit/RateLimitCountQuery.d.ts.map +1 -1
  933. package/dist/types/model/service/AuthLogService.d.ts.map +1 -1
  934. package/dist/types/model/service/AuthPolicyManager.d.ts.map +1 -1
  935. package/dist/types/model/service/AuthPolicyResolver.d.ts.map +1 -1
  936. package/dist/types/model/service/BackupCodeManager.d.ts.map +1 -1
  937. package/dist/types/model/service/ConfigurationManager.d.ts.map +1 -1
  938. package/dist/types/model/service/EmailChangeManager.d.ts.map +1 -1
  939. package/dist/types/model/service/EmailOtpManager.d.ts.map +1 -1
  940. package/dist/types/model/service/EmailValidator.d.ts.map +1 -1
  941. package/dist/types/model/service/EmailVerificationManager.d.ts.map +1 -1
  942. package/dist/types/model/service/HibpChecker.d.ts.map +1 -1
  943. package/dist/types/model/service/IDPSignInManager.d.ts +11 -1
  944. package/dist/types/model/service/IDPSignInManager.d.ts.map +1 -1
  945. package/dist/types/model/service/InviteManager.d.ts.map +1 -1
  946. package/dist/types/model/service/LoginRiskAnalyzer.d.ts +1 -1
  947. package/dist/types/model/service/LoginRiskAnalyzer.d.ts.map +1 -1
  948. package/dist/types/model/service/MailTemplateManager.d.ts.map +1 -1
  949. package/dist/types/model/service/MembershipValidator.d.ts.map +1 -1
  950. package/dist/types/model/service/OtpAuthenticator.d.ts.map +1 -1
  951. package/dist/types/model/service/OtpManager.d.ts.map +1 -1
  952. package/dist/types/model/service/PanelAccessResolver.d.ts +19 -0
  953. package/dist/types/model/service/PanelAccessResolver.d.ts.map +1 -0
  954. package/dist/types/model/service/PasswordChangeManager.d.ts.map +1 -1
  955. package/dist/types/model/service/PasswordResetManager.d.ts.map +1 -1
  956. package/dist/types/model/service/PasswordStrengthValidator.d.ts.map +1 -1
  957. package/dist/types/model/service/PasswordlessSignInManager.d.ts.map +1 -1
  958. package/dist/types/model/service/PersonAccessManager.d.ts +5 -2
  959. package/dist/types/model/service/PersonAccessManager.d.ts.map +1 -1
  960. package/dist/types/model/service/PersonManager.d.ts.map +1 -1
  961. package/dist/types/model/service/ProjectManager.d.ts.map +1 -1
  962. package/dist/types/model/service/ProjectMemberManager.d.ts.map +1 -1
  963. package/dist/types/model/service/RateLimiter.d.ts.map +1 -1
  964. package/dist/types/model/service/RolesManager.d.ts.map +1 -1
  965. package/dist/types/model/service/SecretsManager.d.ts.map +1 -1
  966. package/dist/types/model/service/SignInManager.d.ts.map +1 -1
  967. package/dist/types/model/service/SignOutManager.d.ts.map +1 -1
  968. package/dist/types/model/service/SignUpManager.d.ts.map +1 -1
  969. package/dist/types/model/service/apiKey/ApiKeyManager.d.ts.map +1 -1
  970. package/dist/types/model/service/apiKey/ApiKeyService.d.ts.map +1 -1
  971. package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts +18 -0
  972. package/dist/types/model/service/apiKey/UnpersistedApiKeyManager.d.ts.map +1 -1
  973. package/dist/types/model/service/captcha/CaptchaValidator.d.ts.map +1 -1
  974. package/dist/types/model/service/captcha/HCaptchaProvider.d.ts.map +1 -1
  975. package/dist/types/model/service/captcha/RecaptchaV3Provider.d.ts.map +1 -1
  976. package/dist/types/model/service/captcha/TurnstileProvider.d.ts.map +1 -1
  977. package/dist/types/model/service/helpers/getPreferredProject.d.ts.map +1 -1
  978. package/dist/types/model/service/helpers/isPasswordlessEnabled.d.ts.map +1 -1
  979. package/dist/types/model/service/idp/BackchannelLogoutManager.d.ts.map +1 -1
  980. package/dist/types/model/service/idp/ClaimMapping.d.ts +330 -0
  981. package/dist/types/model/service/idp/ClaimMapping.d.ts.map +1 -0
  982. package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts +30 -0
  983. package/dist/types/model/service/idp/ClaimMappingEvaluator.d.ts.map +1 -0
  984. package/dist/types/model/service/idp/ClaimMappingValidation.d.ts +55 -0
  985. package/dist/types/model/service/idp/ClaimMappingValidation.d.ts.map +1 -0
  986. package/dist/types/model/service/idp/IDPClaimSyncService.d.ts +113 -0
  987. package/dist/types/model/service/idp/IDPClaimSyncService.d.ts.map +1 -0
  988. package/dist/types/model/service/idp/IDPHandlerRegistry.d.ts.map +1 -1
  989. package/dist/types/model/service/idp/IDPManager.d.ts +31 -1
  990. package/dist/types/model/service/idp/IDPManager.d.ts.map +1 -1
  991. package/dist/types/model/service/idp/IdentityProviderHandler.d.ts +7 -0
  992. package/dist/types/model/service/idp/IdentityProviderHandler.d.ts.map +1 -1
  993. package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts +13 -1
  994. package/dist/types/model/service/idp/IdpSessionRevalidator.d.ts.map +1 -1
  995. package/dist/types/model/service/idp/PersonIdentityProviderManager.d.ts.map +1 -1
  996. package/dist/types/model/service/idp/index.d.ts +4 -0
  997. package/dist/types/model/service/idp/index.d.ts.map +1 -1
  998. package/dist/types/model/service/idp/providers/AppleProvider.d.ts +2 -2
  999. package/dist/types/model/service/idp/providers/AppleProvider.d.ts.map +1 -1
  1000. package/dist/types/model/service/idp/providers/FacebookProvider.d.ts +2 -2
  1001. package/dist/types/model/service/idp/providers/FacebookProvider.d.ts.map +1 -1
  1002. package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts +13 -1
  1003. package/dist/types/model/service/idp/providers/OIDCHelpers.d.ts.map +1 -1
  1004. package/dist/types/model/service/idp/providers/OIDCProvider.d.ts +1 -1
  1005. package/dist/types/model/service/idp/providers/OIDCProvider.d.ts.map +1 -1
  1006. package/dist/types/model/service/idp/providers/OIDCTypes.d.ts +5 -5
  1007. package/dist/types/model/service/idp/providers/helpers.d.ts.map +1 -1
  1008. package/dist/types/model/service/index.d.ts +1 -0
  1009. package/dist/types/model/service/index.d.ts.map +1 -1
  1010. package/dist/types/model/service/membershipUtils.d.ts.map +1 -1
  1011. package/dist/types/model/type/AuthLog.d.ts +1 -1
  1012. package/dist/types/model/type/AuthLog.d.ts.map +1 -1
  1013. package/dist/types/model/type/Config.d.ts +2 -0
  1014. package/dist/types/model/type/Config.d.ts.map +1 -1
  1015. package/dist/types/model/type/RateLimit.d.ts +6 -6
  1016. package/dist/types/model/type/RateLimit.d.ts.map +1 -1
  1017. package/dist/types/model/utils/DatabaseContext.d.ts +14 -1
  1018. package/dist/types/model/utils/DatabaseContext.d.ts.map +1 -1
  1019. package/dist/types/model/utils/Response.d.ts.map +1 -1
  1020. package/dist/types/model/utils/email.d.ts.map +1 -1
  1021. package/dist/types/model/utils/hex.d.ts.map +1 -1
  1022. package/dist/types/model/utils/interval.d.ts.map +1 -1
  1023. package/dist/types/model/utils/time.d.ts.map +1 -1
  1024. package/dist/types/model/utils/token.d.ts.map +1 -1
  1025. package/dist/types/resolvers/ResolverFactory.d.ts +2 -0
  1026. package/dist/types/resolvers/ResolverFactory.d.ts.map +1 -1
  1027. package/dist/types/resolvers/TenantResolverContextFactory.d.ts.map +1 -1
  1028. package/dist/types/resolvers/errorUtils.d.ts.map +1 -1
  1029. package/dist/types/resolvers/membershipUtils.d.ts.map +1 -1
  1030. package/dist/types/resolvers/mutation/apiKey/CreateApiKeyMutationResolver.d.ts.map +1 -1
  1031. package/dist/types/resolvers/mutation/apiKey/DisableApiKeyMutationResolver.d.ts.map +1 -1
  1032. package/dist/types/resolvers/mutation/configuration/AuthPolicyMutationResolver.d.ts.map +1 -1
  1033. package/dist/types/resolvers/mutation/configuration/ConfigurationMutationResolver.d.ts.map +1 -1
  1034. package/dist/types/resolvers/mutation/identity/GlobalRolesMutationResolver.d.ts.map +1 -1
  1035. package/dist/types/resolvers/mutation/idp/AddIDPMutationResolver.d.ts.map +1 -1
  1036. package/dist/types/resolvers/mutation/idp/DisableIDPMutationResolver.d.ts.map +1 -1
  1037. package/dist/types/resolvers/mutation/idp/DisconnectMyIdentityProviderMutationResolver.d.ts.map +1 -1
  1038. package/dist/types/resolvers/mutation/idp/EnableIDPMutationResolver.d.ts.map +1 -1
  1039. package/dist/types/resolvers/mutation/idp/UpdateIDPMutationResolver.d.ts.map +1 -1
  1040. package/dist/types/resolvers/mutation/idp/audit.d.ts.map +1 -1
  1041. package/dist/types/resolvers/mutation/mailTemplates/MailTemplateMutationResolver.d.ts.map +1 -1
  1042. package/dist/types/resolvers/mutation/person/ChangePasswordMutationResolver.d.ts.map +1 -1
  1043. package/dist/types/resolvers/mutation/person/ChangeProfileMutationResolver.d.ts.map +1 -1
  1044. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts +1 -1
  1045. package/dist/types/resolvers/mutation/person/DisablePersonMutationResolver.d.ts.map +1 -1
  1046. package/dist/types/resolvers/mutation/person/EmailOtpMutationResolver.d.ts.map +1 -1
  1047. package/dist/types/resolvers/mutation/person/EmailVerificationMutationResolver.d.ts.map +1 -1
  1048. package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts +11 -0
  1049. package/dist/types/resolvers/mutation/person/EnablePersonMutationResolver.d.ts.map +1 -0
  1050. package/dist/types/resolvers/mutation/person/ForceSignOutMutationResolver.d.ts.map +1 -1
  1051. package/dist/types/resolvers/mutation/person/IDPMutationResolver.d.ts.map +1 -1
  1052. package/dist/types/resolvers/mutation/person/InviteMutationResolver.d.ts.map +1 -1
  1053. package/dist/types/resolvers/mutation/person/OtpMutationResolver.d.ts.map +1 -1
  1054. package/dist/types/resolvers/mutation/person/PasswordlessMutationResolver.d.ts.map +1 -1
  1055. package/dist/types/resolvers/mutation/person/RegenerateBackupCodesMutationResolver.d.ts.map +1 -1
  1056. package/dist/types/resolvers/mutation/person/ResetPasswordMutationResolver.d.ts.map +1 -1
  1057. package/dist/types/resolvers/mutation/person/ResetPersonMfaMutationResolver.d.ts.map +1 -1
  1058. package/dist/types/resolvers/mutation/person/RevokeSessionMutationResolver.d.ts.map +1 -1
  1059. package/dist/types/resolvers/mutation/person/SignInMutationResolver.d.ts.map +1 -1
  1060. package/dist/types/resolvers/mutation/person/SignOutMutationResolver.d.ts.map +1 -1
  1061. package/dist/types/resolvers/mutation/person/SignUpMutationResolver.d.ts.map +1 -1
  1062. package/dist/types/resolvers/mutation/person/TogglePasswordlessMutationResolver.d.ts.map +1 -1
  1063. package/dist/types/resolvers/mutation/project/CreateProjectMutationResolver.d.ts.map +1 -1
  1064. package/dist/types/resolvers/mutation/project/SetProjectSecretMutationResolver.d.ts.map +1 -1
  1065. package/dist/types/resolvers/mutation/project/UpdateProjectMutationResolver.d.ts.map +1 -1
  1066. package/dist/types/resolvers/mutation/projectMember/AddProjectMemberMutationResolver.d.ts.map +1 -1
  1067. package/dist/types/resolvers/mutation/projectMember/RemoveProjectMemberMutationResolver.d.ts.map +1 -1
  1068. package/dist/types/resolvers/mutation/projectMember/UpdateProjectMemberMutationResolver.d.ts.map +1 -1
  1069. package/dist/types/resolvers/mutation/projectMember/audit.d.ts +1 -1
  1070. package/dist/types/resolvers/mutation/projectMember/audit.d.ts.map +1 -1
  1071. package/dist/types/resolvers/query/ApiKeyQueryResolver.d.ts.map +1 -1
  1072. package/dist/types/resolvers/query/AuthLogQueryResolver.d.ts.map +1 -1
  1073. package/dist/types/resolvers/query/AuthPolicyQueryResolver.d.ts.map +1 -1
  1074. package/dist/types/resolvers/query/ConfigurationQueryResolver.d.ts.map +1 -1
  1075. package/dist/types/resolvers/query/IDPQueryResolver.d.ts.map +1 -1
  1076. package/dist/types/resolvers/query/MailTemplateQueryResolver.d.ts.map +1 -1
  1077. package/dist/types/resolvers/query/MeQueryResolver.d.ts.map +1 -1
  1078. package/dist/types/resolvers/query/PersonQueryResolver.d.ts.map +1 -1
  1079. package/dist/types/resolvers/query/ProjectMembersQueryResolver.d.ts.map +1 -1
  1080. package/dist/types/resolvers/query/ProjectQueryResolver.d.ts.map +1 -1
  1081. package/dist/types/resolvers/responseHelpers/ApiKeyResponseFactory.d.ts.map +1 -1
  1082. package/dist/types/resolvers/responseHelpers/PersonResponseFactory.d.ts.map +1 -1
  1083. package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts +10 -0
  1084. package/dist/types/resolvers/responseHelpers/ProjectResponseFactory.d.ts.map +1 -0
  1085. package/dist/types/resolvers/responseHelpers/SignInResponseFactory.d.ts.map +1 -1
  1086. package/dist/types/resolvers/types/IdentityTypeResolver.d.ts.map +1 -1
  1087. package/dist/types/resolvers/types/PersonTypeResolver.d.ts +15 -1
  1088. package/dist/types/resolvers/types/PersonTypeResolver.d.ts.map +1 -1
  1089. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts +15 -6
  1090. package/dist/types/resolvers/types/ProjectTypeResolver.d.ts.map +1 -1
  1091. package/dist/types/schema/index.d.ts +161 -0
  1092. package/dist/types/schema/index.d.ts.map +1 -1
  1093. package/dist/types/schema/tenant.graphql.d.ts.map +1 -1
  1094. package/dist/types/schema/types.d.ts +2 -2
  1095. package/dist/types/schema/types.d.ts.map +1 -1
  1096. package/dist/types/tsconfig.tsbuildinfo +1 -1
  1097. package/dist/types/utils/Mailer.d.ts.map +1 -1
  1098. package/dist/types/utils/TemplateRenderer.d.ts.map +1 -1
  1099. package/dist/types/utils/array.d.ts.map +1 -1
  1100. package/dist/types/utils/batchQuery.d.ts.map +1 -1
  1101. package/package.json +12 -12
  1102. package/src/TenantContainer.ts +17 -3
  1103. package/src/migrations/2026-06-18-120000-idp-claim-mapping.ts +15 -0
  1104. package/src/migrations/2026-08-03-120000-person-enable-auth-log.ts +12 -0
  1105. package/src/migrations/2026-08-04-120000-config-panel.ts +13 -0
  1106. package/src/migrations/runner.ts +6 -0
  1107. package/src/migrations/snapshot.ts +6 -1
  1108. package/src/model/commands/configuration/UpdateConfigurationCommand.ts +5 -4
  1109. package/src/model/commands/membership/UpdateProjectMemberCommand.ts +1 -1
  1110. package/src/model/commands/membership/index.ts +2 -1
  1111. package/src/model/commands/membership/variables/index.ts +1 -0
  1112. package/src/model/commands/person/EnablePersonCommand.ts +18 -0
  1113. package/src/model/queries/configuration/ConfigurationQuery.ts +4 -0
  1114. package/src/model/queries/membership/ProjectMembersQuery.ts +1 -0
  1115. package/src/model/queries/person/PersonQueryBuilderFactory.ts +1 -0
  1116. package/src/model/queries/person/types.ts +1 -0
  1117. package/src/model/service/AuthLogService.ts +18 -2
  1118. package/src/model/service/IDPSignInManager.ts +49 -1
  1119. package/src/model/service/PanelAccessResolver.ts +32 -0
  1120. package/src/model/service/PersonAccessManager.ts +19 -3
  1121. package/src/model/service/apiKey/ApiKeyManager.ts +5 -3
  1122. package/src/model/service/apiKey/UnpersistedApiKeyManager.ts +24 -0
  1123. package/src/model/service/idp/ClaimMapping.ts +283 -0
  1124. package/src/model/service/idp/ClaimMappingEvaluator.ts +226 -0
  1125. package/src/model/service/idp/ClaimMappingValidation.ts +158 -0
  1126. package/src/model/service/idp/IDPClaimSyncService.ts +401 -0
  1127. package/src/model/service/idp/IDPManager.ts +126 -21
  1128. package/src/model/service/idp/IdentityProviderHandler.ts +7 -0
  1129. package/src/model/service/idp/IdpSessionRevalidator.ts +90 -0
  1130. package/src/model/service/idp/index.ts +4 -0
  1131. package/src/model/service/idp/providers/OIDCHelpers.ts +161 -53
  1132. package/src/model/service/idp/providers/OIDCProvider.ts +4 -1
  1133. package/src/model/service/index.ts +1 -0
  1134. package/src/model/type/AuthLog.ts +3 -0
  1135. package/src/model/type/Config.ts +3 -0
  1136. package/src/model/utils/DatabaseContext.ts +27 -6
  1137. package/src/resolvers/ResolverFactory.ts +6 -0
  1138. package/src/resolvers/mutation/person/DisablePersonMutationResolver.ts +3 -3
  1139. package/src/resolvers/mutation/person/EnablePersonMutationResolver.ts +50 -0
  1140. package/src/resolvers/mutation/person/IDPMutationResolver.ts +31 -0
  1141. package/src/resolvers/query/ProjectQueryResolver.ts +3 -2
  1142. package/src/resolvers/responseHelpers/PersonResponseFactory.ts +5 -0
  1143. package/src/resolvers/responseHelpers/ProjectResponseFactory.ts +24 -0
  1144. package/src/resolvers/types/IdentityTypeResolver.ts +39 -3
  1145. package/src/resolvers/types/PersonTypeResolver.ts +35 -2
  1146. package/src/resolvers/types/ProjectTypeResolver.ts +33 -1
  1147. package/src/schema/index.ts +183 -0
  1148. package/src/schema/tenant.graphql.ts +116 -0
  1149. package/tests/cases/integration/mocked/configurationPanel.test.ts +105 -0
  1150. package/tests/cases/integration/mocked/disablePersonMutation.test.ts +89 -0
  1151. package/tests/cases/integration/mocked/enablePersonMutation.test.ts +130 -0
  1152. package/tests/cases/integration/mocked/idpClaimMappingConfig.test.ts +332 -0
  1153. package/tests/cases/integration/mocked/listProjectMembersQuery.test.ts +8 -3
  1154. package/tests/cases/integration/mocked/permissionsQuery.test.ts +153 -0
  1155. package/tests/cases/integration/mocked/personsQuery.test.ts +38 -5
  1156. package/tests/cases/integration/mocked/signInIdpClaimMapping.test.ts +1244 -0
  1157. package/tests/cases/integration/mocked/signInIdpClaimMappingFixes.test.ts +340 -0
  1158. package/tests/cases/integration/mocked/signInIdpClaimMappingSafety.test.ts +525 -0
  1159. package/tests/cases/integration/mocked/sql/getConfigSql.ts +3 -0
  1160. package/tests/cases/integration/mocked/sql/getProjectBySlugSql.ts +1 -1
  1161. package/tests/cases/integration/mocked/sql/listPersonsSql.ts +5 -2
  1162. package/tests/cases/integration/mocked/sql/removeMembershipSql.ts +14 -0
  1163. package/tests/cases/unit/databaseContextRetry.test.ts +81 -0
  1164. package/tests/cases/unit/idp/claimMappingEvaluator.test.ts +554 -0
  1165. package/tests/cases/unit/idp/claimMappingValidation.test.ts +134 -0
  1166. package/tests/cases/unit/idp/idpManagerConfigMerge.test.ts +97 -0
  1167. package/tests/cases/unit/idp/idpManagerUnknownConfigKeys.test.ts +101 -0
  1168. package/tests/cases/unit/idp/idpSessionRevalidator.test.ts +226 -24
  1169. package/tests/cases/unit/idp/oidcClaims.test.ts +29 -0
  1170. package/tests/cases/unit/idp/oidcResponse.test.ts +54 -0
  1171. package/tests/cases/unit/idp/oidcRevalidate.test.ts +94 -2
  1172. package/tests/cases/unit/panelAccessResolver.test.ts +57 -0
  1173. package/tests/cases/unit/updateConfigurationCommand.test.ts +63 -0
  1174. package/tests/src/IdPMock.ts +4 -0
  1175. package/tests/src/testTenant.ts +32 -1
  1176. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
  1177. package/dist/development/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
  1178. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.cjs.map +0 -1
  1179. package/dist/production/src/model/commands/membership/RemoveProjectMembershipsCommand.js.map +0 -1
  1180. package/dist/types/model/commands/membership/RemoveProjectMembershipsCommand.d.ts.map +0 -1
  1181. /package/src/model/commands/membership/{RemoveProjectMembershipsCommand.ts → RemoveProjectMembershipCommand.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ApiKeyManager.js","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/ApiKeyManager.ts"],"sourcesContent":["import {\n\tApiKeyRequestInfo,\n\tCreateApiKeyCommand,\n\tDisableApiKeyCommand,\n\tDisableIdentityApiKeysCommand,\n\tDisableOneOffApiKeyCommand,\n\tPROLONG_THROTTLE_MS,\n\tProlongApiKeyCommand,\n} from '../../commands/index.js'\nimport { ApiKey } from '../../type/index.js'\n\nimport { Response, ResponseError, ResponseOk } from '../../utils/Response.js'\nimport { DatabaseContext, TokenHash } from '../../utils/index.js'\nimport { ApiKeyService, CreateApiKeyResponse } from './ApiKeyService.js'\nimport assert from 'node:assert'\nimport { Acl } from '@contember/schema'\nimport { ApiKeyByIdQuery, ApiKeyByTokenQuery, ApiKeyRow, ConfigurationQuery, IdentityQuery } from '../../queries/index.js'\nimport PostgresInterval from 'postgres-interval'\nimport { Config } from '../../type/Config.js'\nimport { intervalToPostgres, intervalToSeconds } from '../../utils/interval.js'\nimport { AuthPolicyResolver } from '../AuthPolicyResolver.js'\nimport { AuthLogService } from '../AuthLogService.js'\nimport { IdpSessionRevalidator } from '../idp/IdpSessionRevalidator.js'\nimport { UnpersistedApiKeyManager } from './UnpersistedApiKeyManager.js'\n\nexport class ApiKeyManager {\n\tconstructor(\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t\tprivate readonly authPolicyResolver: AuthPolicyResolver,\n\t\tprivate readonly authLogService: AuthLogService,\n\t\tprivate readonly unpersistedApiKeyManager: UnpersistedApiKeyManager = new UnpersistedApiKeyManager(),\n\t\tprivate readonly idpSessionRevalidator?: IdpSessionRevalidator,\n\t) {}\n\n\tasync verifyAndProlong(\n\t\tdbContext: DatabaseContext,\n\t\treadDbContext: DatabaseContext,\n\t\ttoken: string,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\tforwardedInfo?: ApiKeyRequestInfo,\n\t): Promise<VerifyResponse> {\n\t\tconst unpersistedResult = this.unpersistedApiKeyManager.verify(token)\n\t\tif (unpersistedResult !== null) {\n\t\t\t// Configured (unpersisted) root token: no DB row to prolong/track.\n\t\t\treturn new ResponseOk(unpersistedResult)\n\t\t}\n\n\t\tconst apiKeyRow = await readDbContext.queryHandler.fetch(new ApiKeyByTokenQuery(token))\n\t\tif (apiKeyRow === null) {\n\t\t\treturn new ResponseError(VerifyErrorCode.NOT_FOUND, 'API key was not found')\n\t\t}\n\n\t\tif (apiKeyRow.disabled_at !== null) {\n\t\t\treturn new ResponseError(\n\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t`API key was disabled at ${apiKeyRow.disabled_at.toISOString()}`,\n\t\t\t)\n\t\t}\n\n\t\t// Single injectable clock for all session-policy time math (matches issuance,\n\t\t// which uses providers.now()), so the A19 idle/max logic is deterministically testable.\n\t\tconst now = dbContext.providers.now()\n\t\tif (apiKeyRow.expires_at !== null && apiKeyRow.expires_at <= now) {\n\t\t\treturn new ResponseError(VerifyErrorCode.DISABLED, `API key expired at ${apiKeyRow.expires_at.toISOString()}`)\n\t\t}\n\n\t\t// A19: absolute hard cap (defensive — the prolong clamp should already keep\n\t\t// expires_at <= max_expires_at, but enforce it here regardless).\n\t\tif (apiKeyRow.max_expires_at !== null && apiKeyRow.max_expires_at <= now) {\n\t\t\tawait dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyRow.id))\n\t\t\treturn new ResponseError(\n\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t`API key reached its maximum lifetime at ${apiKeyRow.max_expires_at.toISOString()}`,\n\t\t\t)\n\t\t}\n\n\t\t// A19: idle timeout. Reject + disable when the session has been idle longer\n\t\t// than the policy's idle_timeout. A null idle_timeout (today's default) or a\n\t\t// never-used key (last_used_at null) are never idle-expired.\n\t\tif (apiKeyRow.idle_timeout !== null && apiKeyRow.last_used_at !== null) {\n\t\t\tconst idleMs = intervalToSeconds(apiKeyRow.idle_timeout) * 1000\n\t\t\t// last_used_at is written at most once per PROLONG_THROTTLE_MS (tracking is\n\t\t\t// throttled), so it can legitimately lag a continuously-active session by up\n\t\t\t// to that window. Add the throttle as slack so a small idle_timeout can't\n\t\t\t// idle-expire a session that is actually in use.\n\t\t\tif (now.getTime() - apiKeyRow.last_used_at.getTime() > idleMs + PROLONG_THROTTLE_MS) {\n\t\t\t\tawait dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyRow.id))\n\t\t\t\ttry {\n\t\t\t\t\tawait this.authLogService.logSessionEvent(dbContext, {\n\t\t\t\t\t\ttype: 'session_expired_idle',\n\t\t\t\t\t\tidentityId: apiKeyRow.identity_id,\n\t\t\t\t\t\tpersonId: apiKeyRow.person_id,\n\t\t\t\t\t\tipAddress: requestInfo?.ip,\n\t\t\t\t\t\tuserAgent: requestInfo?.userAgent,\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\teventData: {\n\t\t\t\t\t\t\tlastUsedAt: apiKeyRow.last_used_at?.toISOString() ?? null,\n\t\t\t\t\t\t\tidleTimeout: String(apiKeyRow.idle_timeout),\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\t/* best-effort: auth path must stay resilient */\n\t\t\t\t}\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t\t`API key was idle since ${apiKeyRow.last_used_at.toISOString()} and exceeded the idle timeout`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst effectiveInfo: ApiKeyRequestInfo | undefined = apiKeyRow.trust_forwarded_info && forwardedInfo\n\t\t\t? {\n\t\t\t\tip: forwardedInfo.ip ?? requestInfo?.ip,\n\t\t\t\tuserAgent: forwardedInfo.userAgent ?? requestInfo?.userAgent,\n\t\t\t}\n\t\t\t: requestInfo\n\n\t\t// Re-validate IdP-backed sessions against their identity provider (A24). In the\n\t\t// default `background` mode this returns immediately and revalidates after the\n\t\t// response (revocation lands on the next request); in `blocking` mode it can revoke\n\t\t// the current request. No-op for password sessions and IdPs without revalidation.\n\t\t// `effectiveInfo` is passed so the audit entries record the originating request's IP/UA.\n\t\tif (this.idpSessionRevalidator) {\n\t\t\tconst outcome = await this.idpSessionRevalidator.revalidate(dbContext, readDbContext, apiKeyRow, effectiveInfo)\n\t\t\tif (outcome === 'revoked') {\n\t\t\t\treturn new ResponseError(VerifyErrorCode.DISABLED, 'IdP session was revoked')\n\t\t\t}\n\t\t}\n\n\t\tsetImmediate(async () => {\n\t\t\tawait dbContext.commandBus.execute(\n\t\t\t\tnew ProlongApiKeyCommand(\n\t\t\t\t\tapiKeyRow.id,\n\t\t\t\t\tapiKeyRow.type,\n\t\t\t\t\tapiKeyRow.expiration,\n\t\t\t\t\tapiKeyRow.expires_at,\n\t\t\t\t\teffectiveInfo,\n\t\t\t\t\t{\n\t\t\t\t\t\tlastIp: apiKeyRow.last_ip,\n\t\t\t\t\t\tlastUserAgent: apiKeyRow.last_user_agent,\n\t\t\t\t\t\tlastUsedAt: apiKeyRow.last_used_at,\n\t\t\t\t\t},\n\t\t\t\t\tapiKeyRow.max_expires_at,\n\t\t\t\t),\n\t\t\t)\n\t\t})\n\n\t\treturn new ResponseOk(\n\t\t\tnew VerifyResult(\n\t\t\t\tapiKeyRow.identity_id,\n\t\t\t\tapiKeyRow.id,\n\t\t\t\tapiKeyRow.roles,\n\t\t\t\tapiKeyRow.person_id,\n\t\t\t\tapiKeyRow.trust_forwarded_info,\n\t\t\t),\n\t\t)\n\t}\n\n\tasync createSessionApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\texpiration?: number,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<string> {\n\t\tconst { token } = await this.createSessionApiKeyWithId(dbContext, identityId, expiration, requestInfo, trustForwardedInfo)\n\t\treturn token\n\t}\n\n\t/**\n\t * Like {@link createSessionApiKey} but also returns the api_key id — needed when the\n\t * caller has to bind another row to the session (e.g. an `idp_session` for IdP\n\t * re-validation).\n\t */\n\tasync createSessionApiKeyWithId(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\texpiration?: number,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<{ id: string; token: string }> {\n\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\n\t\t// A19: snapshot the effective session policy onto the api_key at sign-in.\n\t\t// With no matching policy, every field is null/baseline and the result is\n\t\t// byte-for-byte today's behavior.\n\t\tconst [identityRow] = await dbContext.queryHandler.fetch(new IdentityQuery([identityId]))\n\t\tconst globalRoles = identityRow?.roles ?? []\n\t\tconst policy = await this.authPolicyResolver.resolveForIdentity(dbContext, identityId, globalRoles)\n\n\t\tconst defaultExpirationMinutes = intervalToSeconds(config.login.defaultTokenExpiration) / 60\n\t\t// remember_me_allowed === false: ignore a client-supplied longer lifetime and\n\t\t// force the default. (true/null leave the requested expiration untouched.)\n\t\tconst requestedMinutes = policy.rememberMeAllowed === false\n\t\t\t? defaultExpirationMinutes\n\t\t\t: (expiration ?? defaultExpirationMinutes)\n\n\t\t// Cap by maxTokenExpiration (existing behavior) AND by the policy's\n\t\t// tokenExpiration (A19) — strictest wins.\n\t\tlet expirationCapped = config.login.maxTokenExpiration\n\t\t\t? Math.min(requestedMinutes, intervalToSeconds(config.login.maxTokenExpiration) / 60)\n\t\t\t: requestedMinutes\n\t\tif (policy.tokenExpiration) {\n\t\t\texpirationCapped = Math.min(expirationCapped, intervalToSeconds(policy.tokenExpiration) / 60)\n\t\t}\n\n\t\t// Absolute hard cap: issued_at + policy.tokenExpiration. NULL = uncapped\n\t\t// sliding window (today's behavior).\n\t\tconst issuedAt = dbContext.providers.now()\n\t\tconst maxExpiresAt = policy.tokenExpiration\n\t\t\t? new Date(issuedAt.getTime() + intervalToSeconds(policy.tokenExpiration) * 1000)\n\t\t\t: null\n\n\t\tconst command = new CreateApiKeyCommand({\n\t\t\ttype: ApiKey.Type.SESSION,\n\t\t\tidentityId,\n\t\t\texpiration: expirationCapped,\n\t\t\trequestInfo,\n\t\t\ttrustForwardedInfo,\n\t\t\tidleTimeout: policy.idleTimeout ? intervalToPostgres(policy.idleTimeout) : null,\n\t\t\tmaxExpiresAt,\n\t\t})\n\t\tconst { id, token } = await dbContext.commandBus.execute(command)\n\t\tassert(token !== undefined)\n\n\t\t// A19: audit only when a policy is actually in effect. With zero auth_policy\n\t\t// rows the resolved policy is inert and no extra insert happens.\n\t\tconst policyApplied = policy.mfaRequired === true\n\t\t\t|| policy.tokenExpiration !== null\n\t\t\t|| policy.idleTimeout !== null\n\t\t\t|| policy.rememberMeAllowed !== null\n\t\tif (policyApplied) {\n\t\t\ttry {\n\t\t\t\tawait this.authLogService.logSessionEvent(dbContext, {\n\t\t\t\t\ttype: 'session_policy_applied',\n\t\t\t\t\tidentityId,\n\t\t\t\t\tipAddress: requestInfo?.ip,\n\t\t\t\t\tuserAgent: requestInfo?.userAgent,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\teventData: {\n\t\t\t\t\t\ttokenExpiration: policy.tokenExpiration ? intervalToPostgres(policy.tokenExpiration) : null,\n\t\t\t\t\t\tidleTimeout: policy.idleTimeout ? intervalToPostgres(policy.idleTimeout) : null,\n\t\t\t\t\t\trememberMeAllowed: policy.rememberMeAllowed,\n\t\t\t\t\t\tmfaRequired: policy.mfaRequired,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\t/* best-effort: sign-in must not break on an audit failure */\n\t\t\t}\n\t\t}\n\n\t\treturn { id, token }\n\t}\n\n\tasync findApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<ApiKeyRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tnew ApiKeyByIdQuery(apiKeyId),\n\t\t)\n\t}\n\n\tasync disableOneOffApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new DisableOneOffApiKeyCommand(apiKeyId))\n\t}\n\n\tasync disableApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<boolean> {\n\t\treturn await dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyId))\n\t}\n\n\tasync disableIdentityApiKeys(dbContext: DatabaseContext, identityId: string): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new DisableIdentityApiKeysCommand(identityId))\n\t}\n\n\tasync createGlobalPermanentApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tdescription: string,\n\t\troles: readonly string[],\n\t\ttokenHash?: TokenHash,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateApiKeyResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await this.apiKeyService.createPermanentApiKey(db, description, roles, tokenHash, trustForwardedInfo)\n\t\t})\n\t}\n\n\tasync createProjectPermanentApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tdescription: string,\n\t\ttokenHash?: TokenHash,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateApiKeyResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await this.apiKeyService.createProjectPermanentApiKey(db, projectId, memberships, description, tokenHash, trustForwardedInfo)\n\t\t})\n\t}\n}\n\nexport type VerifyResponse = Response<VerifyResult, VerifyErrorCode>\n\nexport class VerifyResult {\n\treadonly valid = true\n\n\tconstructor(\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly apiKeyId: string,\n\t\tpublic readonly roles: string[],\n\t\tpublic readonly personId: string | null,\n\t\tpublic readonly trustForwardedInfo: boolean = false,\n\t) {}\n}\n\nexport enum VerifyErrorCode {\n\tNOT_FOUND = 'not_found',\n\tDISABLED = 'disabled',\n\tEXPIRED = 'expired',\n\tNO_AUTH_HEADER = 'no_auth_header',\n\tINVALID_AUTH_HEADER = 'invalid_auth_header',\n}\n"],"names":["VerifyErrorCode"],"mappings":"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"}
1
+ {"version":3,"file":"ApiKeyManager.js","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/ApiKeyManager.ts"],"sourcesContent":["import {\n\tApiKeyRequestInfo,\n\tCreateApiKeyCommand,\n\tDisableApiKeyCommand,\n\tDisableIdentityApiKeysCommand,\n\tDisableOneOffApiKeyCommand,\n\tPROLONG_THROTTLE_MS,\n\tProlongApiKeyCommand,\n} from '../../commands/index.js'\nimport { ApiKey } from '../../type/index.js'\n\nimport { Response, ResponseError, ResponseOk } from '../../utils/Response.js'\nimport { DatabaseContext, TokenHash } from '../../utils/index.js'\nimport { ApiKeyService, CreateApiKeyResponse } from './ApiKeyService.js'\nimport assert from 'node:assert'\nimport { Acl } from '@contember/schema'\nimport { ApiKeyByIdQuery, ApiKeyByTokenQuery, ApiKeyRow, ConfigurationQuery, IdentityQuery } from '../../queries/index.js'\nimport PostgresInterval from 'postgres-interval'\nimport { Config } from '../../type/Config.js'\nimport { intervalToPostgres, intervalToSeconds } from '../../utils/interval.js'\nimport { AuthPolicyResolver } from '../AuthPolicyResolver.js'\nimport { AuthLogService } from '../AuthLogService.js'\nimport { IdpSessionRevalidator } from '../idp/IdpSessionRevalidator.js'\nimport { UnpersistedApiKeyManager } from './UnpersistedApiKeyManager.js'\n\nexport class ApiKeyManager {\n\tconstructor(\n\t\tprivate readonly apiKeyService: ApiKeyService,\n\t\tprivate readonly authPolicyResolver: AuthPolicyResolver,\n\t\tprivate readonly authLogService: AuthLogService,\n\t\tprivate readonly unpersistedApiKeyManager: UnpersistedApiKeyManager = new UnpersistedApiKeyManager(),\n\t\tprivate readonly idpSessionRevalidator?: IdpSessionRevalidator,\n\t) {}\n\n\tasync verifyAndProlong(\n\t\tdbContext: DatabaseContext,\n\t\treadDbContext: DatabaseContext,\n\t\ttoken: string,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\tforwardedInfo?: ApiKeyRequestInfo,\n\t): Promise<VerifyResponse> {\n\t\tconst unpersistedResult = this.unpersistedApiKeyManager.verify(token)\n\t\tif (unpersistedResult !== null) {\n\t\t\t// Configured (unpersisted) root token: no DB row to prolong/track.\n\t\t\treturn new ResponseOk(unpersistedResult)\n\t\t}\n\n\t\tconst apiKeyRow = await readDbContext.queryHandler.fetch(new ApiKeyByTokenQuery(token))\n\t\tif (apiKeyRow === null) {\n\t\t\treturn new ResponseError(VerifyErrorCode.NOT_FOUND, 'API key was not found')\n\t\t}\n\n\t\tif (apiKeyRow.disabled_at !== null) {\n\t\t\treturn new ResponseError(\n\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t`API key was disabled at ${apiKeyRow.disabled_at.toISOString()}`,\n\t\t\t)\n\t\t}\n\n\t\t// Single injectable clock for all session-policy time math (matches issuance,\n\t\t// which uses providers.now()), so the A19 idle/max logic is deterministically testable.\n\t\tconst now = dbContext.providers.now()\n\t\tif (apiKeyRow.expires_at !== null && apiKeyRow.expires_at <= now) {\n\t\t\treturn new ResponseError(VerifyErrorCode.DISABLED, `API key expired at ${apiKeyRow.expires_at.toISOString()}`)\n\t\t}\n\n\t\t// A19: absolute hard cap (defensive — the prolong clamp should already keep\n\t\t// expires_at <= max_expires_at, but enforce it here regardless).\n\t\tif (apiKeyRow.max_expires_at !== null && apiKeyRow.max_expires_at <= now) {\n\t\t\tawait dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyRow.id))\n\t\t\treturn new ResponseError(\n\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t`API key reached its maximum lifetime at ${apiKeyRow.max_expires_at.toISOString()}`,\n\t\t\t)\n\t\t}\n\n\t\t// A19: idle timeout. Reject + disable when the session has been idle longer\n\t\t// than the policy's idle_timeout. A null idle_timeout (today's default) or a\n\t\t// never-used key (last_used_at null) are never idle-expired.\n\t\tif (apiKeyRow.idle_timeout !== null && apiKeyRow.last_used_at !== null) {\n\t\t\tconst idleMs = intervalToSeconds(apiKeyRow.idle_timeout) * 1000\n\t\t\t// last_used_at is written at most once per PROLONG_THROTTLE_MS (tracking is\n\t\t\t// throttled), so it can legitimately lag a continuously-active session by up\n\t\t\t// to that window. Add the throttle as slack so a small idle_timeout can't\n\t\t\t// idle-expire a session that is actually in use.\n\t\t\tif (now.getTime() - apiKeyRow.last_used_at.getTime() > idleMs + PROLONG_THROTTLE_MS) {\n\t\t\t\tawait dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyRow.id))\n\t\t\t\ttry {\n\t\t\t\t\tawait this.authLogService.logSessionEvent(dbContext, {\n\t\t\t\t\t\ttype: 'session_expired_idle',\n\t\t\t\t\t\tidentityId: apiKeyRow.identity_id,\n\t\t\t\t\t\tpersonId: apiKeyRow.person_id,\n\t\t\t\t\t\tipAddress: requestInfo?.ip,\n\t\t\t\t\t\tuserAgent: requestInfo?.userAgent,\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\teventData: {\n\t\t\t\t\t\t\tlastUsedAt: apiKeyRow.last_used_at?.toISOString() ?? null,\n\t\t\t\t\t\t\tidleTimeout: String(apiKeyRow.idle_timeout),\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\t/* best-effort: auth path must stay resilient */\n\t\t\t\t}\n\t\t\t\treturn new ResponseError(\n\t\t\t\t\tVerifyErrorCode.DISABLED,\n\t\t\t\t\t`API key was idle since ${apiKeyRow.last_used_at.toISOString()} and exceeded the idle timeout`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\n\t\tconst effectiveInfo: ApiKeyRequestInfo | undefined = apiKeyRow.trust_forwarded_info && forwardedInfo\n\t\t\t? {\n\t\t\t\tip: forwardedInfo.ip ?? requestInfo?.ip,\n\t\t\t\tuserAgent: forwardedInfo.userAgent ?? requestInfo?.userAgent,\n\t\t\t}\n\t\t\t: requestInfo\n\n\t\t// Re-validate IdP-backed sessions against their identity provider (A24). In the\n\t\t// default `background` mode this returns immediately and revalidates after the\n\t\t// response (revocation lands on the next request); in `blocking` mode it can revoke\n\t\t// the current request. No-op for password sessions and IdPs without revalidation.\n\t\t// `effectiveInfo` is passed so the audit entries record the originating request's IP/UA.\n\t\tif (this.idpSessionRevalidator) {\n\t\t\tconst outcome = await this.idpSessionRevalidator.revalidate(dbContext, readDbContext, apiKeyRow, effectiveInfo)\n\t\t\tif (outcome === 'revoked') {\n\t\t\t\treturn new ResponseError(VerifyErrorCode.DISABLED, 'IdP session was revoked')\n\t\t\t}\n\t\t}\n\n\t\t// Detached (runs after the response), so a rejection here would be an unhandledRejection and can take the\n\t\t// worker down. Tracking is best-effort — the next request writes it again.\n\t\tsetImmediate(() => {\n\t\t\tdbContext.commandBus.execute(\n\t\t\t\tnew ProlongApiKeyCommand(\n\t\t\t\t\tapiKeyRow.id,\n\t\t\t\t\tapiKeyRow.type,\n\t\t\t\t\tapiKeyRow.expiration,\n\t\t\t\t\tapiKeyRow.expires_at,\n\t\t\t\t\teffectiveInfo,\n\t\t\t\t\t{\n\t\t\t\t\t\tlastIp: apiKeyRow.last_ip,\n\t\t\t\t\t\tlastUserAgent: apiKeyRow.last_user_agent,\n\t\t\t\t\t\tlastUsedAt: apiKeyRow.last_used_at,\n\t\t\t\t\t},\n\t\t\t\t\tapiKeyRow.max_expires_at,\n\t\t\t\t),\n\t\t\t).catch(() => {})\n\t\t})\n\n\t\treturn new ResponseOk(\n\t\t\tnew VerifyResult(\n\t\t\t\tapiKeyRow.identity_id,\n\t\t\t\tapiKeyRow.id,\n\t\t\t\tapiKeyRow.roles,\n\t\t\t\tapiKeyRow.person_id,\n\t\t\t\tapiKeyRow.trust_forwarded_info,\n\t\t\t),\n\t\t)\n\t}\n\n\tasync createSessionApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\texpiration?: number,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<string> {\n\t\tconst { token } = await this.createSessionApiKeyWithId(dbContext, identityId, expiration, requestInfo, trustForwardedInfo)\n\t\treturn token\n\t}\n\n\t/**\n\t * Like {@link createSessionApiKey} but also returns the api_key id — needed when the\n\t * caller has to bind another row to the session (e.g. an `idp_session` for IdP\n\t * re-validation).\n\t */\n\tasync createSessionApiKeyWithId(\n\t\tdbContext: DatabaseContext,\n\t\tidentityId: string,\n\t\texpiration?: number,\n\t\trequestInfo?: ApiKeyRequestInfo,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<{ id: string; token: string }> {\n\t\tconst config = await dbContext.queryHandler.fetch(new ConfigurationQuery(dbContext.providers))\n\n\t\t// A19: snapshot the effective session policy onto the api_key at sign-in.\n\t\t// With no matching policy, every field is null/baseline and the result is\n\t\t// byte-for-byte today's behavior.\n\t\tconst [identityRow] = await dbContext.queryHandler.fetch(new IdentityQuery([identityId]))\n\t\tconst globalRoles = identityRow?.roles ?? []\n\t\tconst policy = await this.authPolicyResolver.resolveForIdentity(dbContext, identityId, globalRoles)\n\n\t\tconst defaultExpirationMinutes = intervalToSeconds(config.login.defaultTokenExpiration) / 60\n\t\t// remember_me_allowed === false: ignore a client-supplied longer lifetime and\n\t\t// force the default. (true/null leave the requested expiration untouched.)\n\t\tconst requestedMinutes = policy.rememberMeAllowed === false\n\t\t\t? defaultExpirationMinutes\n\t\t\t: (expiration ?? defaultExpirationMinutes)\n\n\t\t// Cap by maxTokenExpiration (existing behavior) AND by the policy's\n\t\t// tokenExpiration (A19) — strictest wins.\n\t\tlet expirationCapped = config.login.maxTokenExpiration\n\t\t\t? Math.min(requestedMinutes, intervalToSeconds(config.login.maxTokenExpiration) / 60)\n\t\t\t: requestedMinutes\n\t\tif (policy.tokenExpiration) {\n\t\t\texpirationCapped = Math.min(expirationCapped, intervalToSeconds(policy.tokenExpiration) / 60)\n\t\t}\n\n\t\t// Absolute hard cap: issued_at + policy.tokenExpiration. NULL = uncapped\n\t\t// sliding window (today's behavior).\n\t\tconst issuedAt = dbContext.providers.now()\n\t\tconst maxExpiresAt = policy.tokenExpiration\n\t\t\t? new Date(issuedAt.getTime() + intervalToSeconds(policy.tokenExpiration) * 1000)\n\t\t\t: null\n\n\t\tconst command = new CreateApiKeyCommand({\n\t\t\ttype: ApiKey.Type.SESSION,\n\t\t\tidentityId,\n\t\t\texpiration: expirationCapped,\n\t\t\trequestInfo,\n\t\t\ttrustForwardedInfo,\n\t\t\tidleTimeout: policy.idleTimeout ? intervalToPostgres(policy.idleTimeout) : null,\n\t\t\tmaxExpiresAt,\n\t\t})\n\t\tconst { id, token } = await dbContext.commandBus.execute(command)\n\t\tassert(token !== undefined)\n\n\t\t// A19: audit only when a policy is actually in effect. With zero auth_policy\n\t\t// rows the resolved policy is inert and no extra insert happens.\n\t\tconst policyApplied = policy.mfaRequired === true\n\t\t\t|| policy.tokenExpiration !== null\n\t\t\t|| policy.idleTimeout !== null\n\t\t\t|| policy.rememberMeAllowed !== null\n\t\tif (policyApplied) {\n\t\t\ttry {\n\t\t\t\tawait this.authLogService.logSessionEvent(dbContext, {\n\t\t\t\t\ttype: 'session_policy_applied',\n\t\t\t\t\tidentityId,\n\t\t\t\t\tipAddress: requestInfo?.ip,\n\t\t\t\t\tuserAgent: requestInfo?.userAgent,\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\teventData: {\n\t\t\t\t\t\ttokenExpiration: policy.tokenExpiration ? intervalToPostgres(policy.tokenExpiration) : null,\n\t\t\t\t\t\tidleTimeout: policy.idleTimeout ? intervalToPostgres(policy.idleTimeout) : null,\n\t\t\t\t\t\trememberMeAllowed: policy.rememberMeAllowed,\n\t\t\t\t\t\tmfaRequired: policy.mfaRequired,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch {\n\t\t\t\t/* best-effort: sign-in must not break on an audit failure */\n\t\t\t}\n\t\t}\n\n\t\treturn { id, token }\n\t}\n\n\tasync findApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<ApiKeyRow | null> {\n\t\treturn await dbContext.queryHandler.fetch(\n\t\t\tnew ApiKeyByIdQuery(apiKeyId),\n\t\t)\n\t}\n\n\tasync disableOneOffApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new DisableOneOffApiKeyCommand(apiKeyId))\n\t}\n\n\tasync disableApiKey(dbContext: DatabaseContext, apiKeyId: string): Promise<boolean> {\n\t\treturn await dbContext.commandBus.execute(new DisableApiKeyCommand(apiKeyId))\n\t}\n\n\tasync disableIdentityApiKeys(dbContext: DatabaseContext, identityId: string): Promise<void> {\n\t\tawait dbContext.commandBus.execute(new DisableIdentityApiKeysCommand(identityId))\n\t}\n\n\tasync createGlobalPermanentApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tdescription: string,\n\t\troles: readonly string[],\n\t\ttokenHash?: TokenHash,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateApiKeyResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await this.apiKeyService.createPermanentApiKey(db, description, roles, tokenHash, trustForwardedInfo)\n\t\t})\n\t}\n\n\tasync createProjectPermanentApiKey(\n\t\tdbContext: DatabaseContext,\n\t\tprojectId: string,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tdescription: string,\n\t\ttokenHash?: TokenHash,\n\t\ttrustForwardedInfo?: boolean,\n\t): Promise<CreateApiKeyResponse> {\n\t\treturn await dbContext.transaction(async db => {\n\t\t\treturn await this.apiKeyService.createProjectPermanentApiKey(db, projectId, memberships, description, tokenHash, trustForwardedInfo)\n\t\t})\n\t}\n}\n\nexport type VerifyResponse = Response<VerifyResult, VerifyErrorCode>\n\nexport class VerifyResult {\n\treadonly valid = true\n\n\tconstructor(\n\t\tpublic readonly identityId: string,\n\t\tpublic readonly apiKeyId: string,\n\t\tpublic readonly roles: string[],\n\t\tpublic readonly personId: string | null,\n\t\tpublic readonly trustForwardedInfo: boolean = false,\n\t) {}\n}\n\nexport enum VerifyErrorCode {\n\tNOT_FOUND = 'not_found',\n\tDISABLED = 'disabled',\n\tEXPIRED = 'expired',\n\tNO_AUTH_HEADER = 'no_auth_header',\n\tINVALID_AUTH_HEADER = 'invalid_auth_header',\n}\n"],"names":["VerifyErrorCode"],"mappings":"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"}
@@ -14,6 +14,10 @@ var __defProp = Object.defineProperty;
14
14
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15
15
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
16
16
  const UNPERSISTED_ROOT_IDENTITY_ID = "f3b2c4d6-0000-4000-8000-000000000001";
17
+ const UNPERSISTED_LOGIN_IDENTITY_ID = "f3b2c4d6-0000-4000-8000-000000000002";
18
+ const unpersistedIdentityIds = /* @__PURE__ */ new Set([UNPERSISTED_ROOT_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID]);
19
+ const isUnpersistedIdentityId = (identityId) => identityId !== void 0 && unpersistedIdentityIds.has(identityId);
20
+ const createUnpersistedLoginVerifyResult = () => new ApiKeyManager.VerifyResult(UNPERSISTED_LOGIN_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID, [Roles.TenantRole.LOGIN], null, false);
17
21
  class UnpersistedApiKeyManager {
18
22
  constructor(apiKeys = []) {
19
23
  __publicField(this, "apiKeys");
@@ -77,6 +81,9 @@ class UnpersistedApiKeyManager {
77
81
  return new UnpersistedApiKeyManager(hashes.map((it) => UnpersistedApiKeyManager.createRootApiKey(it)));
78
82
  }
79
83
  }
84
+ exports.UNPERSISTED_LOGIN_IDENTITY_ID = UNPERSISTED_LOGIN_IDENTITY_ID;
80
85
  exports.UNPERSISTED_ROOT_IDENTITY_ID = UNPERSISTED_ROOT_IDENTITY_ID;
81
86
  exports.UnpersistedApiKeyManager = UnpersistedApiKeyManager;
87
+ exports.createUnpersistedLoginVerifyResult = createUnpersistedLoginVerifyResult;
88
+ exports.isUnpersistedIdentityId = isUnpersistedIdentityId;
82
89
  //# sourceMappingURL=UnpersistedApiKeyManager.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnpersistedApiKeyManager.cjs","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/UnpersistedApiKeyManager.ts"],"sourcesContent":["import { computeTokenHash, isTokenHash, timingSafeCompareHash, TokenHash } from '../../utils/index.js'\nimport { TenantRole } from '../../authorization/index.js'\nimport { VerifyResult } from './ApiKeyManager.js'\n\n/**\n * Well-known identity id used for super-admin identities authenticated via an\n * unpersisted (configured) root token. The id is stable so that audit logs and\n * created entities consistently reference the same virtual identity, even\n * though no row exists in the `identity` table.\n */\nexport const UNPERSISTED_ROOT_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000001'\n\nexport interface UnpersistedApiKey {\n\treadonly tokenHash: TokenHash\n\treadonly identityId: string\n\treadonly roles: readonly string[]\n}\n\n/**\n * Verifies incoming tokens against a fixed set of root tokens configured out of\n * band (env/config) instead of being stored in the database. This enables token\n * rotation without database writes and avoids persisting the token hash.\n *\n * Token hashes are compared in constant time to avoid leaking information about\n * the configured secret.\n */\nexport class UnpersistedApiKeyManager {\n\tprivate readonly apiKeys: readonly UnpersistedApiKey[]\n\n\tconstructor(apiKeys: readonly UnpersistedApiKey[] = []) {\n\t\tthis.apiKeys = apiKeys\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.apiKeys.length === 0\n\t}\n\n\tverify(token: string): VerifyResult | null {\n\t\tif (this.apiKeys.length === 0) {\n\t\t\treturn null\n\t\t}\n\t\tconst tokenHash = computeTokenHash(token)\n\t\t// Iterate over all configured keys (no early return) so that matching\n\t\t// remains independent of the position of the matching key.\n\t\tlet matched: UnpersistedApiKey | null = null\n\t\tfor (const apiKey of this.apiKeys) {\n\t\t\tif (timingSafeCompareHash(tokenHash, apiKey.tokenHash)) {\n\t\t\t\tmatched = apiKey\n\t\t\t}\n\t\t}\n\t\tif (matched === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn new VerifyResult(\n\t\t\tmatched.identityId,\n\t\t\t// There is no persisted api_key row, so there is no api key id.\n\t\t\tmatched.identityId,\n\t\t\t[...matched.roles],\n\t\t\tnull,\n\t\t\tfalse,\n\t\t)\n\t}\n\n\tstatic createRootApiKey(tokenHash: TokenHash): UnpersistedApiKey {\n\t\treturn {\n\t\t\ttokenHash,\n\t\t\tidentityId: UNPERSISTED_ROOT_IDENTITY_ID,\n\t\t\troles: [TenantRole.SUPER_ADMIN],\n\t\t}\n\t}\n\n\t/**\n\t * Builds a manager for unpersisted super-admin root tokens from configured\n\t * plain tokens and/or pre-computed token hashes.\n\t */\n\tstatic createForRootTokens(input: {\n\t\ttokens?: readonly string[]\n\t\ttokenHashes?: readonly string[]\n\t}): UnpersistedApiKeyManager {\n\t\tconst hashes: TokenHash[] = []\n\t\tfor (const token of input.tokens ?? []) {\n\t\t\tif (token.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\thashes.push(computeTokenHash(token))\n\t\t}\n\t\tfor (const hash of input.tokenHashes ?? []) {\n\t\t\tif (hash.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst normalized = hash.toLowerCase()\n\t\t\tif (!isTokenHash(normalized)) {\n\t\t\t\tthrow new Error(`Invalid unpersisted root token hash: expected a 64-character sha256 hex string.`)\n\t\t\t}\n\t\t\thashes.push(normalized)\n\t\t}\n\t\treturn new UnpersistedApiKeyManager(hashes.map(it => UnpersistedApiKeyManager.createRootApiKey(it)))\n\t}\n}\n"],"names":["token","computeTokenHash","timingSafeCompareHash","VerifyResult","TenantRole","isTokenHash"],"mappings":";;;;;;;;;;;;;;;AAUO,MAAM,+BAA+B;AAgBrC,MAAM,yBAAyB;AAAA,EAGrC,YAAY,UAAwC,IAAI;AAFxD,kBAAA,MAAiB,SAAA;AAGhB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,OAAOA,SAAoC;AAC1C,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AACA,UAAM,YAAYC,MAAAA,iBAAiBD,OAAK;AAGxC,QAAI,UAAoC;AACxC,eAAW,UAAU,KAAK,SAAS;AAClC,UAAIE,4BAAsB,WAAW,OAAO,SAAS,GAAG;AACvD,kBAAU;AAAA,MACX;AAAA,IACD;AACA,QAAI,YAAY,MAAM;AACrB,aAAO;AAAA,IACR;AACA,WAAO,IAAIC,cAAAA;AAAAA,MACV,QAAQ;AAAA;AAAA,MAER,QAAQ;AAAA,MACR,CAAC,GAAG,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,OAAO,iBAAiB,WAAyC;AAChE,WAAO;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAACC,MAAAA,WAAW,WAAW;AAAA,IAAA;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,oBAAoB,OAGE;AAC5B,UAAM,SAAsB,CAAA;AAC5B,eAAWJ,WAAS,MAAM,UAAU,CAAA,GAAI;AACvC,UAAIA,QAAM,WAAW,GAAG;AACvB;AAAA,MACD;AACA,aAAO,KAAKC,uBAAiBD,OAAK,CAAC;AAAA,IACpC;AACA,eAAW,QAAQ,MAAM,eAAe,CAAA,GAAI;AAC3C,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,YAAM,aAAa,KAAK,YAAA;AACxB,UAAI,CAACK,MAAAA,YAAY,UAAU,GAAG;AAC7B,cAAM,IAAI,MAAM,iFAAiF;AAAA,MAClG;AACA,aAAO,KAAK,UAAU;AAAA,IACvB;AACA,WAAO,IAAI,yBAAyB,OAAO,IAAI,QAAM,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;AAAA,EACpG;AACD;;;"}
1
+ {"version":3,"file":"UnpersistedApiKeyManager.cjs","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/UnpersistedApiKeyManager.ts"],"sourcesContent":["import { computeTokenHash, isTokenHash, timingSafeCompareHash, TokenHash } from '../../utils/index.js'\nimport { TenantRole } from '../../authorization/index.js'\nimport { VerifyResult } from './ApiKeyManager.js'\n\n/**\n * Well-known identity id used for super-admin identities authenticated via an\n * unpersisted (configured) root token. The id is stable so that audit logs and\n * created entities consistently reference the same virtual identity, even\n * though no row exists in the `identity` table.\n */\nexport const UNPERSISTED_ROOT_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000001'\n\n/**\n * Well-known identity id for the pre-sign-in caller of a first-party UI served by the engine (the\n * management panel's login screen). It holds exactly {@link TenantRole.LOGIN} and exists only in\n * memory, so the surface it opens is fixed by this file rather than by whatever token an operator\n * happened to configure.\n */\nexport const UNPERSISTED_LOGIN_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000002'\n\nconst unpersistedIdentityIds: ReadonlySet<string> = new Set([UNPERSISTED_ROOT_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID])\n\n/**\n * Whether an identity id is one of the virtual identities above, i.e. has no row in `identity`.\n * Anything writing a foreign key to `identity` must ask first — see `AuthLogService`.\n */\nexport const isUnpersistedIdentityId = (identityId: string | undefined): boolean => identityId !== undefined && unpersistedIdentityIds.has(identityId)\n\n/**\n * The pre-sign-in caller of an engine-served UI, as an already-verified result. There is no token to\n * present: the surface is reached by being routed there, so nothing is compared and nothing is read\n * from the database.\n */\nexport const createUnpersistedLoginVerifyResult = (): VerifyResult =>\n\tnew VerifyResult(UNPERSISTED_LOGIN_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID, [TenantRole.LOGIN], null, false)\n\nexport interface UnpersistedApiKey {\n\treadonly tokenHash: TokenHash\n\treadonly identityId: string\n\treadonly roles: readonly string[]\n}\n\n/**\n * Verifies incoming tokens against a fixed set of root tokens configured out of\n * band (env/config) instead of being stored in the database. This enables token\n * rotation without database writes and avoids persisting the token hash.\n *\n * Token hashes are compared in constant time to avoid leaking information about\n * the configured secret.\n */\nexport class UnpersistedApiKeyManager {\n\tprivate readonly apiKeys: readonly UnpersistedApiKey[]\n\n\tconstructor(apiKeys: readonly UnpersistedApiKey[] = []) {\n\t\tthis.apiKeys = apiKeys\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.apiKeys.length === 0\n\t}\n\n\tverify(token: string): VerifyResult | null {\n\t\tif (this.apiKeys.length === 0) {\n\t\t\treturn null\n\t\t}\n\t\tconst tokenHash = computeTokenHash(token)\n\t\t// Iterate over all configured keys (no early return) so that matching\n\t\t// remains independent of the position of the matching key.\n\t\tlet matched: UnpersistedApiKey | null = null\n\t\tfor (const apiKey of this.apiKeys) {\n\t\t\tif (timingSafeCompareHash(tokenHash, apiKey.tokenHash)) {\n\t\t\t\tmatched = apiKey\n\t\t\t}\n\t\t}\n\t\tif (matched === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn new VerifyResult(\n\t\t\tmatched.identityId,\n\t\t\t// There is no persisted api_key row, so there is no api key id.\n\t\t\tmatched.identityId,\n\t\t\t[...matched.roles],\n\t\t\tnull,\n\t\t\tfalse,\n\t\t)\n\t}\n\n\tstatic createRootApiKey(tokenHash: TokenHash): UnpersistedApiKey {\n\t\treturn {\n\t\t\ttokenHash,\n\t\t\tidentityId: UNPERSISTED_ROOT_IDENTITY_ID,\n\t\t\troles: [TenantRole.SUPER_ADMIN],\n\t\t}\n\t}\n\n\t/**\n\t * Builds a manager for unpersisted super-admin root tokens from configured\n\t * plain tokens and/or pre-computed token hashes.\n\t */\n\tstatic createForRootTokens(input: {\n\t\ttokens?: readonly string[]\n\t\ttokenHashes?: readonly string[]\n\t}): UnpersistedApiKeyManager {\n\t\tconst hashes: TokenHash[] = []\n\t\tfor (const token of input.tokens ?? []) {\n\t\t\tif (token.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\thashes.push(computeTokenHash(token))\n\t\t}\n\t\tfor (const hash of input.tokenHashes ?? []) {\n\t\t\tif (hash.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst normalized = hash.toLowerCase()\n\t\t\tif (!isTokenHash(normalized)) {\n\t\t\t\tthrow new Error(`Invalid unpersisted root token hash: expected a 64-character sha256 hex string.`)\n\t\t\t}\n\t\t\thashes.push(normalized)\n\t\t}\n\t\treturn new UnpersistedApiKeyManager(hashes.map(it => UnpersistedApiKeyManager.createRootApiKey(it)))\n\t}\n}\n"],"names":["VerifyResult","TenantRole","token","computeTokenHash","timingSafeCompareHash","isTokenHash"],"mappings":";;;;;;;;;;;;;;;AAUO,MAAM,+BAA+B;AAQrC,MAAM,gCAAgC;AAE7C,MAAM,yBAA8C,oBAAI,IAAI,CAAC,8BAA8B,6BAA6B,CAAC;AAMlH,MAAM,0BAA0B,CAAC,eAA4C,eAAe,UAAa,uBAAuB,IAAI,UAAU;AAO9I,MAAM,qCAAqC,MACjD,IAAIA,cAAAA,aAAa,+BAA+B,+BAA+B,CAACC,iBAAW,KAAK,GAAG,MAAM,KAAK;AAgBxG,MAAM,yBAAyB;AAAA,EAGrC,YAAY,UAAwC,IAAI;AAFxD,kBAAA,MAAiB,SAAA;AAGhB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,OAAOC,SAAoC;AAC1C,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AACA,UAAM,YAAYC,MAAAA,iBAAiBD,OAAK;AAGxC,QAAI,UAAoC;AACxC,eAAW,UAAU,KAAK,SAAS;AAClC,UAAIE,4BAAsB,WAAW,OAAO,SAAS,GAAG;AACvD,kBAAU;AAAA,MACX;AAAA,IACD;AACA,QAAI,YAAY,MAAM;AACrB,aAAO;AAAA,IACR;AACA,WAAO,IAAIJ,cAAAA;AAAAA,MACV,QAAQ;AAAA;AAAA,MAER,QAAQ;AAAA,MACR,CAAC,GAAG,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,OAAO,iBAAiB,WAAyC;AAChE,WAAO;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAACC,MAAAA,WAAW,WAAW;AAAA,IAAA;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,oBAAoB,OAGE;AAC5B,UAAM,SAAsB,CAAA;AAC5B,eAAWC,WAAS,MAAM,UAAU,CAAA,GAAI;AACvC,UAAIA,QAAM,WAAW,GAAG;AACvB;AAAA,MACD;AACA,aAAO,KAAKC,uBAAiBD,OAAK,CAAC;AAAA,IACpC;AACA,eAAW,QAAQ,MAAM,eAAe,CAAA,GAAI;AAC3C,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,YAAM,aAAa,KAAK,YAAA;AACxB,UAAI,CAACG,MAAAA,YAAY,UAAU,GAAG;AAC7B,cAAM,IAAI,MAAM,iFAAiF;AAAA,MAClG;AACA,aAAO,KAAK,UAAU;AAAA,IACvB;AACA,WAAO,IAAI,yBAAyB,OAAO,IAAI,QAAM,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;AAAA,EACpG;AACD;;;;;;"}
@@ -12,6 +12,10 @@ var __defProp = Object.defineProperty;
12
12
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
13
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
14
14
  const UNPERSISTED_ROOT_IDENTITY_ID = "f3b2c4d6-0000-4000-8000-000000000001";
15
+ const UNPERSISTED_LOGIN_IDENTITY_ID = "f3b2c4d6-0000-4000-8000-000000000002";
16
+ const unpersistedIdentityIds = /* @__PURE__ */ new Set([UNPERSISTED_ROOT_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID]);
17
+ const isUnpersistedIdentityId = (identityId) => identityId !== void 0 && unpersistedIdentityIds.has(identityId);
18
+ const createUnpersistedLoginVerifyResult = () => new VerifyResult(UNPERSISTED_LOGIN_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID, [TenantRole.LOGIN], null, false);
15
19
  class UnpersistedApiKeyManager {
16
20
  constructor(apiKeys = []) {
17
21
  __publicField(this, "apiKeys");
@@ -76,7 +80,10 @@ class UnpersistedApiKeyManager {
76
80
  }
77
81
  }
78
82
  export {
83
+ UNPERSISTED_LOGIN_IDENTITY_ID,
79
84
  UNPERSISTED_ROOT_IDENTITY_ID,
80
- UnpersistedApiKeyManager
85
+ UnpersistedApiKeyManager,
86
+ createUnpersistedLoginVerifyResult,
87
+ isUnpersistedIdentityId
81
88
  };
82
89
  //# sourceMappingURL=UnpersistedApiKeyManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UnpersistedApiKeyManager.js","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/UnpersistedApiKeyManager.ts"],"sourcesContent":["import { computeTokenHash, isTokenHash, timingSafeCompareHash, TokenHash } from '../../utils/index.js'\nimport { TenantRole } from '../../authorization/index.js'\nimport { VerifyResult } from './ApiKeyManager.js'\n\n/**\n * Well-known identity id used for super-admin identities authenticated via an\n * unpersisted (configured) root token. The id is stable so that audit logs and\n * created entities consistently reference the same virtual identity, even\n * though no row exists in the `identity` table.\n */\nexport const UNPERSISTED_ROOT_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000001'\n\nexport interface UnpersistedApiKey {\n\treadonly tokenHash: TokenHash\n\treadonly identityId: string\n\treadonly roles: readonly string[]\n}\n\n/**\n * Verifies incoming tokens against a fixed set of root tokens configured out of\n * band (env/config) instead of being stored in the database. This enables token\n * rotation without database writes and avoids persisting the token hash.\n *\n * Token hashes are compared in constant time to avoid leaking information about\n * the configured secret.\n */\nexport class UnpersistedApiKeyManager {\n\tprivate readonly apiKeys: readonly UnpersistedApiKey[]\n\n\tconstructor(apiKeys: readonly UnpersistedApiKey[] = []) {\n\t\tthis.apiKeys = apiKeys\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.apiKeys.length === 0\n\t}\n\n\tverify(token: string): VerifyResult | null {\n\t\tif (this.apiKeys.length === 0) {\n\t\t\treturn null\n\t\t}\n\t\tconst tokenHash = computeTokenHash(token)\n\t\t// Iterate over all configured keys (no early return) so that matching\n\t\t// remains independent of the position of the matching key.\n\t\tlet matched: UnpersistedApiKey | null = null\n\t\tfor (const apiKey of this.apiKeys) {\n\t\t\tif (timingSafeCompareHash(tokenHash, apiKey.tokenHash)) {\n\t\t\t\tmatched = apiKey\n\t\t\t}\n\t\t}\n\t\tif (matched === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn new VerifyResult(\n\t\t\tmatched.identityId,\n\t\t\t// There is no persisted api_key row, so there is no api key id.\n\t\t\tmatched.identityId,\n\t\t\t[...matched.roles],\n\t\t\tnull,\n\t\t\tfalse,\n\t\t)\n\t}\n\n\tstatic createRootApiKey(tokenHash: TokenHash): UnpersistedApiKey {\n\t\treturn {\n\t\t\ttokenHash,\n\t\t\tidentityId: UNPERSISTED_ROOT_IDENTITY_ID,\n\t\t\troles: [TenantRole.SUPER_ADMIN],\n\t\t}\n\t}\n\n\t/**\n\t * Builds a manager for unpersisted super-admin root tokens from configured\n\t * plain tokens and/or pre-computed token hashes.\n\t */\n\tstatic createForRootTokens(input: {\n\t\ttokens?: readonly string[]\n\t\ttokenHashes?: readonly string[]\n\t}): UnpersistedApiKeyManager {\n\t\tconst hashes: TokenHash[] = []\n\t\tfor (const token of input.tokens ?? []) {\n\t\t\tif (token.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\thashes.push(computeTokenHash(token))\n\t\t}\n\t\tfor (const hash of input.tokenHashes ?? []) {\n\t\t\tif (hash.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst normalized = hash.toLowerCase()\n\t\t\tif (!isTokenHash(normalized)) {\n\t\t\t\tthrow new Error(`Invalid unpersisted root token hash: expected a 64-character sha256 hex string.`)\n\t\t\t}\n\t\t\thashes.push(normalized)\n\t\t}\n\t\treturn new UnpersistedApiKeyManager(hashes.map(it => UnpersistedApiKeyManager.createRootApiKey(it)))\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAUO,MAAM,+BAA+B;AAgBrC,MAAM,yBAAyB;AAAA,EAGrC,YAAY,UAAwC,IAAI;AAFxD,kBAAA,MAAiB,SAAA;AAGhB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,OAAO,OAAoC;AAC1C,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AACA,UAAM,YAAY,iBAAiB,KAAK;AAGxC,QAAI,UAAoC;AACxC,eAAW,UAAU,KAAK,SAAS;AAClC,UAAI,sBAAsB,WAAW,OAAO,SAAS,GAAG;AACvD,kBAAU;AAAA,MACX;AAAA,IACD;AACA,QAAI,YAAY,MAAM;AACrB,aAAO;AAAA,IACR;AACA,WAAO,IAAI;AAAA,MACV,QAAQ;AAAA;AAAA,MAER,QAAQ;AAAA,MACR,CAAC,GAAG,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,OAAO,iBAAiB,WAAyC;AAChE,WAAO;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAAC,WAAW,WAAW;AAAA,IAAA;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,oBAAoB,OAGE;AAC5B,UAAM,SAAsB,CAAA;AAC5B,eAAW,SAAS,MAAM,UAAU,CAAA,GAAI;AACvC,UAAI,MAAM,WAAW,GAAG;AACvB;AAAA,MACD;AACA,aAAO,KAAK,iBAAiB,KAAK,CAAC;AAAA,IACpC;AACA,eAAW,QAAQ,MAAM,eAAe,CAAA,GAAI;AAC3C,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,YAAM,aAAa,KAAK,YAAA;AACxB,UAAI,CAAC,YAAY,UAAU,GAAG;AAC7B,cAAM,IAAI,MAAM,iFAAiF;AAAA,MAClG;AACA,aAAO,KAAK,UAAU;AAAA,IACvB;AACA,WAAO,IAAI,yBAAyB,OAAO,IAAI,QAAM,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;AAAA,EACpG;AACD;"}
1
+ {"version":3,"file":"UnpersistedApiKeyManager.js","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/apiKey/UnpersistedApiKeyManager.ts"],"sourcesContent":["import { computeTokenHash, isTokenHash, timingSafeCompareHash, TokenHash } from '../../utils/index.js'\nimport { TenantRole } from '../../authorization/index.js'\nimport { VerifyResult } from './ApiKeyManager.js'\n\n/**\n * Well-known identity id used for super-admin identities authenticated via an\n * unpersisted (configured) root token. The id is stable so that audit logs and\n * created entities consistently reference the same virtual identity, even\n * though no row exists in the `identity` table.\n */\nexport const UNPERSISTED_ROOT_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000001'\n\n/**\n * Well-known identity id for the pre-sign-in caller of a first-party UI served by the engine (the\n * management panel's login screen). It holds exactly {@link TenantRole.LOGIN} and exists only in\n * memory, so the surface it opens is fixed by this file rather than by whatever token an operator\n * happened to configure.\n */\nexport const UNPERSISTED_LOGIN_IDENTITY_ID = 'f3b2c4d6-0000-4000-8000-000000000002'\n\nconst unpersistedIdentityIds: ReadonlySet<string> = new Set([UNPERSISTED_ROOT_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID])\n\n/**\n * Whether an identity id is one of the virtual identities above, i.e. has no row in `identity`.\n * Anything writing a foreign key to `identity` must ask first — see `AuthLogService`.\n */\nexport const isUnpersistedIdentityId = (identityId: string | undefined): boolean => identityId !== undefined && unpersistedIdentityIds.has(identityId)\n\n/**\n * The pre-sign-in caller of an engine-served UI, as an already-verified result. There is no token to\n * present: the surface is reached by being routed there, so nothing is compared and nothing is read\n * from the database.\n */\nexport const createUnpersistedLoginVerifyResult = (): VerifyResult =>\n\tnew VerifyResult(UNPERSISTED_LOGIN_IDENTITY_ID, UNPERSISTED_LOGIN_IDENTITY_ID, [TenantRole.LOGIN], null, false)\n\nexport interface UnpersistedApiKey {\n\treadonly tokenHash: TokenHash\n\treadonly identityId: string\n\treadonly roles: readonly string[]\n}\n\n/**\n * Verifies incoming tokens against a fixed set of root tokens configured out of\n * band (env/config) instead of being stored in the database. This enables token\n * rotation without database writes and avoids persisting the token hash.\n *\n * Token hashes are compared in constant time to avoid leaking information about\n * the configured secret.\n */\nexport class UnpersistedApiKeyManager {\n\tprivate readonly apiKeys: readonly UnpersistedApiKey[]\n\n\tconstructor(apiKeys: readonly UnpersistedApiKey[] = []) {\n\t\tthis.apiKeys = apiKeys\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.apiKeys.length === 0\n\t}\n\n\tverify(token: string): VerifyResult | null {\n\t\tif (this.apiKeys.length === 0) {\n\t\t\treturn null\n\t\t}\n\t\tconst tokenHash = computeTokenHash(token)\n\t\t// Iterate over all configured keys (no early return) so that matching\n\t\t// remains independent of the position of the matching key.\n\t\tlet matched: UnpersistedApiKey | null = null\n\t\tfor (const apiKey of this.apiKeys) {\n\t\t\tif (timingSafeCompareHash(tokenHash, apiKey.tokenHash)) {\n\t\t\t\tmatched = apiKey\n\t\t\t}\n\t\t}\n\t\tif (matched === null) {\n\t\t\treturn null\n\t\t}\n\t\treturn new VerifyResult(\n\t\t\tmatched.identityId,\n\t\t\t// There is no persisted api_key row, so there is no api key id.\n\t\t\tmatched.identityId,\n\t\t\t[...matched.roles],\n\t\t\tnull,\n\t\t\tfalse,\n\t\t)\n\t}\n\n\tstatic createRootApiKey(tokenHash: TokenHash): UnpersistedApiKey {\n\t\treturn {\n\t\t\ttokenHash,\n\t\t\tidentityId: UNPERSISTED_ROOT_IDENTITY_ID,\n\t\t\troles: [TenantRole.SUPER_ADMIN],\n\t\t}\n\t}\n\n\t/**\n\t * Builds a manager for unpersisted super-admin root tokens from configured\n\t * plain tokens and/or pre-computed token hashes.\n\t */\n\tstatic createForRootTokens(input: {\n\t\ttokens?: readonly string[]\n\t\ttokenHashes?: readonly string[]\n\t}): UnpersistedApiKeyManager {\n\t\tconst hashes: TokenHash[] = []\n\t\tfor (const token of input.tokens ?? []) {\n\t\t\tif (token.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\thashes.push(computeTokenHash(token))\n\t\t}\n\t\tfor (const hash of input.tokenHashes ?? []) {\n\t\t\tif (hash.length === 0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst normalized = hash.toLowerCase()\n\t\t\tif (!isTokenHash(normalized)) {\n\t\t\t\tthrow new Error(`Invalid unpersisted root token hash: expected a 64-character sha256 hex string.`)\n\t\t\t}\n\t\t\thashes.push(normalized)\n\t\t}\n\t\treturn new UnpersistedApiKeyManager(hashes.map(it => UnpersistedApiKeyManager.createRootApiKey(it)))\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAUO,MAAM,+BAA+B;AAQrC,MAAM,gCAAgC;AAE7C,MAAM,yBAA8C,oBAAI,IAAI,CAAC,8BAA8B,6BAA6B,CAAC;AAMlH,MAAM,0BAA0B,CAAC,eAA4C,eAAe,UAAa,uBAAuB,IAAI,UAAU;AAO9I,MAAM,qCAAqC,MACjD,IAAI,aAAa,+BAA+B,+BAA+B,CAAC,WAAW,KAAK,GAAG,MAAM,KAAK;AAgBxG,MAAM,yBAAyB;AAAA,EAGrC,YAAY,UAAwC,IAAI;AAFxD,kBAAA,MAAiB,SAAA;AAGhB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,QAAQ,WAAW;AAAA,EAChC;AAAA,EAEA,OAAO,OAAoC;AAC1C,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC9B,aAAO;AAAA,IACR;AACA,UAAM,YAAY,iBAAiB,KAAK;AAGxC,QAAI,UAAoC;AACxC,eAAW,UAAU,KAAK,SAAS;AAClC,UAAI,sBAAsB,WAAW,OAAO,SAAS,GAAG;AACvD,kBAAU;AAAA,MACX;AAAA,IACD;AACA,QAAI,YAAY,MAAM;AACrB,aAAO;AAAA,IACR;AACA,WAAO,IAAI;AAAA,MACV,QAAQ;AAAA;AAAA,MAER,QAAQ;AAAA,MACR,CAAC,GAAG,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,OAAO,iBAAiB,WAAyC;AAChE,WAAO;AAAA,MACN;AAAA,MACA,YAAY;AAAA,MACZ,OAAO,CAAC,WAAW,WAAW;AAAA,IAAA;AAAA,EAEhC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,oBAAoB,OAGE;AAC5B,UAAM,SAAsB,CAAA;AAC5B,eAAW,SAAS,MAAM,UAAU,CAAA,GAAI;AACvC,UAAI,MAAM,WAAW,GAAG;AACvB;AAAA,MACD;AACA,aAAO,KAAK,iBAAiB,KAAK,CAAC;AAAA,IACpC;AACA,eAAW,QAAQ,MAAM,eAAe,CAAA,GAAI;AAC3C,UAAI,KAAK,WAAW,GAAG;AACtB;AAAA,MACD;AACA,YAAM,aAAa,KAAK,YAAA;AACxB,UAAI,CAAC,YAAY,UAAU,GAAG;AAC7B,cAAM,IAAI,MAAM,iFAAiF;AAAA,MAClG;AACA,aAAO,KAAK,UAAU;AAAA,IACvB;AACA,WAAO,IAAI,yBAAyB,OAAO,IAAI,QAAM,yBAAyB,iBAAiB,EAAE,CAAC,CAAC;AAAA,EACpG;AACD;"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const Typesafe = require("@contember/typesafe");
4
+ function _interopNamespaceDefault(e) {
5
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
6
+ if (e) {
7
+ for (const k in e) {
8
+ if (k !== "default") {
9
+ const d = Object.getOwnPropertyDescriptor(e, k);
10
+ Object.defineProperty(n, k, d.get ? d : {
11
+ enumerable: true,
12
+ get: () => e[k]
13
+ });
14
+ }
15
+ }
16
+ }
17
+ n.default = e;
18
+ return Object.freeze(n);
19
+ }
20
+ const Typesafe__namespace = /* @__PURE__ */ _interopNamespaceDefault(Typesafe);
21
+ const ClaimValueSource = Typesafe__namespace.noExtraProps(Typesafe__namespace.intersection(
22
+ Typesafe__namespace.object({
23
+ /** Claim to read: the exact name first (URL-namespaced names work), then as a dot-path (e.g. `profile.languages`). */
24
+ claim: Typesafe__namespace.string
25
+ }),
26
+ Typesafe__namespace.partial({
27
+ /** Split each string value on this delimiter (e.g. `,` or ` `): a scalar string claim and every string element of an array claim. A no-op for non-string values. */
28
+ split: Typesafe__namespace.string,
29
+ /** For an array-of-objects claim, take this (dot-path) field from each element. */
30
+ pick: Typesafe__namespace.string,
31
+ /** For an array-of-objects claim, keep only elements whose `field` equals `equals`. */
32
+ where: Typesafe__namespace.noExtraProps(Typesafe__namespace.object({
33
+ field: Typesafe__namespace.string,
34
+ equals: Typesafe__namespace.scalar
35
+ }))
36
+ })
37
+ ));
38
+ const ClaimMappingVariable = Typesafe__namespace.noExtraProps(Typesafe__namespace.intersection(
39
+ Typesafe__namespace.object({
40
+ name: Typesafe__namespace.string
41
+ }),
42
+ Typesafe__namespace.partial({
43
+ /** Constant values, set regardless of any claim (the original static form). */
44
+ values: Typesafe__namespace.array(Typesafe__namespace.string),
45
+ /** Derive (additional) values from a claim. */
46
+ from: ClaimValueSource,
47
+ /** Lookup table applied to each raw value from `from`. A raw value with no entry is dropped unless `passthrough`. */
48
+ map: Typesafe__namespace.record(Typesafe__namespace.string, Typesafe__namespace.array(Typesafe__namespace.string)),
49
+ /** When `true`, a raw value from `from` not present in `map` is set verbatim. See the security note above. */
50
+ passthrough: Typesafe__namespace.boolean,
51
+ /** Allowlist applied to the values derived from `from` (constants in `values` are unaffected). */
52
+ allow: Typesafe__namespace.array(Typesafe__namespace.string)
53
+ })
54
+ ));
55
+ const ClaimMappingMembership = Typesafe__namespace.noExtraProps(Typesafe__namespace.intersection(
56
+ Typesafe__namespace.object({
57
+ project: Typesafe__namespace.string,
58
+ role: Typesafe__namespace.string
59
+ }),
60
+ Typesafe__namespace.partial({
61
+ /**
62
+ * Membership variables to set. Each is constant (`values`, e.g. `[{ name: 'locale', values: ['cs'] }]`)
63
+ * and/or claim-derived (`from`, e.g. map a `languages` claim through a lookup table to locale ids).
64
+ */
65
+ variables: Typesafe__namespace.array(ClaimMappingVariable)
66
+ })
67
+ ));
68
+ const ClaimMappingRule = Typesafe__namespace.noExtraProps(Typesafe__namespace.intersection(
69
+ Typesafe__namespace.object({
70
+ /** Claim/attribute from the IdP response to inspect: the exact name first, then as a dot-path into nested objects. */
71
+ claim: Typesafe__namespace.string
72
+ }),
73
+ Typesafe__namespace.partial({
74
+ /** Match when the claim equals this value (array claims: when it contains this element). */
75
+ equals: Typesafe__namespace.scalar,
76
+ /** Match when the claim contains this value (substring for strings, element for arrays). */
77
+ contains: Typesafe__namespace.scalar,
78
+ /** Project membership to grant when the rule matches. */
79
+ grantMembership: ClaimMappingMembership
80
+ })
81
+ ));
82
+ const ClaimMapping = Typesafe__namespace.intersection(
83
+ Typesafe__namespace.object({
84
+ rules: Typesafe__namespace.array(ClaimMappingRule)
85
+ }),
86
+ Typesafe__namespace.partial({
87
+ /**
88
+ * When to apply the mapping:
89
+ * - `always` (default) — re-sync memberships on every sign-in (and on every OIDC session refresh).
90
+ * - `sticky` — apply only when the account is first created by auto-sign-up; existing
91
+ * accounts (including one being linked to this IdP for the first time) are
92
+ * left untouched.
93
+ */
94
+ syncPolicy: Typesafe__namespace.enumeration("always", "sticky"),
95
+ /**
96
+ * How to treat existing grants the mapping does NOT (re)assign on this sign-in:
97
+ * - `keep` (default, safer) — leave pre-existing memberships untouched.
98
+ * - `remove` — strip memberships that the mapping no longer grants (IdP becomes the source of
99
+ * truth). Only ever touches grants the mapping itself could have made; memberships
100
+ * outside the mapping's vocabulary are never removed.
101
+ */
102
+ unmatched: Typesafe__namespace.enumeration("keep", "remove")
103
+ })
104
+ );
105
+ const DEFAULT_SYNC_POLICY = "always";
106
+ const DEFAULT_UNMATCHED = "keep";
107
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
108
+ const parseClaimMapping = (configuration) => {
109
+ const raw = configuration.claimMapping;
110
+ if (!isRecord(raw) || raw.rules === void 0 || raw.rules === null) {
111
+ return null;
112
+ }
113
+ const input = { rules: raw.rules };
114
+ if (raw.syncPolicy !== void 0) {
115
+ input.syncPolicy = raw.syncPolicy;
116
+ }
117
+ if (raw.unmatched !== void 0) {
118
+ input.unmatched = raw.unmatched;
119
+ }
120
+ return ClaimMapping(input, ["claimMapping"]);
121
+ };
122
+ const REMOVED_RULE_KEYS = ["grantRoles"];
123
+ const findRemovedRuleKeys = (configuration) => {
124
+ const raw = configuration.claimMapping;
125
+ if (!isRecord(raw) || !Array.isArray(raw.rules)) {
126
+ return [];
127
+ }
128
+ const found = /* @__PURE__ */ new Set();
129
+ for (const rule of raw.rules) {
130
+ if (isRecord(rule)) {
131
+ for (const key of REMOVED_RULE_KEYS) {
132
+ if (key in rule) {
133
+ found.add(key);
134
+ }
135
+ }
136
+ }
137
+ }
138
+ return [...found];
139
+ };
140
+ const findClaimMappingShapeErrors = (mapping) => {
141
+ const errors = [];
142
+ for (const rule of mapping.rules) {
143
+ if (rule.grantMembership === void 0) {
144
+ errors.push(
145
+ `claimMapping rule for claim '${rule.claim}' has no 'grantMembership', so it matches but grants nothing; add a 'grantMembership'`
146
+ );
147
+ }
148
+ if (rule.equals !== void 0 && rule.contains !== void 0) {
149
+ errors.push(`claimMapping rule for claim '${rule.claim}' sets both 'equals' and 'contains'; a rule may use at most one`);
150
+ }
151
+ if (typeof rule.equals === "string" && rule.equals.trim() === "") {
152
+ errors.push(
153
+ `claimMapping rule for claim '${rule.claim}' has an empty 'equals' value; omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`
154
+ );
155
+ }
156
+ if (typeof rule.contains === "string" && rule.contains.trim() === "") {
157
+ errors.push(
158
+ `claimMapping rule for claim '${rule.claim}' has an empty 'contains' value, which would substring-match every string value of the claim (a match-everything grant); omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`
159
+ );
160
+ }
161
+ for (const variable of rule.grantMembership?.variables ?? []) {
162
+ if (variable.from?.where !== void 0 && variable.from.pick === void 0) {
163
+ errors.push(
164
+ `claimMapping variable '${variable.name}' uses 'from.where' without 'from.pick'; it can only ever resolve to no values — set 'pick' (the field to take from each matched element)`
165
+ );
166
+ }
167
+ if (variable.from?.split === "") {
168
+ errors.push(
169
+ `claimMapping variable '${variable.name}' has an empty 'from.split' delimiter, which splits every claim value into its individual characters; omit 'split' to keep the value whole, or set a non-empty delimiter`
170
+ );
171
+ }
172
+ }
173
+ }
174
+ return errors;
175
+ };
176
+ exports.ClaimMapping = ClaimMapping;
177
+ exports.ClaimMappingMembership = ClaimMappingMembership;
178
+ exports.ClaimMappingRule = ClaimMappingRule;
179
+ exports.ClaimMappingVariable = ClaimMappingVariable;
180
+ exports.ClaimValueSource = ClaimValueSource;
181
+ exports.DEFAULT_SYNC_POLICY = DEFAULT_SYNC_POLICY;
182
+ exports.DEFAULT_UNMATCHED = DEFAULT_UNMATCHED;
183
+ exports.findClaimMappingShapeErrors = findClaimMappingShapeErrors;
184
+ exports.findRemovedRuleKeys = findRemovedRuleKeys;
185
+ exports.isRecord = isRecord;
186
+ exports.parseClaimMapping = parseClaimMapping;
187
+ //# sourceMappingURL=ClaimMapping.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaimMapping.cjs","sources":["../../../../../../../packages/engine-tenant-api/src/model/service/idp/ClaimMapping.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\n\n/**\n * Provider-agnostic mapping of IdP claims/attributes to Contember project memberships (A09).\n * Stored on an IdP's `configuration.claimMapping`, so it rides inside the existing\n * `identity_provider.configuration` JSONB and needs no schema change — `addIDP` / `updateIDP`\n * already accept an opaque configuration object.\n *\n * The mapping grants **project memberships only** (a project role plus optional membership\n * variables). It deliberately does NOT grant global/tenant roles: those are privilege-bearing\n * and granting them from external claims would be a privilege-escalation path, so global-role\n * mapping was dropped. A project membership stays within what the IdP configurer\n * (`project_admin`, holding `IDP_ADD` / `IDP_UPDATE`) may already grant directly.\n *\n * Coexistence: the OIDC provider also uses `configuration.claimMapping` for an unrelated\n * identity-field remap (`email` / `name` / `externalIdentifier` / `attributesKey`). A09 only\n * looks at the `rules` field, so the two coexist in the same object — {@link parseClaimMapping}\n * returns `null` when no `rules` are present (an OIDC-only remap) instead of rejecting it.\n *\n * Each rule inspects one `claim` from the IdP response (the raw claims flow through verbatim,\n * since `IDPResponse` is `& Record<string, unknown>`) and, when it matches, grants a project\n * membership. Rules are independent and additive — every matching rule contributes; a\n * non-matching rule is simply skipped.\n *\n * Matching is declarative, never code:\n * - `equals` — the claim equals the value (scalar compare; for array claims, the value is one\n * of the elements).\n * - `contains` — the claim contains the value: substring for string claims, membership for array\n * claims. This is the natural fit for multi-valued `groups`.\n * - neither — the rule matches whenever the claim is merely present (and truthy for booleans).\n */\n/**\n * Where a membership variable's values come from when they are not constant. Reads one `claim` from the\n * IdP response — by exact name first (a URL-namespaced claim with literal dots works), then as a dot-path\n * (nested claims like `profile.languages`) — and shapes the raw value(s) into a flat list of strings:\n * - array claim → its elements (`languages: ['cs','en']`)\n * - `split` → split a delimited string claim (`'cs,en'`, OIDC-style `'cs en'`) into elements\n * - `pick` / `where` → for an array-of-objects claim, keep elements matching `where` and take their\n * `pick` field (`orgs: [{ code, role }]` → codes of the elements where role matches)\n *\n * The extracted raw values are then run through {@link ClaimMappingVariable}'s `map` / `passthrough`.\n */\nexport const ClaimValueSource = Typesafe.noExtraProps(Typesafe.intersection(\n\tTypesafe.object({\n\t\t/** Claim to read: the exact name first (URL-namespaced names work), then as a dot-path (e.g. `profile.languages`). */\n\t\tclaim: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\t/** Split each string value on this delimiter (e.g. `,` or ` `): a scalar string claim and every string element of an array claim. A no-op for non-string values. */\n\t\tsplit: Typesafe.string,\n\t\t/** For an array-of-objects claim, take this (dot-path) field from each element. */\n\t\tpick: Typesafe.string,\n\t\t/** For an array-of-objects claim, keep only elements whose `field` equals `equals`. */\n\t\twhere: Typesafe.noExtraProps(Typesafe.object({\n\t\t\tfield: Typesafe.string,\n\t\t\tequals: Typesafe.scalar,\n\t\t})),\n\t}),\n))\n\nexport type ClaimValueSource = ReturnType<typeof ClaimValueSource>\n\n/**\n * One membership variable to set on a granted membership. Either constant (`values`), claim-derived\n * (`from`), or both — the two sets are unioned. When derived from a claim:\n * - `map` — lookup table from a raw claim value to the value(s) actually set, e.g.\n * `{ cs: ['<locale-uuid>'] }`. A raw value absent from the map is dropped…\n * - `passthrough` — …unless `passthrough` is `true`, in which case it is set verbatim. Off by\n * default: raw external claim values then flow straight into row-level ACL\n * variables, so enable it only when the variable legitimately holds claim values\n * (not opaque ids), and prefer `map` / `allow` to bound what an IdP can inject.\n * - `allow` — optional allowlist applied to the claim-derived values (constants are never filtered).\n */\nexport const ClaimMappingVariable = Typesafe.noExtraProps(Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\t/** Constant values, set regardless of any claim (the original static form). */\n\t\tvalues: Typesafe.array(Typesafe.string),\n\t\t/** Derive (additional) values from a claim. */\n\t\tfrom: ClaimValueSource,\n\t\t/** Lookup table applied to each raw value from `from`. A raw value with no entry is dropped unless `passthrough`. */\n\t\tmap: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n\t\t/** When `true`, a raw value from `from` not present in `map` is set verbatim. See the security note above. */\n\t\tpassthrough: Typesafe.boolean,\n\t\t/** Allowlist applied to the values derived from `from` (constants in `values` are unaffected). */\n\t\tallow: Typesafe.array(Typesafe.string),\n\t}),\n))\n\nexport type ClaimMappingVariable = ReturnType<typeof ClaimMappingVariable>\n\nexport const ClaimMappingMembership = Typesafe.noExtraProps(Typesafe.intersection(\n\tTypesafe.object({\n\t\tproject: Typesafe.string,\n\t\trole: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\t/**\n\t\t * Membership variables to set. Each is constant (`values`, e.g. `[{ name: 'locale', values: ['cs'] }]`)\n\t\t * and/or claim-derived (`from`, e.g. map a `languages` claim through a lookup table to locale ids).\n\t\t */\n\t\tvariables: Typesafe.array(ClaimMappingVariable),\n\t}),\n))\n\nexport type ClaimMappingMembership = ReturnType<typeof ClaimMappingMembership>\n\nexport const ClaimMappingRule = Typesafe.noExtraProps(Typesafe.intersection(\n\tTypesafe.object({\n\t\t/** Claim/attribute from the IdP response to inspect: the exact name first, then as a dot-path into nested objects. */\n\t\tclaim: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\t/** Match when the claim equals this value (array claims: when it contains this element). */\n\t\tequals: Typesafe.scalar,\n\t\t/** Match when the claim contains this value (substring for strings, element for arrays). */\n\t\tcontains: Typesafe.scalar,\n\t\t/** Project membership to grant when the rule matches. */\n\t\tgrantMembership: ClaimMappingMembership,\n\t}),\n))\n\nexport type ClaimMappingRule = ReturnType<typeof ClaimMappingRule>\n\n/**\n * The validated A09 mapping. `rules` is required here — {@link parseClaimMapping} only returns a\n * mapping once it has confirmed `rules` is present, and returns `null` otherwise (so an OIDC-only\n * `claimMapping` is treated as \"no role mapping\", not an error).\n */\nexport const ClaimMapping = Typesafe.intersection(\n\tTypesafe.object({\n\t\trules: Typesafe.array(ClaimMappingRule),\n\t}),\n\tTypesafe.partial({\n\t\t/**\n\t\t * When to apply the mapping:\n\t\t * - `always` (default) — re-sync memberships on every sign-in (and on every OIDC session refresh).\n\t\t * - `sticky` — apply only when the account is first created by auto-sign-up; existing\n\t\t * accounts (including one being linked to this IdP for the first time) are\n\t\t * left untouched.\n\t\t */\n\t\tsyncPolicy: Typesafe.enumeration('always', 'sticky'),\n\t\t/**\n\t\t * How to treat existing grants the mapping does NOT (re)assign on this sign-in:\n\t\t * - `keep` (default, safer) — leave pre-existing memberships untouched.\n\t\t * - `remove` — strip memberships that the mapping no longer grants (IdP becomes the source of\n\t\t * truth). Only ever touches grants the mapping itself could have made; memberships\n\t\t * outside the mapping's vocabulary are never removed.\n\t\t */\n\t\tunmatched: Typesafe.enumeration('keep', 'remove'),\n\t}),\n)\n\nexport type ClaimMapping = ReturnType<typeof ClaimMapping>\n\nexport const DEFAULT_SYNC_POLICY: NonNullable<ClaimMapping['syncPolicy']> = 'always'\nexport const DEFAULT_UNMATCHED: NonNullable<ClaimMapping['unmatched']> = 'keep'\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null && !Array.isArray(value)\n\n/**\n * Parse the optional A09 `claimMapping` out of an IdP `configuration` blob. Returns `null` when no\n * A09 mapping is present — either no `claimMapping` at all, or a `claimMapping` that carries no\n * `rules` (e.g. the OIDC identity-field remap, which shares this key). Returning `null` keeps both\n * the pre-A09 sign-in path and the OIDC remap untouched.\n *\n * Only the A09 fields (`rules`, `syncPolicy`, `unmatched`) are validated; any other keys on the\n * `claimMapping` object (the OIDC remap fields) are ignored, so the two features coexist. Throws via\n * Typesafe when `rules` is present but structurally malformed (e.g. a rule missing its required\n * `claim`), so an A09 misconfiguration surfaces loudly rather than silently dropping grants.\n *\n * The nested A09 schemas (rule / membership / variable / value-source) are wrapped in\n * `Typesafe.noExtraProps`, so a typo'd key on any of them (e.g. `grantMembershp`, `equls`) is\n * REJECTED, not silently stripped — a misconfiguration surfaces loudly instead of degrading into a\n * grants-nothing or match-everyone rule. The one exception is the top-level `claimMapping` object\n * itself: it is the key SHARED with the OIDC identity-remap (`email`/`name`/`externalIdentifier`/\n * `attributesKey`), so this parse first projects only the A09 fields (`rules`/`syncPolicy`/`unmatched`)\n * into a fresh object (above) and deliberately does NOT apply `noExtraProps` there — the OIDC remap\n * fields must coexist. The `map` lookup table is likewise a `record` (arbitrary keys are legitimate),\n * not a strict object. The removed `grantRoles` key is still caught separately by\n * {@link findRemovedRuleKeys} (run before this parse) for a clearer message than the generic\n * extra-property error `noExtraProps` would otherwise raise.\n */\nexport const parseClaimMapping = (configuration: Record<string, unknown>): ClaimMapping | null => {\n\tconst raw = configuration.claimMapping\n\tif (!isRecord(raw) || raw.rules === undefined || raw.rules === null) {\n\t\treturn null\n\t}\n\tconst input: Record<string, unknown> = { rules: raw.rules }\n\tif (raw.syncPolicy !== undefined) {\n\t\tinput.syncPolicy = raw.syncPolicy\n\t}\n\tif (raw.unmatched !== undefined) {\n\t\tinput.unmatched = raw.unmatched\n\t}\n\treturn ClaimMapping(input, ['claimMapping'])\n}\n\n/**\n * The set of A09 rule keys that were removed when global-role mapping was dropped. Detected\n * explicitly (rather than relying on Typesafe's generic \"extra property\" rejection) so a config\n * that still tries to grant global roles gets an actionable error.\n */\nconst REMOVED_RULE_KEYS = ['grantRoles'] as const\n\n/**\n * Returns the removed rule keys (currently only `grantRoles`) still present in a raw `claimMapping`,\n * so config-time validation can reject them with a clear message pointing at `grantMembership`.\n */\nexport const findRemovedRuleKeys = (configuration: Record<string, unknown>): string[] => {\n\tconst raw = configuration.claimMapping\n\tif (!isRecord(raw) || !Array.isArray(raw.rules)) {\n\t\treturn []\n\t}\n\tconst found = new Set<string>()\n\tfor (const rule of raw.rules) {\n\t\tif (isRecord(rule)) {\n\t\t\tfor (const key of REMOVED_RULE_KEYS) {\n\t\t\t\tif (key in rule) {\n\t\t\t\t\tfound.add(key)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn [...found]\n}\n\n/**\n * Semantic checks on a parsed mapping that the Typesafe shape cannot express. Returns one\n * human-readable message per problem (empty = ok); run at config time (IdP add/update) so a\n * contradictory rule is rejected loudly rather than silently mis-matching or granting nothing:\n * - a rule may use at most one of `equals` / `contains` ({@link ruleMatches} only ever honours `equals`\n * when both are set, so the other would be silently ignored);\n * - a rule's `equals` / `contains` must not be an empty string: an empty `contains` substring-matches EVERY\n * string claim (`'...'.includes('')` is always true), i.e. a match-everything grant to every user of the\n * IdP, and an empty `equals` is an always-no-op footgun — to match on the claim's mere presence, omit both;\n * - a rule must carry a `grantMembership` — a rule with none matches but grants nothing. (A *misspelled*\n * `grantMembership`, e.g. `grantMembershp`, is now rejected earlier by `noExtraProps` during\n * {@link parseClaimMapping}; this check remains for a `grantMembership` that is genuinely OMITTED,\n * which the `partial` schema permits.)\n * - a variable's `from.where` requires a `from.pick` — `where` filters elements but without `pick` there\n * is nothing to project, so the source can only ever resolve to no values;\n * - a variable's `from.split` must not be the empty string — `''.split('')` explodes every claim value\n * into its individual characters (the same class of footgun as an empty `equals` / `contains`).\n */\nexport const findClaimMappingShapeErrors = (mapping: ClaimMapping): string[] => {\n\tconst errors: string[] = []\n\tfor (const rule of mapping.rules) {\n\t\tif (rule.grantMembership === undefined) {\n\t\t\terrors.push(\n\t\t\t\t`claimMapping rule for claim '${rule.claim}' has no 'grantMembership', so it matches but grants nothing; add a 'grantMembership'`,\n\t\t\t)\n\t\t}\n\t\tif (rule.equals !== undefined && rule.contains !== undefined) {\n\t\t\terrors.push(`claimMapping rule for claim '${rule.claim}' sets both 'equals' and 'contains'; a rule may use at most one`)\n\t\t}\n\t\tif (typeof rule.equals === 'string' && rule.equals.trim() === '') {\n\t\t\terrors.push(\n\t\t\t\t`claimMapping rule for claim '${rule.claim}' has an empty 'equals' value; omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`,\n\t\t\t)\n\t\t}\n\t\tif (typeof rule.contains === 'string' && rule.contains.trim() === '') {\n\t\t\terrors.push(\n\t\t\t\t`claimMapping rule for claim '${rule.claim}' has an empty 'contains' value, which would substring-match every string value of the claim (a match-everything grant); omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`,\n\t\t\t)\n\t\t}\n\t\tfor (const variable of rule.grantMembership?.variables ?? []) {\n\t\t\tif (variable.from?.where !== undefined && variable.from.pick === undefined) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`claimMapping variable '${variable.name}' uses 'from.where' without 'from.pick'; it can only ever resolve to no values — set 'pick' (the field to take from each matched element)`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (variable.from?.split === '') {\n\t\t\t\terrors.push(\n\t\t\t\t\t`claimMapping variable '${variable.name}' has an empty 'from.split' delimiter, which splits every claim value into its individual characters; omit 'split' to keep the value whole, or set a non-empty delimiter`,\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\treturn errors\n}\n"],"names":["Typesafe"],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import * as Typesafe from "@contember/typesafe";
2
+ const ClaimValueSource = Typesafe.noExtraProps(Typesafe.intersection(
3
+ Typesafe.object({
4
+ /** Claim to read: the exact name first (URL-namespaced names work), then as a dot-path (e.g. `profile.languages`). */
5
+ claim: Typesafe.string
6
+ }),
7
+ Typesafe.partial({
8
+ /** Split each string value on this delimiter (e.g. `,` or ` `): a scalar string claim and every string element of an array claim. A no-op for non-string values. */
9
+ split: Typesafe.string,
10
+ /** For an array-of-objects claim, take this (dot-path) field from each element. */
11
+ pick: Typesafe.string,
12
+ /** For an array-of-objects claim, keep only elements whose `field` equals `equals`. */
13
+ where: Typesafe.noExtraProps(Typesafe.object({
14
+ field: Typesafe.string,
15
+ equals: Typesafe.scalar
16
+ }))
17
+ })
18
+ ));
19
+ const ClaimMappingVariable = Typesafe.noExtraProps(Typesafe.intersection(
20
+ Typesafe.object({
21
+ name: Typesafe.string
22
+ }),
23
+ Typesafe.partial({
24
+ /** Constant values, set regardless of any claim (the original static form). */
25
+ values: Typesafe.array(Typesafe.string),
26
+ /** Derive (additional) values from a claim. */
27
+ from: ClaimValueSource,
28
+ /** Lookup table applied to each raw value from `from`. A raw value with no entry is dropped unless `passthrough`. */
29
+ map: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),
30
+ /** When `true`, a raw value from `from` not present in `map` is set verbatim. See the security note above. */
31
+ passthrough: Typesafe.boolean,
32
+ /** Allowlist applied to the values derived from `from` (constants in `values` are unaffected). */
33
+ allow: Typesafe.array(Typesafe.string)
34
+ })
35
+ ));
36
+ const ClaimMappingMembership = Typesafe.noExtraProps(Typesafe.intersection(
37
+ Typesafe.object({
38
+ project: Typesafe.string,
39
+ role: Typesafe.string
40
+ }),
41
+ Typesafe.partial({
42
+ /**
43
+ * Membership variables to set. Each is constant (`values`, e.g. `[{ name: 'locale', values: ['cs'] }]`)
44
+ * and/or claim-derived (`from`, e.g. map a `languages` claim through a lookup table to locale ids).
45
+ */
46
+ variables: Typesafe.array(ClaimMappingVariable)
47
+ })
48
+ ));
49
+ const ClaimMappingRule = Typesafe.noExtraProps(Typesafe.intersection(
50
+ Typesafe.object({
51
+ /** Claim/attribute from the IdP response to inspect: the exact name first, then as a dot-path into nested objects. */
52
+ claim: Typesafe.string
53
+ }),
54
+ Typesafe.partial({
55
+ /** Match when the claim equals this value (array claims: when it contains this element). */
56
+ equals: Typesafe.scalar,
57
+ /** Match when the claim contains this value (substring for strings, element for arrays). */
58
+ contains: Typesafe.scalar,
59
+ /** Project membership to grant when the rule matches. */
60
+ grantMembership: ClaimMappingMembership
61
+ })
62
+ ));
63
+ const ClaimMapping = Typesafe.intersection(
64
+ Typesafe.object({
65
+ rules: Typesafe.array(ClaimMappingRule)
66
+ }),
67
+ Typesafe.partial({
68
+ /**
69
+ * When to apply the mapping:
70
+ * - `always` (default) — re-sync memberships on every sign-in (and on every OIDC session refresh).
71
+ * - `sticky` — apply only when the account is first created by auto-sign-up; existing
72
+ * accounts (including one being linked to this IdP for the first time) are
73
+ * left untouched.
74
+ */
75
+ syncPolicy: Typesafe.enumeration("always", "sticky"),
76
+ /**
77
+ * How to treat existing grants the mapping does NOT (re)assign on this sign-in:
78
+ * - `keep` (default, safer) — leave pre-existing memberships untouched.
79
+ * - `remove` — strip memberships that the mapping no longer grants (IdP becomes the source of
80
+ * truth). Only ever touches grants the mapping itself could have made; memberships
81
+ * outside the mapping's vocabulary are never removed.
82
+ */
83
+ unmatched: Typesafe.enumeration("keep", "remove")
84
+ })
85
+ );
86
+ const DEFAULT_SYNC_POLICY = "always";
87
+ const DEFAULT_UNMATCHED = "keep";
88
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
89
+ const parseClaimMapping = (configuration) => {
90
+ const raw = configuration.claimMapping;
91
+ if (!isRecord(raw) || raw.rules === void 0 || raw.rules === null) {
92
+ return null;
93
+ }
94
+ const input = { rules: raw.rules };
95
+ if (raw.syncPolicy !== void 0) {
96
+ input.syncPolicy = raw.syncPolicy;
97
+ }
98
+ if (raw.unmatched !== void 0) {
99
+ input.unmatched = raw.unmatched;
100
+ }
101
+ return ClaimMapping(input, ["claimMapping"]);
102
+ };
103
+ const REMOVED_RULE_KEYS = ["grantRoles"];
104
+ const findRemovedRuleKeys = (configuration) => {
105
+ const raw = configuration.claimMapping;
106
+ if (!isRecord(raw) || !Array.isArray(raw.rules)) {
107
+ return [];
108
+ }
109
+ const found = /* @__PURE__ */ new Set();
110
+ for (const rule of raw.rules) {
111
+ if (isRecord(rule)) {
112
+ for (const key of REMOVED_RULE_KEYS) {
113
+ if (key in rule) {
114
+ found.add(key);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return [...found];
120
+ };
121
+ const findClaimMappingShapeErrors = (mapping) => {
122
+ const errors = [];
123
+ for (const rule of mapping.rules) {
124
+ if (rule.grantMembership === void 0) {
125
+ errors.push(
126
+ `claimMapping rule for claim '${rule.claim}' has no 'grantMembership', so it matches but grants nothing; add a 'grantMembership'`
127
+ );
128
+ }
129
+ if (rule.equals !== void 0 && rule.contains !== void 0) {
130
+ errors.push(`claimMapping rule for claim '${rule.claim}' sets both 'equals' and 'contains'; a rule may use at most one`);
131
+ }
132
+ if (typeof rule.equals === "string" && rule.equals.trim() === "") {
133
+ errors.push(
134
+ `claimMapping rule for claim '${rule.claim}' has an empty 'equals' value; omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`
135
+ );
136
+ }
137
+ if (typeof rule.contains === "string" && rule.contains.trim() === "") {
138
+ errors.push(
139
+ `claimMapping rule for claim '${rule.claim}' has an empty 'contains' value, which would substring-match every string value of the claim (a match-everything grant); omit both 'equals' and 'contains' to match on the claim's mere presence, or set a non-empty value`
140
+ );
141
+ }
142
+ for (const variable of rule.grantMembership?.variables ?? []) {
143
+ if (variable.from?.where !== void 0 && variable.from.pick === void 0) {
144
+ errors.push(
145
+ `claimMapping variable '${variable.name}' uses 'from.where' without 'from.pick'; it can only ever resolve to no values — set 'pick' (the field to take from each matched element)`
146
+ );
147
+ }
148
+ if (variable.from?.split === "") {
149
+ errors.push(
150
+ `claimMapping variable '${variable.name}' has an empty 'from.split' delimiter, which splits every claim value into its individual characters; omit 'split' to keep the value whole, or set a non-empty delimiter`
151
+ );
152
+ }
153
+ }
154
+ }
155
+ return errors;
156
+ };
157
+ export {
158
+ ClaimMapping,
159
+ ClaimMappingMembership,
160
+ ClaimMappingRule,
161
+ ClaimMappingVariable,
162
+ ClaimValueSource,
163
+ DEFAULT_SYNC_POLICY,
164
+ DEFAULT_UNMATCHED,
165
+ findClaimMappingShapeErrors,
166
+ findRemovedRuleKeys,
167
+ isRecord,
168
+ parseClaimMapping
169
+ };
170
+ //# sourceMappingURL=ClaimMapping.js.map