@authup/server-core 1.0.0-beta.50 → 1.0.0-beta.52

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 (656) hide show
  1. package/dist/adapters/database/data-source/options/module.d.ts.map +1 -1
  2. package/dist/adapters/database/data-source/options/module.mjs +2 -0
  3. package/dist/adapters/database/data-source/options/module.mjs.map +1 -1
  4. package/dist/adapters/database/domains/client/entity.d.ts +1 -0
  5. package/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
  6. package/dist/adapters/database/domains/client/entity.mjs +5 -0
  7. package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
  8. package/dist/adapters/database/domains/client-permission/entity.d.ts +2 -1
  9. package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
  10. package/dist/adapters/database/domains/client-permission/entity.mjs +6 -0
  11. package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
  12. package/dist/adapters/database/domains/index.d.ts +1 -0
  13. package/dist/adapters/database/domains/index.d.ts.map +1 -1
  14. package/dist/adapters/database/domains/index.mjs +3 -1
  15. package/dist/adapters/database/domains/robot-permission/entity.d.ts +2 -1
  16. package/dist/adapters/database/domains/robot-permission/entity.d.ts.map +1 -1
  17. package/dist/adapters/database/domains/robot-permission/entity.mjs +6 -0
  18. package/dist/adapters/database/domains/robot-permission/entity.mjs.map +1 -1
  19. package/dist/adapters/database/domains/robot-role/entity.mjs +1 -1
  20. package/dist/adapters/database/domains/robot-role/entity.mjs.map +1 -1
  21. package/dist/adapters/database/domains/role-permission/entity.d.ts +2 -1
  22. package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
  23. package/dist/adapters/database/domains/role-permission/entity.mjs +6 -0
  24. package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
  25. package/dist/adapters/database/domains/session/entity.mjs +1 -1
  26. package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
  27. package/dist/adapters/database/domains/session-token/entity.d.ts +17 -0
  28. package/dist/adapters/database/domains/session-token/entity.d.ts.map +1 -0
  29. package/dist/adapters/database/domains/session-token/entity.mjs +95 -0
  30. package/dist/adapters/database/domains/session-token/entity.mjs.map +1 -0
  31. package/dist/adapters/database/domains/session-token/index.d.ts +2 -0
  32. package/dist/adapters/database/domains/session-token/index.d.ts.map +1 -0
  33. package/dist/adapters/database/domains/session-token/index.mjs +5 -0
  34. package/dist/adapters/database/domains/user-permission/entity.d.ts +2 -1
  35. package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
  36. package/dist/adapters/database/domains/user-permission/entity.mjs +6 -0
  37. package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
  38. package/dist/adapters/database/index.mjs +2 -1
  39. package/dist/adapters/database/migrations/mysql/1779300000000-Default.d.ts +7 -0
  40. package/dist/adapters/database/migrations/mysql/1779300000000-Default.d.ts.map +1 -0
  41. package/dist/adapters/database/migrations/mysql/1779300000000-Default.mjs +85 -0
  42. package/dist/adapters/database/migrations/mysql/1779300000000-Default.mjs.map +1 -0
  43. package/dist/adapters/database/migrations/mysql/1783325495597-Default.d.ts +28 -0
  44. package/dist/adapters/database/migrations/mysql/1783325495597-Default.d.ts.map +1 -0
  45. package/dist/adapters/database/migrations/mysql/1783325495597-Default.mjs +85 -0
  46. package/dist/adapters/database/migrations/mysql/1783325495597-Default.mjs.map +1 -0
  47. package/dist/adapters/database/migrations/postgres/1779300000000-Default.d.ts +7 -0
  48. package/dist/adapters/database/migrations/postgres/1779300000000-Default.d.ts.map +1 -0
  49. package/dist/adapters/database/migrations/postgres/1779300000000-Default.mjs +87 -0
  50. package/dist/adapters/database/migrations/postgres/1779300000000-Default.mjs.map +1 -0
  51. package/dist/adapters/database/migrations/postgres/1783325495597-Default.d.ts +28 -0
  52. package/dist/adapters/database/migrations/postgres/1783325495597-Default.d.ts.map +1 -0
  53. package/dist/adapters/database/migrations/postgres/1783325495597-Default.mjs +79 -0
  54. package/dist/adapters/database/migrations/postgres/1783325495597-Default.mjs.map +1 -0
  55. package/dist/adapters/database/subscriber/module.d.ts.map +1 -1
  56. package/dist/adapters/database/subscriber/module.mjs +4 -3
  57. package/dist/adapters/database/subscriber/module.mjs.map +1 -1
  58. package/dist/adapters/http/adapters/index.mjs +3 -2
  59. package/dist/adapters/http/adapters/oauth2/authorization/module.mjs +2 -1
  60. package/dist/adapters/http/adapters/oauth2/authorization/module.mjs.map +1 -1
  61. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts +2 -1
  62. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts.map +1 -1
  63. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +10 -4
  64. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
  65. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.d.ts.map +1 -1
  66. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +3 -0
  67. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
  68. package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +3 -2
  69. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts +2 -1
  70. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts.map +1 -1
  71. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +14 -4
  72. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  73. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts +2 -1
  74. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts.map +1 -1
  75. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +12 -5
  76. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
  77. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +4 -1
  78. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
  79. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts +1 -0
  80. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts.map +1 -1
  81. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs +2 -2
  82. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs.map +1 -1
  83. package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs +1 -1
  84. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts +1 -0
  85. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts.map +1 -1
  86. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.mjs +3 -2
  87. package/dist/adapters/http/adapters/oauth2/grant-types/utils/realm.d.ts +9 -0
  88. package/dist/adapters/http/adapters/oauth2/grant-types/utils/realm.d.ts.map +1 -0
  89. package/dist/adapters/http/adapters/oauth2/grant-types/utils/realm.mjs +21 -0
  90. package/dist/adapters/http/adapters/oauth2/grant-types/utils/realm.mjs.map +1 -0
  91. package/dist/adapters/http/adapters/oauth2/index.mjs +3 -2
  92. package/dist/adapters/http/controllers/entities/client/module.mjs +2 -2
  93. package/dist/adapters/http/controllers/entities/client-permission/module.mjs +1 -1
  94. package/dist/adapters/http/controllers/entities/client-role/module.mjs +1 -1
  95. package/dist/adapters/http/controllers/entities/client-scope/module.mjs +1 -1
  96. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs +1 -1
  97. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  98. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +28 -12
  99. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  100. package/dist/adapters/http/controllers/entities/index.d.ts +1 -0
  101. package/dist/adapters/http/controllers/entities/index.d.ts.map +1 -1
  102. package/dist/adapters/http/controllers/entities/index.mjs +3 -1
  103. package/dist/adapters/http/controllers/entities/permission/module.mjs +1 -1
  104. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs +1 -1
  105. package/dist/adapters/http/controllers/entities/policy/module.mjs +1 -1
  106. package/dist/adapters/http/controllers/entities/realm/module.d.ts.map +1 -1
  107. package/dist/adapters/http/controllers/entities/realm/module.mjs +11 -8
  108. package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
  109. package/dist/adapters/http/controllers/entities/robot/module.mjs +2 -2
  110. package/dist/adapters/http/controllers/entities/robot-permission/module.mjs +1 -1
  111. package/dist/adapters/http/controllers/entities/robot-role/module.mjs +1 -1
  112. package/dist/adapters/http/controllers/entities/role/module.mjs +1 -1
  113. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs +1 -1
  114. package/dist/adapters/http/controllers/entities/role-permission/module.mjs +1 -1
  115. package/dist/adapters/http/controllers/entities/scope/module.mjs +1 -1
  116. package/dist/adapters/http/controllers/entities/session/index.d.ts +2 -0
  117. package/dist/adapters/http/controllers/entities/session/index.d.ts.map +1 -0
  118. package/dist/adapters/http/controllers/entities/session/index.mjs +5 -0
  119. package/dist/adapters/http/controllers/entities/session/module.d.ts +16 -0
  120. package/dist/adapters/http/controllers/entities/session/module.d.ts.map +1 -0
  121. package/dist/adapters/http/controllers/entities/session/module.mjs +102 -0
  122. package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -0
  123. package/dist/adapters/http/controllers/entities/user/module.mjs +2 -2
  124. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs +1 -1
  125. package/dist/adapters/http/controllers/entities/user-permission/module.mjs +1 -1
  126. package/dist/adapters/http/controllers/entities/user-role/module.mjs +1 -1
  127. package/dist/adapters/http/controllers/index.mjs +3 -1
  128. package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
  129. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +22 -9
  130. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  131. package/dist/adapters/http/controllers/workflows/authorize/types.d.ts +7 -4
  132. package/dist/adapters/http/controllers/workflows/authorize/types.d.ts.map +1 -1
  133. package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
  134. package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
  135. package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
  136. package/dist/adapters/http/controllers/workflows/logout/index.d.ts +3 -0
  137. package/dist/adapters/http/controllers/workflows/logout/index.d.ts.map +1 -0
  138. package/dist/adapters/http/controllers/workflows/logout/index.mjs +5 -0
  139. package/dist/adapters/http/controllers/workflows/logout/module.d.ts +14 -0
  140. package/dist/adapters/http/controllers/workflows/logout/module.d.ts.map +1 -0
  141. package/dist/adapters/http/controllers/workflows/logout/module.mjs +101 -0
  142. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -0
  143. package/dist/adapters/http/controllers/workflows/logout/types.d.ts +9 -0
  144. package/dist/adapters/http/controllers/workflows/logout/types.d.ts.map +1 -0
  145. package/dist/adapters/http/controllers/workflows/logout/types.mjs +4 -0
  146. package/dist/adapters/http/controllers/workflows/status/module.mjs +1 -1
  147. package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
  148. package/dist/adapters/http/controllers/workflows/token/module.mjs +12 -4
  149. package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
  150. package/dist/adapters/http/controllers/workflows/token/types.d.ts +9 -1
  151. package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
  152. package/dist/adapters/http/index.mjs +17 -13
  153. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
  154. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +2 -0
  155. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  156. package/dist/adapters/http/middleware/built-in/index.mjs +2 -2
  157. package/dist/adapters/http/middleware/built-in/logger.d.ts +1 -0
  158. package/dist/adapters/http/middleware/built-in/logger.d.ts.map +1 -1
  159. package/dist/adapters/http/middleware/built-in/logger.mjs +23 -2
  160. package/dist/adapters/http/middleware/built-in/logger.mjs.map +1 -1
  161. package/dist/adapters/http/middleware/built-in/prometheus.d.ts.map +1 -1
  162. package/dist/adapters/http/middleware/built-in/prometheus.mjs +1 -1
  163. package/dist/adapters/http/middleware/built-in/prometheus.mjs.map +1 -1
  164. package/dist/adapters/http/middleware/built-in/realm-resolver/module.d.ts.map +1 -1
  165. package/dist/adapters/http/middleware/built-in/realm-resolver/module.mjs +3 -8
  166. package/dist/adapters/http/middleware/built-in/realm-resolver/module.mjs.map +1 -1
  167. package/dist/adapters/http/middleware/built-in/ui-http-client.d.ts +2 -2
  168. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs +2 -2
  169. package/dist/adapters/http/middleware/built-in/ui-http-client.mjs.map +1 -1
  170. package/dist/adapters/http/middleware/index.mjs +2 -2
  171. package/dist/adapters/http/request/helpers/identity.d.ts +0 -1
  172. package/dist/adapters/http/request/helpers/identity.d.ts.map +1 -1
  173. package/dist/adapters/http/request/helpers/identity.mjs +2 -5
  174. package/dist/adapters/http/request/helpers/identity.mjs.map +1 -1
  175. package/dist/adapters/http/request/helpers/index.d.ts +1 -0
  176. package/dist/adapters/http/request/helpers/index.d.ts.map +1 -1
  177. package/dist/adapters/http/request/helpers/index.mjs +3 -2
  178. package/dist/adapters/http/request/helpers/session-id.d.ts +9 -0
  179. package/dist/adapters/http/request/helpers/session-id.d.ts.map +1 -0
  180. package/dist/adapters/http/request/helpers/session-id.mjs +19 -0
  181. package/dist/adapters/http/request/helpers/session-id.mjs.map +1 -0
  182. package/dist/adapters/http/request/index.mjs +3 -2
  183. package/dist/adapters/http/request/permission/module.d.ts.map +1 -1
  184. package/dist/adapters/http/request/permission/module.mjs +5 -3
  185. package/dist/adapters/http/request/permission/module.mjs.map +1 -1
  186. package/dist/adapters/http/ui/index.d.ts +1 -0
  187. package/dist/adapters/http/ui/index.d.ts.map +1 -1
  188. package/dist/adapters/http/ui/index.mjs +2 -1
  189. package/dist/adapters/http/ui/internal-http-client.d.ts +22 -0
  190. package/dist/adapters/http/ui/internal-http-client.d.ts.map +1 -0
  191. package/dist/adapters/http/ui/internal-http-client.mjs +52 -0
  192. package/dist/adapters/http/ui/internal-http-client.mjs.map +1 -0
  193. package/dist/adapters/http/ui/render.d.ts.map +1 -1
  194. package/dist/adapters/http/ui/render.mjs +5 -2
  195. package/dist/adapters/http/ui/render.mjs.map +1 -1
  196. package/dist/adapters/http/ui/types.d.ts +12 -0
  197. package/dist/adapters/http/ui/types.d.ts.map +1 -1
  198. package/dist/app/modules/authentication/repositories/session.d.ts +5 -2
  199. package/dist/app/modules/authentication/repositories/session.d.ts.map +1 -1
  200. package/dist/app/modules/authentication/repositories/session.mjs +63 -0
  201. package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
  202. package/dist/app/modules/config/constants.d.ts +4 -0
  203. package/dist/app/modules/config/constants.d.ts.map +1 -1
  204. package/dist/app/modules/config/constants.mjs +4 -0
  205. package/dist/app/modules/config/constants.mjs.map +1 -1
  206. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  207. package/dist/app/modules/config/normalize.mjs +6 -1
  208. package/dist/app/modules/config/normalize.mjs.map +1 -1
  209. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  210. package/dist/app/modules/config/read/env.mjs +8 -0
  211. package/dist/app/modules/config/read/env.mjs.map +1 -1
  212. package/dist/app/modules/config/types.d.ts +31 -2
  213. package/dist/app/modules/config/types.d.ts.map +1 -1
  214. package/dist/app/modules/config/validator.d.ts.map +1 -1
  215. package/dist/app/modules/config/validator.mjs +5 -0
  216. package/dist/app/modules/config/validator.mjs.map +1 -1
  217. package/dist/app/modules/database/module.d.ts +1 -0
  218. package/dist/app/modules/database/module.d.ts.map +1 -1
  219. package/dist/app/modules/database/module.mjs +19 -6
  220. package/dist/app/modules/database/module.mjs.map +1 -1
  221. package/dist/app/modules/database/repositories/bindings.d.ts +2 -0
  222. package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -1
  223. package/dist/app/modules/database/repositories/bindings.mjs +3 -1
  224. package/dist/app/modules/database/repositories/bindings.mjs.map +1 -1
  225. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  226. package/dist/app/modules/database/repositories/client/repository.mjs +10 -6
  227. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  228. package/dist/app/modules/database/repositories/helpers.d.ts +11 -0
  229. package/dist/app/modules/database/repositories/helpers.d.ts.map +1 -1
  230. package/dist/app/modules/database/repositories/helpers.mjs +12 -1
  231. package/dist/app/modules/database/repositories/helpers.mjs.map +1 -1
  232. package/dist/app/modules/database/repositories/identity-provider/repository.d.ts.map +1 -1
  233. package/dist/app/modules/database/repositories/identity-provider/repository.mjs +7 -5
  234. package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
  235. package/dist/app/modules/database/repositories/permission/repository.d.ts.map +1 -1
  236. package/dist/app/modules/database/repositories/permission/repository.mjs +4 -3
  237. package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
  238. package/dist/app/modules/database/repositories/permission-provider/module.d.ts +2 -2
  239. package/dist/app/modules/database/repositories/permission-provider/module.d.ts.map +1 -1
  240. package/dist/app/modules/database/repositories/permission-provider/module.mjs +4 -3
  241. package/dist/app/modules/database/repositories/permission-provider/module.mjs.map +1 -1
  242. package/dist/app/modules/database/repositories/policy/repository.d.ts.map +1 -1
  243. package/dist/app/modules/database/repositories/policy/repository.mjs +4 -3
  244. package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
  245. package/dist/app/modules/database/repositories/realm/repository.d.ts +1 -0
  246. package/dist/app/modules/database/repositories/realm/repository.d.ts.map +1 -1
  247. package/dist/app/modules/database/repositories/realm/repository.mjs +20 -3
  248. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  249. package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
  250. package/dist/app/modules/database/repositories/robot/repository.mjs +8 -6
  251. package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
  252. package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
  253. package/dist/app/modules/database/repositories/role/repository.mjs +4 -3
  254. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  255. package/dist/app/modules/database/repositories/role-attribute/repository.d.ts.map +1 -1
  256. package/dist/app/modules/database/repositories/role-attribute/repository.mjs +2 -1
  257. package/dist/app/modules/database/repositories/role-attribute/repository.mjs.map +1 -1
  258. package/dist/app/modules/database/repositories/scope/repository.d.ts.map +1 -1
  259. package/dist/app/modules/database/repositories/scope/repository.mjs +4 -3
  260. package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
  261. package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
  262. package/dist/app/modules/database/repositories/user/repository.mjs +8 -5
  263. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  264. package/dist/app/modules/database/repositories/user-attribute/repository.d.ts.map +1 -1
  265. package/dist/app/modules/database/repositories/user-attribute/repository.mjs +2 -1
  266. package/dist/app/modules/database/repositories/user-attribute/repository.mjs.map +1 -1
  267. package/dist/app/modules/http/constants.d.ts +4 -2
  268. package/dist/app/modules/http/constants.d.ts.map +1 -1
  269. package/dist/app/modules/http/constants.mjs +4 -2
  270. package/dist/app/modules/http/constants.mjs.map +1 -1
  271. package/dist/app/modules/http/module.d.ts +10 -0
  272. package/dist/app/modules/http/module.d.ts.map +1 -1
  273. package/dist/app/modules/http/module.mjs +30 -0
  274. package/dist/app/modules/http/module.mjs.map +1 -1
  275. package/dist/app/modules/http/modules/controller.d.ts +6 -2
  276. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  277. package/dist/app/modules/http/modules/controller.mjs +75 -15
  278. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  279. package/dist/app/modules/http/modules/middleware.mjs +1 -1
  280. package/dist/app/modules/identity/repositories/client.mjs +2 -2
  281. package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
  282. package/dist/app/modules/identity/repositories/robot.mjs +2 -2
  283. package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
  284. package/dist/app/modules/identity/repositories/user.mjs +2 -2
  285. package/dist/app/modules/identity/repositories/user.mjs.map +1 -1
  286. package/dist/app/modules/oauth2/constants.d.ts +2 -1
  287. package/dist/app/modules/oauth2/constants.d.ts.map +1 -1
  288. package/dist/app/modules/oauth2/constants.mjs +1 -0
  289. package/dist/app/modules/oauth2/constants.mjs.map +1 -1
  290. package/dist/app/modules/oauth2/module.d.ts.map +1 -1
  291. package/dist/app/modules/oauth2/module.mjs +10 -4
  292. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  293. package/dist/app/modules/oauth2/repositories/client/repository.mjs +2 -2
  294. package/dist/app/modules/oauth2/repositories/client/repository.mjs.map +1 -1
  295. package/dist/app/modules/oauth2/repositories/index.d.ts +1 -0
  296. package/dist/app/modules/oauth2/repositories/index.d.ts.map +1 -1
  297. package/dist/app/modules/oauth2/repositories/index.mjs +3 -1
  298. package/dist/app/modules/oauth2/repositories/session-token/index.d.ts +2 -0
  299. package/dist/app/modules/oauth2/repositories/session-token/index.d.ts.map +1 -0
  300. package/dist/app/modules/oauth2/repositories/session-token/index.mjs +5 -0
  301. package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts +17 -0
  302. package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts.map +1 -0
  303. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +63 -0
  304. package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -0
  305. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  306. package/dist/app/modules/provisioning/module.mjs +0 -1
  307. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  308. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  309. package/dist/app/modules/provisioning/sources/default/module.mjs +15 -56
  310. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  311. package/dist/app/modules/provisioning/sources/file/module.d.ts.map +1 -1
  312. package/dist/app/modules/provisioning/sources/file/module.mjs +2 -1
  313. package/dist/app/modules/provisioning/sources/file/module.mjs.map +1 -1
  314. package/dist/cli/commands/migration.d.ts.map +1 -1
  315. package/dist/cli/commands/migration.mjs +12 -4
  316. package/dist/cli/commands/migration.mjs.map +1 -1
  317. package/dist/components/oauth2-cleaner/module.d.ts.map +1 -1
  318. package/dist/components/oauth2-cleaner/module.mjs +3 -0
  319. package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
  320. package/dist/core/authentication/index.mjs +2 -1
  321. package/dist/core/authentication/session/index.mjs +2 -1
  322. package/dist/core/authentication/session/module.d.ts +1 -0
  323. package/dist/core/authentication/session/module.d.ts.map +1 -1
  324. package/dist/core/authentication/session/module.mjs +3 -0
  325. package/dist/core/authentication/session/module.mjs.map +1 -1
  326. package/dist/core/authentication/session/types.d.ts +34 -0
  327. package/dist/core/authentication/session/types.d.ts.map +1 -1
  328. package/dist/core/authentication/session/types.mjs +18 -1
  329. package/dist/core/authentication/session/types.mjs.map +1 -0
  330. package/dist/core/entities/client/service.mjs +25 -7
  331. package/dist/core/entities/client/service.mjs.map +1 -1
  332. package/dist/core/entities/client/web-client.d.ts +5 -3
  333. package/dist/core/entities/client/web-client.d.ts.map +1 -1
  334. package/dist/core/entities/client/web-client.mjs +8 -4
  335. package/dist/core/entities/client/web-client.mjs.map +1 -1
  336. package/dist/core/entities/client-permission/service.d.ts +7 -4
  337. package/dist/core/entities/client-permission/service.d.ts.map +1 -1
  338. package/dist/core/entities/client-permission/service.mjs +59 -19
  339. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  340. package/dist/core/entities/client-role/service.d.ts +3 -2
  341. package/dist/core/entities/client-role/service.d.ts.map +1 -1
  342. package/dist/core/entities/client-role/service.mjs +12 -5
  343. package/dist/core/entities/client-role/service.mjs.map +1 -1
  344. package/dist/core/entities/client-scope/service.d.ts +3 -2
  345. package/dist/core/entities/client-scope/service.d.ts.map +1 -1
  346. package/dist/core/entities/client-scope/service.mjs +12 -5
  347. package/dist/core/entities/client-scope/service.mjs.map +1 -1
  348. package/dist/core/entities/identity-provider-role-mapping/service.d.ts +7 -4
  349. package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
  350. package/dist/core/entities/identity-provider-role-mapping/service.mjs +29 -6
  351. package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
  352. package/dist/core/entities/index.d.ts +1 -0
  353. package/dist/core/entities/index.d.ts.map +1 -1
  354. package/dist/core/entities/index.mjs +3 -1
  355. package/dist/core/entities/permission/service.d.ts +3 -5
  356. package/dist/core/entities/permission/service.d.ts.map +1 -1
  357. package/dist/core/entities/permission/service.mjs +30 -24
  358. package/dist/core/entities/permission/service.mjs.map +1 -1
  359. package/dist/core/entities/permission-policy/service.d.ts +3 -2
  360. package/dist/core/entities/permission-policy/service.d.ts.map +1 -1
  361. package/dist/core/entities/permission-policy/service.mjs +12 -5
  362. package/dist/core/entities/permission-policy/service.mjs.map +1 -1
  363. package/dist/core/entities/policy/service.d.ts.map +1 -1
  364. package/dist/core/entities/policy/service.mjs +16 -7
  365. package/dist/core/entities/policy/service.mjs.map +1 -1
  366. package/dist/core/entities/realm/service.mjs +4 -4
  367. package/dist/core/entities/realm/service.mjs.map +1 -1
  368. package/dist/core/entities/realm/types.d.ts +13 -0
  369. package/dist/core/entities/realm/types.d.ts.map +1 -1
  370. package/dist/core/entities/robot/service.d.ts.map +1 -1
  371. package/dist/core/entities/robot/service.mjs +29 -11
  372. package/dist/core/entities/robot/service.mjs.map +1 -1
  373. package/dist/core/entities/robot-permission/service.d.ts +7 -4
  374. package/dist/core/entities/robot-permission/service.d.ts.map +1 -1
  375. package/dist/core/entities/robot-permission/service.mjs +59 -19
  376. package/dist/core/entities/robot-permission/service.mjs.map +1 -1
  377. package/dist/core/entities/robot-role/service.d.ts +3 -2
  378. package/dist/core/entities/robot-role/service.d.ts.map +1 -1
  379. package/dist/core/entities/robot-role/service.mjs +12 -5
  380. package/dist/core/entities/robot-role/service.mjs.map +1 -1
  381. package/dist/core/entities/role/service.d.ts.map +1 -1
  382. package/dist/core/entities/role/service.mjs +16 -7
  383. package/dist/core/entities/role/service.mjs.map +1 -1
  384. package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
  385. package/dist/core/entities/role-attribute/service.mjs +24 -6
  386. package/dist/core/entities/role-attribute/service.mjs.map +1 -1
  387. package/dist/core/entities/role-permission/service.d.ts +7 -4
  388. package/dist/core/entities/role-permission/service.d.ts.map +1 -1
  389. package/dist/core/entities/role-permission/service.mjs +61 -21
  390. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  391. package/dist/core/entities/scope/service.d.ts.map +1 -1
  392. package/dist/core/entities/scope/service.mjs +16 -7
  393. package/dist/core/entities/scope/service.mjs.map +1 -1
  394. package/dist/core/entities/session/index.d.ts +3 -0
  395. package/dist/core/entities/session/index.d.ts.map +1 -0
  396. package/dist/core/entities/session/index.mjs +5 -0
  397. package/dist/core/entities/session/service.d.ts +27 -0
  398. package/dist/core/entities/session/service.d.ts.map +1 -0
  399. package/dist/core/entities/session/service.mjs +151 -0
  400. package/dist/core/entities/session/service.mjs.map +1 -0
  401. package/dist/core/entities/session/types.d.ts +48 -0
  402. package/dist/core/entities/session/types.d.ts.map +1 -0
  403. package/dist/core/entities/session/types.mjs +4 -0
  404. package/dist/core/entities/user/service.d.ts +1 -0
  405. package/dist/core/entities/user/service.d.ts.map +1 -1
  406. package/dist/core/entities/user/service.mjs +29 -11
  407. package/dist/core/entities/user/service.mjs.map +1 -1
  408. package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
  409. package/dist/core/entities/user-attribute/service.mjs +18 -6
  410. package/dist/core/entities/user-attribute/service.mjs.map +1 -1
  411. package/dist/core/entities/user-permission/service.d.ts +7 -4
  412. package/dist/core/entities/user-permission/service.d.ts.map +1 -1
  413. package/dist/core/entities/user-permission/service.mjs +59 -19
  414. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  415. package/dist/core/entities/user-role/service.d.ts +3 -2
  416. package/dist/core/entities/user-role/service.d.ts.map +1 -1
  417. package/dist/core/entities/user-role/service.mjs +12 -5
  418. package/dist/core/entities/user-role/service.mjs.map +1 -1
  419. package/dist/core/identity/index.mjs +2 -1
  420. package/dist/core/identity/password-recovery/service.d.ts.map +1 -1
  421. package/dist/core/identity/password-recovery/service.mjs +2 -1
  422. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  423. package/dist/core/identity/password-recovery/types.d.ts +1 -0
  424. package/dist/core/identity/password-recovery/types.d.ts.map +1 -1
  425. package/dist/core/identity/permission/checker/service.d.ts.map +1 -1
  426. package/dist/core/identity/permission/checker/service.mjs +12 -9
  427. package/dist/core/identity/permission/checker/service.mjs.map +1 -1
  428. package/dist/core/identity/permission/index.d.ts +1 -0
  429. package/dist/core/identity/permission/index.d.ts.map +1 -1
  430. package/dist/core/identity/permission/index.mjs +2 -1
  431. package/dist/core/identity/permission/junction-grant.d.ts +49 -0
  432. package/dist/core/identity/permission/junction-grant.d.ts.map +1 -0
  433. package/dist/core/identity/permission/junction-grant.mjs +57 -0
  434. package/dist/core/identity/permission/junction-grant.mjs.map +1 -0
  435. package/dist/core/identity/permission/module.d.ts +2 -3
  436. package/dist/core/identity/permission/module.d.ts.map +1 -1
  437. package/dist/core/identity/permission/module.mjs +52 -14
  438. package/dist/core/identity/permission/module.mjs.map +1 -1
  439. package/dist/core/identity/permission/types.d.ts +22 -2
  440. package/dist/core/identity/permission/types.d.ts.map +1 -1
  441. package/dist/core/identity/policy/checker/service.d.ts.map +1 -1
  442. package/dist/core/identity/policy/checker/service.mjs +6 -5
  443. package/dist/core/identity/policy/checker/service.mjs.map +1 -1
  444. package/dist/core/identity/provider/authentication/presets/facebook.d.ts.map +1 -1
  445. package/dist/core/identity/provider/authentication/presets/facebook.mjs +2 -1
  446. package/dist/core/identity/provider/authentication/presets/facebook.mjs.map +1 -1
  447. package/dist/core/identity/provider/authentication/presets/github.d.ts.map +1 -1
  448. package/dist/core/identity/provider/authentication/presets/github.mjs +2 -1
  449. package/dist/core/identity/provider/authentication/presets/github.mjs.map +1 -1
  450. package/dist/core/identity/provider/authentication/presets/google.d.ts.map +1 -1
  451. package/dist/core/identity/provider/authentication/presets/google.mjs +2 -1
  452. package/dist/core/identity/provider/authentication/presets/google.mjs.map +1 -1
  453. package/dist/core/identity/provider/authentication/presets/instagram.d.ts.map +1 -1
  454. package/dist/core/identity/provider/authentication/presets/instagram.mjs +2 -1
  455. package/dist/core/identity/provider/authentication/presets/instagram.mjs.map +1 -1
  456. package/dist/core/identity/provider/authentication/presets/paypal.d.ts.map +1 -1
  457. package/dist/core/identity/provider/authentication/presets/paypal.mjs +2 -1
  458. package/dist/core/identity/provider/authentication/presets/paypal.mjs.map +1 -1
  459. package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts.map +1 -1
  460. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs +7 -2
  461. package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs.map +1 -1
  462. package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts +2 -0
  463. package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts.map +1 -1
  464. package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs +5 -0
  465. package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs.map +1 -1
  466. package/dist/core/identity/registration/service.d.ts.map +1 -1
  467. package/dist/core/identity/registration/service.mjs +9 -6
  468. package/dist/core/identity/registration/service.mjs.map +1 -1
  469. package/dist/core/identity/registration/types.d.ts +1 -0
  470. package/dist/core/identity/registration/types.d.ts.map +1 -1
  471. package/dist/core/identity/resolver/module.d.ts +7 -0
  472. package/dist/core/identity/resolver/module.d.ts.map +1 -1
  473. package/dist/core/identity/resolver/module.mjs +7 -1
  474. package/dist/core/identity/resolver/module.mjs.map +1 -1
  475. package/dist/core/index.mjs +11 -2
  476. package/dist/core/oauth2/authorization/code/index.mjs +1 -0
  477. package/dist/core/oauth2/authorization/code/issuer/module.d.ts +0 -1
  478. package/dist/core/oauth2/authorization/code/issuer/module.d.ts.map +1 -1
  479. package/dist/core/oauth2/authorization/code/issuer/module.mjs +7 -7
  480. package/dist/core/oauth2/authorization/code/issuer/module.mjs.map +1 -1
  481. package/dist/core/oauth2/authorization/code/issuer/types.d.ts +11 -2
  482. package/dist/core/oauth2/authorization/code/issuer/types.d.ts.map +1 -1
  483. package/dist/core/oauth2/authorization/code/verifier/module.d.ts.map +1 -1
  484. package/dist/core/oauth2/authorization/code/verifier/module.mjs +1 -0
  485. package/dist/core/oauth2/authorization/code/verifier/module.mjs.map +1 -1
  486. package/dist/core/oauth2/authorization/code/verifier/types.d.ts +1 -0
  487. package/dist/core/oauth2/authorization/code/verifier/types.d.ts.map +1 -1
  488. package/dist/core/oauth2/authorization/code-request/validator.d.ts.map +1 -1
  489. package/dist/core/oauth2/authorization/code-request/validator.mjs +19 -5
  490. package/dist/core/oauth2/authorization/code-request/validator.mjs.map +1 -1
  491. package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
  492. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +13 -10
  493. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  494. package/dist/core/oauth2/authorization/code-request/verifier/types.d.ts +7 -0
  495. package/dist/core/oauth2/authorization/code-request/verifier/types.d.ts.map +1 -1
  496. package/dist/core/oauth2/authorization/helpers.d.ts +2 -1
  497. package/dist/core/oauth2/authorization/helpers.d.ts.map +1 -1
  498. package/dist/core/oauth2/authorization/helpers.mjs +19 -2
  499. package/dist/core/oauth2/authorization/helpers.mjs.map +1 -1
  500. package/dist/core/oauth2/authorization/module.d.ts +6 -7
  501. package/dist/core/oauth2/authorization/module.d.ts.map +1 -1
  502. package/dist/core/oauth2/authorization/module.mjs +24 -38
  503. package/dist/core/oauth2/authorization/module.mjs.map +1 -1
  504. package/dist/core/oauth2/authorization/types.d.ts +15 -7
  505. package/dist/core/oauth2/authorization/types.d.ts.map +1 -1
  506. package/dist/core/oauth2/client/grant-type.d.ts +9 -0
  507. package/dist/core/oauth2/client/grant-type.d.ts.map +1 -0
  508. package/dist/core/oauth2/client/grant-type.mjs +18 -0
  509. package/dist/core/oauth2/client/grant-type.mjs.map +1 -0
  510. package/dist/core/oauth2/client/index.d.ts +1 -0
  511. package/dist/core/oauth2/client/index.d.ts.map +1 -1
  512. package/dist/core/oauth2/client/index.mjs +2 -1
  513. package/dist/core/oauth2/end-session/index.d.ts +4 -0
  514. package/dist/core/oauth2/end-session/index.d.ts.map +1 -0
  515. package/dist/core/oauth2/end-session/index.mjs +6 -0
  516. package/dist/core/oauth2/end-session/service.d.ts +30 -0
  517. package/dist/core/oauth2/end-session/service.d.ts.map +1 -0
  518. package/dist/core/oauth2/end-session/service.mjs +117 -0
  519. package/dist/core/oauth2/end-session/service.mjs.map +1 -0
  520. package/dist/core/oauth2/end-session/types.d.ts +55 -0
  521. package/dist/core/oauth2/end-session/types.d.ts.map +1 -0
  522. package/dist/core/oauth2/end-session/types.mjs +4 -0
  523. package/dist/core/oauth2/end-session/validator.d.ts +6 -0
  524. package/dist/core/oauth2/end-session/validator.d.ts.map +1 -0
  525. package/dist/core/oauth2/end-session/validator.mjs +23 -0
  526. package/dist/core/oauth2/end-session/validator.mjs.map +1 -0
  527. package/dist/core/oauth2/grant-types/authorize.d.ts +19 -2
  528. package/dist/core/oauth2/grant-types/authorize.d.ts.map +1 -1
  529. package/dist/core/oauth2/grant-types/authorize.mjs +53 -10
  530. package/dist/core/oauth2/grant-types/authorize.mjs.map +1 -1
  531. package/dist/core/oauth2/grant-types/refresh-token.d.ts +21 -2
  532. package/dist/core/oauth2/grant-types/refresh-token.d.ts.map +1 -1
  533. package/dist/core/oauth2/grant-types/refresh-token.mjs +55 -9
  534. package/dist/core/oauth2/grant-types/refresh-token.mjs.map +1 -1
  535. package/dist/core/oauth2/grant-types/types.d.ts +22 -2
  536. package/dist/core/oauth2/grant-types/types.d.ts.map +1 -1
  537. package/dist/core/oauth2/index.d.ts +2 -0
  538. package/dist/core/oauth2/index.d.ts.map +1 -1
  539. package/dist/core/oauth2/index.mjs +7 -3
  540. package/dist/core/oauth2/session-token/index.d.ts +2 -0
  541. package/dist/core/oauth2/session-token/index.d.ts.map +1 -0
  542. package/dist/core/oauth2/session-token/index.mjs +4 -0
  543. package/dist/core/oauth2/session-token/types.d.ts +70 -0
  544. package/dist/core/oauth2/session-token/types.d.ts.map +1 -0
  545. package/dist/core/oauth2/session-token/types.mjs +4 -0
  546. package/dist/core/oauth2/token/issuer/access/module.d.ts +3 -1
  547. package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
  548. package/dist/core/oauth2/token/issuer/access/module.mjs +12 -1
  549. package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
  550. package/dist/core/oauth2/token/issuer/open-id/module.d.ts.map +1 -1
  551. package/dist/core/oauth2/token/issuer/open-id/module.mjs +1 -1
  552. package/dist/core/oauth2/token/issuer/open-id/module.mjs.map +1 -1
  553. package/dist/core/oauth2/token/issuer/refresh/module.d.ts +3 -1
  554. package/dist/core/oauth2/token/issuer/refresh/module.d.ts.map +1 -1
  555. package/dist/core/oauth2/token/issuer/refresh/module.mjs +12 -1
  556. package/dist/core/oauth2/token/issuer/refresh/module.mjs.map +1 -1
  557. package/dist/core/oauth2/token/revoker/module.d.ts +3 -1
  558. package/dist/core/oauth2/token/revoker/module.d.ts.map +1 -1
  559. package/dist/core/oauth2/token/revoker/module.mjs +4 -1
  560. package/dist/core/oauth2/token/revoker/module.mjs.map +1 -1
  561. package/dist/core/oauth2/token/verifier/module.d.ts.map +1 -1
  562. package/dist/core/oauth2/token/verifier/module.mjs +4 -4
  563. package/dist/core/oauth2/token/verifier/module.mjs.map +1 -1
  564. package/dist/core/oauth2/token/verifier/types.d.ts +6 -0
  565. package/dist/core/oauth2/token/verifier/types.d.ts.map +1 -1
  566. package/dist/core/provisioning/entities/client/relations-validator.d.ts.map +1 -1
  567. package/dist/core/provisioning/entities/client/relations-validator.mjs +3 -2
  568. package/dist/core/provisioning/entities/client/relations-validator.mjs.map +1 -1
  569. package/dist/core/provisioning/entities/index.d.ts +1 -0
  570. package/dist/core/provisioning/entities/index.d.ts.map +1 -1
  571. package/dist/core/provisioning/entities/index.mjs +5 -1
  572. package/dist/core/provisioning/entities/permission/index.d.ts +1 -0
  573. package/dist/core/provisioning/entities/permission/index.d.ts.map +1 -1
  574. package/dist/core/provisioning/entities/permission/index.mjs +2 -1
  575. package/dist/core/provisioning/entities/permission/relations-validator.d.ts +6 -0
  576. package/dist/core/provisioning/entities/permission/relations-validator.d.ts.map +1 -0
  577. package/dist/core/provisioning/entities/permission/relations-validator.mjs +17 -0
  578. package/dist/core/provisioning/entities/permission/relations-validator.mjs.map +1 -0
  579. package/dist/core/provisioning/entities/permission/validator.d.ts.map +1 -1
  580. package/dist/core/provisioning/entities/permission/validator.mjs +3 -0
  581. package/dist/core/provisioning/entities/permission/validator.mjs.map +1 -1
  582. package/dist/core/provisioning/entities/policy/index.d.ts +1 -0
  583. package/dist/core/provisioning/entities/policy/index.d.ts.map +1 -1
  584. package/dist/core/provisioning/entities/policy/index.mjs +2 -1
  585. package/dist/core/provisioning/entities/policy/validator.d.ts +6 -0
  586. package/dist/core/provisioning/entities/policy/validator.d.ts.map +1 -0
  587. package/dist/core/provisioning/entities/policy/validator.mjs +26 -0
  588. package/dist/core/provisioning/entities/policy/validator.mjs.map +1 -0
  589. package/dist/core/provisioning/entities/realm/relations-validator.d.ts.map +1 -1
  590. package/dist/core/provisioning/entities/realm/relations-validator.mjs +9 -52
  591. package/dist/core/provisioning/entities/realm/relations-validator.mjs.map +1 -1
  592. package/dist/core/provisioning/entities/role/relations-validator.d.ts.map +1 -1
  593. package/dist/core/provisioning/entities/role/relations-validator.mjs +4 -0
  594. package/dist/core/provisioning/entities/role/relations-validator.mjs.map +1 -1
  595. package/dist/core/provisioning/entities/role/types.d.ts +8 -5
  596. package/dist/core/provisioning/entities/role/types.d.ts.map +1 -1
  597. package/dist/core/provisioning/entities/root/validator.d.ts.map +1 -1
  598. package/dist/core/provisioning/entities/root/validator.mjs +11 -26
  599. package/dist/core/provisioning/entities/root/validator.mjs.map +1 -1
  600. package/dist/core/provisioning/entities/utils.d.ts +10 -0
  601. package/dist/core/provisioning/entities/utils.d.ts.map +1 -0
  602. package/dist/core/provisioning/entities/utils.mjs +29 -0
  603. package/dist/core/provisioning/entities/utils.mjs.map +1 -0
  604. package/dist/core/provisioning/index.mjs +4 -1
  605. package/dist/core/provisioning/synchronizer/base.d.ts +3 -0
  606. package/dist/core/provisioning/synchronizer/base.d.ts.map +1 -1
  607. package/dist/core/provisioning/synchronizer/base.mjs +3 -0
  608. package/dist/core/provisioning/synchronizer/base.mjs.map +1 -1
  609. package/dist/core/provisioning/synchronizer/client/module.d.ts.map +1 -1
  610. package/dist/core/provisioning/synchronizer/client/module.mjs +1 -0
  611. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  612. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts.map +1 -1
  613. package/dist/core/provisioning/synchronizer/entity-resolver.mjs +3 -0
  614. package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
  615. package/dist/core/provisioning/synchronizer/index.mjs +1 -0
  616. package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
  617. package/dist/core/provisioning/synchronizer/permission/module.mjs +2 -1
  618. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  619. package/dist/core/provisioning/synchronizer/policy/module.d.ts +2 -0
  620. package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
  621. package/dist/core/provisioning/synchronizer/policy/module.mjs +19 -1
  622. package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
  623. package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
  624. package/dist/core/provisioning/synchronizer/realm/module.mjs +1 -0
  625. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  626. package/dist/core/provisioning/synchronizer/robot/module.d.ts.map +1 -1
  627. package/dist/core/provisioning/synchronizer/robot/module.mjs +1 -0
  628. package/dist/core/provisioning/synchronizer/robot/module.mjs.map +1 -1
  629. package/dist/core/provisioning/synchronizer/role/module.d.ts +2 -3
  630. package/dist/core/provisioning/synchronizer/role/module.d.ts.map +1 -1
  631. package/dist/core/provisioning/synchronizer/role/module.mjs +14 -20
  632. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  633. package/dist/core/provisioning/synchronizer/role/types.d.ts +1 -2
  634. package/dist/core/provisioning/synchronizer/role/types.d.ts.map +1 -1
  635. package/dist/core/provisioning/synchronizer/scope/module.d.ts.map +1 -1
  636. package/dist/core/provisioning/synchronizer/scope/module.mjs +1 -0
  637. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  638. package/dist/core/provisioning/synchronizer/user/module.d.ts.map +1 -1
  639. package/dist/core/provisioning/synchronizer/user/module.mjs +1 -0
  640. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  641. package/dist/core/security/policy/evaluator.d.ts +4 -4
  642. package/dist/core/security/policy/evaluator.d.ts.map +1 -1
  643. package/dist/core/security/policy/evaluator.mjs +19 -18
  644. package/dist/core/security/policy/evaluator.mjs.map +1 -1
  645. package/dist/index.mjs +17 -12
  646. package/dist/swagger.json +585 -23
  647. package/dist/ui/client/.vite/ssr-manifest.json +1981 -577
  648. package/dist/ui/client/assets/index-CP9HCHoS.js +127 -0
  649. package/dist/ui/client/assets/index-VM4JXBXw.css +2 -0
  650. package/dist/ui/client/index.html +2 -2
  651. package/dist/ui/server/assets/{multipart-parser-Dn2Ly9xU.js → multipart-parser-BCMy8Xwv.js} +11 -1
  652. package/dist/ui/server/assets/{multipart-parser-DyM9gi59.js → multipart-parser-BVY8pIV2.js} +11 -1
  653. package/dist/ui/server/server.js +21503 -11128
  654. package/package.json +38 -36
  655. package/dist/ui/client/assets/index-BFXs98mu.js +0 -102
  656. package/dist/ui/client/assets/index-C_-HM1P-.css +0 -2
@@ -32,6 +32,8 @@ import { RolePermissionService } from "./role-permission/service.mjs";
32
32
  import "./role-permission/index.mjs";
33
33
  import { ScopeService } from "./scope/service.mjs";
34
34
  import "./scope/index.mjs";
35
+ import { SessionService } from "./session/service.mjs";
36
+ import "./session/index.mjs";
35
37
  import { UserService } from "./user/service.mjs";
36
38
  import "./user/index.mjs";
37
39
  import { UserAttributeService } from "./user-attribute/service.mjs";
@@ -42,4 +44,4 @@ import { UserRoleService } from "./user-role/service.mjs";
42
44
  import "./user-role/index.mjs";
43
45
  import { IdentityProviderRoleMappingService } from "./identity-provider-role-mapping/service.mjs";
44
46
  import "./identity-provider-role-mapping/index.mjs";
45
- export { ClientPermissionService, ClientRoleService, ClientScopeService, ClientService, IdentityProviderRoleMappingService, PermissionPolicyService, PermissionService, PolicyService, RealmService, RobotPermissionService, RobotRoleService, RobotService, RoleAttributeService, RolePermissionService, RoleService, ScopeService, UserAttributeService, UserPermissionService, UserRoleService, UserService, WebClientProvisioner, buildWebClientAttributes };
47
+ export { ClientPermissionService, ClientRoleService, ClientScopeService, ClientService, IdentityProviderRoleMappingService, PermissionPolicyService, PermissionService, PolicyService, RealmService, RobotPermissionService, RobotRoleService, RobotService, RoleAttributeService, RolePermissionService, RoleService, ScopeService, SessionService, UserAttributeService, UserPermissionService, UserRoleService, UserService, WebClientProvisioner, buildWebClientAttributes };
@@ -50,9 +50,9 @@ export declare class PermissionService extends AbstractEntityService implements
50
50
  /**
51
51
  * Assign a newly created permission to all matching realm_admin roles.
52
52
  *
53
- * Uses differentiated junction policies:
54
- * - CUD on global-capable entity types → system.realm-bound
55
- * - Everything else → system.realm-or-global
53
+ * Uses differentiated realm_scope on the junction:
54
+ * - CUD on global-capable entity types → own (strictly own realm)
55
+ * - Everything else → ownOrNull (own realm + null/global resources)
56
56
  *
57
57
  * Eligible permissions:
58
58
  * - Built-in authup permissions (global) — assigned to all realm_admin roles
@@ -61,8 +61,6 @@ export declare class PermissionService extends AbstractEntityService implements
61
61
  * Excluded:
62
62
  * - Realm CRUD permissions (realm_create, realm_update, realm_delete)
63
63
  * - Custom global permissions (non-built-in with realm_id: null)
64
- *
65
- * Fails closed: skips assignment entirely if required policies are not found.
66
64
  */
67
65
  private assignToRealmAdminRoles;
68
66
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/permission/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,mBAAmB,EAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA0C5E,MAAM,MAAM,wBAAwB,GAAG;IACnC,UAAU,EAAE,qBAAqB,CAAC;IAClC,eAAe,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,eAAe,CAAC;IAChC,wBAAwB,EAAE,yBAAyB,CAAC;IACpD,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,qBAAsB,YAAW,kBAAkB;IACtF,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAE5C,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;IAE9D,SAAS,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAE9C,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC;gBAE7B,GAAG,EAAE,wBAAwB;IAWnC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAYhD,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC;IAiBhB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAKhB,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAKhB,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,UAAU,CAAC;QACnB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IA+FI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBtB;;;;OAIG;YACW,mBAAmB;IAuBjC;;;OAGG;YACW,iBAAiB;IAuB/B;;;;;;;;;;;;;;;;OAgBG;YACW,uBAAuB;CA4CxC"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/permission/service.ts"],"names":[],"mappings":"AAeA,OAAO,EAEH,mBAAmB,EAGtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA0C5E,MAAM,MAAM,wBAAwB,GAAG;IACnC,UAAU,EAAE,qBAAqB,CAAC;IAClC,eAAe,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,eAAe,CAAC;IAChC,wBAAwB,EAAE,yBAAyB,CAAC;IACpD,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,qBAAsB,YAAW,kBAAkB;IACtF,SAAS,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAE5C,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC;IAE1C,SAAS,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;IAE9D,SAAS,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IAE9C,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,mBAAmB,CAAC;gBAE7B,GAAG,EAAE,wBAAwB;IAWnC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAYhD,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC;IAiBhB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAKhB,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAKhB,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,UAAU,CAAC;QACnB,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IAgGI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,UAAU,CAAC;IAwBtB;;;;OAIG;YACW,mBAAmB;IAuBjC;;;OAGG;YACW,iBAAiB;IAyB/B;;;;;;;;;;;;;;OAcG;YACW,uBAAuB;CAuCxC"}
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { ValidatorGroup, isPropertySet, isUUID } from "@authup/kit";
5
5
  import { PermissionName, PermissionValidator, ROLE_ADMIN_NAME, ROLE_REALM_ADMIN_NAME } from "@authup/core-kit";
6
6
  import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PolicyData, SystemPolicyName } from "@authup/access";
7
+ import { BuiltInPolicyType, RealmScope, SystemPolicyName, definePolicyData } from "@authup/access";
8
8
  import { AuthupError, BadRequestError, EntityNotFoundError } from "@authup/errors";
9
9
  //#region src/core/entities/permission/service.ts
10
10
  const REALM_ADMIN_EXCLUDED_PERMISSIONS = [
@@ -13,14 +13,14 @@ const REALM_ADMIN_EXCLUDED_PERMISSIONS = [
13
13
  PermissionName.REALM_DELETE
14
14
  ];
15
15
  /**
16
- * CUD permissions that get system.realm-bound on realm_admin.
17
- * Covers direct entity types (both global-capable and realm-only).
16
+ * Direct-entity CUD permissions that realm_admin grants at `realm_scope: own`
17
+ * (strictly the actor's own realm see line 372). Every other realm_admin
18
+ * permission defaults to `ownOrNull` (own realm OR global/null resources) so it
19
+ * can act on global building blocks.
18
20
  *
19
- * Junction entity CUD (e.g. user_role, role_permission) intentionally
20
- * use realm-or-global instead, because their attributes include
21
- * multiple realm_id fields (e.g. user_realm_id + role_realm_id).
22
- * With attribute_name_strict: false, realm-bound would reject
23
- * junctions where one side is global (realm_id: null).
21
+ * Junction CUD (e.g. user_role, role_permission) is intentionally NOT listed here:
22
+ * it stays `ownOrNull` because a junction can legitimately reference a global
23
+ * side (realm_id: null) a strict `own` would reject those.
24
24
  */ const REALM_ADMIN_BOUND_PERMISSIONS = [
25
25
  PermissionName.CLIENT_CREATE,
26
26
  PermissionName.CLIENT_UPDATE,
@@ -113,10 +113,13 @@ var PermissionService = class extends AbstractEntityService {
113
113
  if (entity.built_in && isPropertySet(validated, "name") && entity.name !== validated.name) throw new BadRequestError("The name of a built-in permission can not be changed.");
114
114
  await actor.permissionEvaluator.evaluate({
115
115
  name: PermissionName.PERMISSION_UPDATE,
116
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
117
- ...entity,
118
- ...validated
119
- } })
116
+ data: definePolicyData({
117
+ [BuiltInPolicyType.ATTRIBUTES]: {
118
+ ...entity,
119
+ ...validated
120
+ },
121
+ [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null
122
+ })
120
123
  });
121
124
  await this.repository.checkUniqueness(validated, entity);
122
125
  entity = this.repository.merge(entity, validated);
@@ -129,7 +132,10 @@ var PermissionService = class extends AbstractEntityService {
129
132
  if (!isPropertySet(validated, "realm_id") && actor.identity) validated.realm_id = this.getActorRealmId(actor) || null;
130
133
  await actor.permissionEvaluator.evaluate({
131
134
  name: PermissionName.PERMISSION_CREATE,
132
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
135
+ data: definePolicyData({
136
+ [BuiltInPolicyType.ATTRIBUTES]: validated,
137
+ ...this.resourceRealmMatch(validated)
138
+ })
133
139
  });
134
140
  await this.repository.checkUniqueness(validated);
135
141
  entity = this.repository.create(validated);
@@ -149,7 +155,10 @@ var PermissionService = class extends AbstractEntityService {
149
155
  if (entity.built_in) throw new BadRequestError("A built-in permission can not be deleted.");
150
156
  await actor.permissionEvaluator.evaluate({
151
157
  name: PermissionName.PERMISSION_DELETE,
152
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
158
+ data: definePolicyData({
159
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
160
+ ...this.resourceRealmMatch(entity)
161
+ })
153
162
  });
154
163
  const { id: entityId } = entity;
155
164
  await this.repository.remove(entity);
@@ -189,16 +198,17 @@ var PermissionService = class extends AbstractEntityService {
189
198
  role_id: adminRole.id,
190
199
  role_realm_id: adminRole.realm_id,
191
200
  permission_id: permission.id,
192
- permission_realm_id: permission.realm_id
201
+ permission_realm_id: permission.realm_id,
202
+ realm_scope: RealmScope.ANY
193
203
  });
194
204
  await this.rolePermissionRepository.save(entry);
195
205
  }
196
206
  /**
197
207
  * Assign a newly created permission to all matching realm_admin roles.
198
208
  *
199
- * Uses differentiated junction policies:
200
- * - CUD on global-capable entity types → system.realm-bound
201
- * - Everything else → system.realm-or-global
209
+ * Uses differentiated realm_scope on the junction:
210
+ * - CUD on global-capable entity types → own (strictly own realm)
211
+ * - Everything else → ownOrNull (own realm + null/global resources)
202
212
  *
203
213
  * Eligible permissions:
204
214
  * - Built-in authup permissions (global) — assigned to all realm_admin roles
@@ -207,15 +217,11 @@ var PermissionService = class extends AbstractEntityService {
207
217
  * Excluded:
208
218
  * - Realm CRUD permissions (realm_create, realm_update, realm_delete)
209
219
  * - Custom global permissions (non-built-in with realm_id: null)
210
- *
211
- * Fails closed: skips assignment entirely if required policies are not found.
212
220
  */ async assignToRealmAdminRoles(permission) {
213
221
  if (REALM_ADMIN_EXCLUDED_PERMISSIONS.includes(permission.name)) return;
214
222
  const isBuiltIn = Object.values(PermissionName).includes(permission.name);
215
223
  if (!permission.realm_id && !isBuiltIn) return;
216
- const policyName = REALM_ADMIN_BOUND_PERMISSIONS.includes(permission.name) ? SystemPolicyName.REALM_BOUND : SystemPolicyName.REALM_OR_GLOBAL;
217
- const policy = await this.policyRepository.findOneByName(policyName);
218
- if (!policy) return;
224
+ const realmScope = REALM_ADMIN_BOUND_PERMISSIONS.includes(permission.name) ? RealmScope.OWN : RealmScope.OWN_OR_NULL;
219
225
  const realmAdminRoles = await this.roleRepository.findManyBy({ name: ROLE_REALM_ADMIN_NAME });
220
226
  for (const role of realmAdminRoles) {
221
227
  if (permission.realm_id && permission.realm_id !== role.realm_id) continue;
@@ -228,7 +234,7 @@ var PermissionService = class extends AbstractEntityService {
228
234
  role_realm_id: role.realm_id,
229
235
  permission_id: permission.id,
230
236
  permission_realm_id: permission.realm_id,
231
- policy_id: policy.id
237
+ realm_scope: realmScope
232
238
  });
233
239
  await this.rolePermissionRepository.save(entry);
234
240
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","SystemPolicyName","ValidatorGroup","isPropertySet","isUUID","AuthupError","BadRequestError","EntityNotFoundError","PermissionName","PermissionValidator","ROLE_ADMIN_NAME","ROLE_REALM_ADMIN_NAME","AbstractEntityService","REALM_ADMIN_EXCLUDED_PERMISSIONS","REALM_CREATE","REALM_UPDATE","REALM_DELETE","REALM_ADMIN_BOUND_PERMISSIONS","CLIENT_CREATE","CLIENT_UPDATE","CLIENT_DELETE","IDENTITY_PROVIDER_CREATE","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","PERMISSION_CREATE","PERMISSION_UPDATE","PERMISSION_DELETE","ROBOT_CREATE","ROBOT_UPDATE","ROBOT_DELETE","ROLE_CREATE","ROLE_UPDATE","ROLE_DELETE","SCOPE_CREATE","SCOPE_UPDATE","SCOPE_DELETE","USER_CREATE","USER_UPDATE","USER_DELETE","PermissionService","repository","realmRepository","roleRepository","rolePermissionRepository","policyRepository","permissionPolicyRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","CREATE","validated","run","validateJoinColumns","built_in","evaluate","input","ATTRIBUTES","checkUniqueness","merge","created","identity","getActorRealmId","assignDefaultPolicy","assignToAdminRole","assignToRealmAdminRoles","delete","entityId","remove","permission","defaultPolicy","findOneByName","DEFAULT","existing","permission_id","policy_id","entry","permission_realm_id","policy_realm_id","adminRole","role_id","role_realm_id","includes","isBuiltIn","Object","values","policyName","REALM_BOUND","REALM_OR_GLOBAL","policy","realmAdminRoles","findManyBy","role"],"sources":["../../../../src/core/entities/permission/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData, SystemPolicyName } from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { AuthupError, BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n PermissionValidator,\n ROLE_ADMIN_NAME,\n ROLE_REALM_ADMIN_NAME,\n} from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository } from '../permission-policy/types.ts';\nimport type { IPolicyRepository } from '../policy/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport type { IRoleRepository } from '../role/types.ts';\nimport type { IRolePermissionRepository } from '../role-permission/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IPermissionRepository, IPermissionService } from './types.ts';\n\nconst REALM_ADMIN_EXCLUDED_PERMISSIONS = [\n PermissionName.REALM_CREATE,\n PermissionName.REALM_UPDATE,\n PermissionName.REALM_DELETE,\n];\n\n/**\n * CUD permissions that get system.realm-bound on realm_admin.\n * Covers direct entity types (both global-capable and realm-only).\n *\n * Junction entity CUD (e.g. user_role, role_permission) intentionally\n * use realm-or-global instead, because their attributes include\n * multiple realm_id fields (e.g. user_realm_id + role_realm_id).\n * With attribute_name_strict: false, realm-bound would reject\n * junctions where one side is global (realm_id: null).\n */\nconst REALM_ADMIN_BOUND_PERMISSIONS = [\n PermissionName.CLIENT_CREATE,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n PermissionName.IDENTITY_PROVIDER_CREATE,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n PermissionName.PERMISSION_CREATE,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n PermissionName.ROBOT_CREATE,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n PermissionName.ROLE_CREATE,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n PermissionName.SCOPE_CREATE,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n PermissionName.USER_CREATE,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n];\n\nexport type PermissionServiceContext = {\n repository: IPermissionRepository;\n realmRepository: IRealmRepository;\n roleRepository: IRoleRepository;\n rolePermissionRepository: IRolePermissionRepository;\n policyRepository: IPolicyRepository;\n permissionPolicyRepository: IPermissionPolicyRepository;\n};\n\nexport class PermissionService extends AbstractEntityService implements IPermissionService {\n protected repository: IPermissionRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected roleRepository: IRoleRepository;\n\n protected rolePermissionRepository: IRolePermissionRepository;\n\n protected policyRepository: IPolicyRepository;\n\n protected permissionPolicyRepository: IPermissionPolicyRepository;\n\n protected validator: PermissionValidator;\n\n constructor(ctx: PermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.roleRepository = ctx.roleRepository;\n this.rolePermissionRepository = ctx.rolePermissionRepository;\n this.policyRepository = ctx.policyRepository;\n this.permissionPolicyRepository = ctx.permissionPolicyRepository;\n this.validator = new PermissionValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Permission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Permission,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Permission | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n if (\n entity.built_in &&\n isPropertySet(validated, 'name') &&\n entity.name !== validated.name\n ) {\n throw new BadRequestError('The name of a built-in permission can not be changed.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n entity = this.repository.merge(entity, validated);\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n await this.assignDefaultPolicy(entity);\n await this.assignToAdminRole(entity);\n await this.assignToRealmAdminRoles(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in permission can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n\n /**\n * Assign the system.default policy to a newly created permission.\n * This ensures all permissions are evaluated with the baseline security\n * policy (identity, permission-binding, realm-match) by default.\n */\n private async assignDefaultPolicy(permission: Permission): Promise<void> {\n const defaultPolicy = await this.policyRepository.findOneByName(SystemPolicyName.DEFAULT);\n if (!defaultPolicy) {\n throw new AuthupError(`The ${SystemPolicyName.DEFAULT} policy is not provisioned. Cannot create permissions without the default security policy.`);\n }\n\n const existing = await this.permissionPolicyRepository.findOneBy({\n permission_id: permission.id,\n policy_id: defaultPolicy.id,\n });\n if (existing) {\n return;\n }\n\n const entry = this.permissionPolicyRepository.create({\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: defaultPolicy.id,\n policy_realm_id: defaultPolicy.realm_id,\n });\n await this.permissionPolicyRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to the global admin role.\n * The admin role receives every permission without policy restrictions.\n */\n private async assignToAdminRole(permission: Permission): Promise<void> {\n const adminRole = await this.roleRepository.findOneByName(ROLE_ADMIN_NAME);\n if (!adminRole) {\n return;\n }\n\n const existing = await this.rolePermissionRepository.findOneBy({\n role_id: adminRole.id,\n permission_id: permission.id,\n });\n if (existing) {\n return;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: adminRole.id,\n role_realm_id: adminRole.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n });\n await this.rolePermissionRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to all matching realm_admin roles.\n *\n * Uses differentiated junction policies:\n * - CUD on global-capable entity types → system.realm-bound\n * - Everything else → system.realm-or-global\n *\n * Eligible permissions:\n * - Built-in authup permissions (global) — assigned to all realm_admin roles\n * - Realm-scoped permissions — assigned to the realm_admin in the matching realm\n *\n * Excluded:\n * - Realm CRUD permissions (realm_create, realm_update, realm_delete)\n * - Custom global permissions (non-built-in with realm_id: null)\n *\n * Fails closed: skips assignment entirely if required policies are not found.\n */\n private async assignToRealmAdminRoles(permission: Permission): Promise<void> {\n if (REALM_ADMIN_EXCLUDED_PERMISSIONS.includes(permission.name as PermissionName)) {\n return;\n }\n\n const isBuiltIn = (Object.values(PermissionName) as string[]).includes(permission.name);\n if (!permission.realm_id && !isBuiltIn) {\n return;\n }\n\n const policyName = REALM_ADMIN_BOUND_PERMISSIONS.includes(permission.name as PermissionName) ?\n SystemPolicyName.REALM_BOUND :\n SystemPolicyName.REALM_OR_GLOBAL;\n\n const policy = await this.policyRepository.findOneByName(policyName);\n if (!policy) {\n return;\n }\n\n const realmAdminRoles = await this.roleRepository.findManyBy({ name: ROLE_REALM_ADMIN_NAME });\n\n for (const role of realmAdminRoles) {\n if (permission.realm_id && permission.realm_id !== role.realm_id) {\n continue;\n }\n\n const existing = await this.rolePermissionRepository.findOneBy({\n role_id: role.id,\n permission_id: permission.id,\n });\n if (existing) {\n continue;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: role.id,\n role_realm_id: role.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: policy.id,\n });\n await this.rolePermissionRepository.save(entry);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","RealmScope","SystemPolicyName","definePolicyData","ValidatorGroup","isPropertySet","isUUID","AuthupError","BadRequestError","EntityNotFoundError","PermissionName","PermissionValidator","ROLE_ADMIN_NAME","ROLE_REALM_ADMIN_NAME","AbstractEntityService","REALM_ADMIN_EXCLUDED_PERMISSIONS","REALM_CREATE","REALM_UPDATE","REALM_DELETE","REALM_ADMIN_BOUND_PERMISSIONS","CLIENT_CREATE","CLIENT_UPDATE","CLIENT_DELETE","IDENTITY_PROVIDER_CREATE","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","PERMISSION_CREATE","PERMISSION_UPDATE","PERMISSION_DELETE","ROBOT_CREATE","ROBOT_UPDATE","ROBOT_DELETE","ROLE_CREATE","ROLE_UPDATE","ROLE_DELETE","SCOPE_CREATE","SCOPE_UPDATE","SCOPE_DELETE","USER_CREATE","USER_UPDATE","USER_DELETE","PermissionService","repository","realmRepository","roleRepository","rolePermissionRepository","policyRepository","permissionPolicyRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","CREATE","validated","run","validateJoinColumns","built_in","evaluate","ATTRIBUTES","REALM_MATCH","checkUniqueness","merge","created","identity","getActorRealmId","resourceRealmMatch","assignDefaultPolicy","assignToAdminRole","assignToRealmAdminRoles","delete","entityId","remove","permission","defaultPolicy","findOneByName","DEFAULT","existing","permission_id","policy_id","entry","permission_realm_id","policy_realm_id","adminRole","role_id","role_realm_id","realm_scope","ANY","includes","isBuiltIn","Object","values","realmScope","OWN","OWN_OR_NULL","realmAdminRoles","findManyBy","role"],"sources":["../../../../src/core/entities/permission/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { \n BuiltInPolicyType, \n RealmScope, \n SystemPolicyName, \n definePolicyData, \n} from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { AuthupError, BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n PermissionValidator,\n ROLE_ADMIN_NAME,\n ROLE_REALM_ADMIN_NAME,\n} from '@authup/core-kit';\nimport type { Permission } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository } from '../permission-policy/types.ts';\nimport type { IPolicyRepository } from '../policy/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport type { IRoleRepository } from '../role/types.ts';\nimport type { IRolePermissionRepository } from '../role-permission/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IPermissionRepository, IPermissionService } from './types.ts';\n\nconst REALM_ADMIN_EXCLUDED_PERMISSIONS = [\n PermissionName.REALM_CREATE,\n PermissionName.REALM_UPDATE,\n PermissionName.REALM_DELETE,\n];\n\n/**\n * Direct-entity CUD permissions that realm_admin grants at `realm_scope: own`\n * (strictly the actor's own realm — see line 372). Every other realm_admin\n * permission defaults to `ownOrNull` (own realm OR global/null resources) so it\n * can act on global building blocks.\n *\n * Junction CUD (e.g. user_role, role_permission) is intentionally NOT listed here:\n * it stays `ownOrNull` because a junction can legitimately reference a global\n * side (realm_id: null) — a strict `own` would reject those.\n */\nconst REALM_ADMIN_BOUND_PERMISSIONS = [\n PermissionName.CLIENT_CREATE,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n PermissionName.IDENTITY_PROVIDER_CREATE,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n PermissionName.PERMISSION_CREATE,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n PermissionName.ROBOT_CREATE,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n PermissionName.ROLE_CREATE,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n PermissionName.SCOPE_CREATE,\n PermissionName.SCOPE_UPDATE,\n PermissionName.SCOPE_DELETE,\n PermissionName.USER_CREATE,\n PermissionName.USER_UPDATE,\n PermissionName.USER_DELETE,\n];\n\nexport type PermissionServiceContext = {\n repository: IPermissionRepository;\n realmRepository: IRealmRepository;\n roleRepository: IRoleRepository;\n rolePermissionRepository: IRolePermissionRepository;\n policyRepository: IPolicyRepository;\n permissionPolicyRepository: IPermissionPolicyRepository;\n};\n\nexport class PermissionService extends AbstractEntityService implements IPermissionService {\n protected repository: IPermissionRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected roleRepository: IRoleRepository;\n\n protected rolePermissionRepository: IRolePermissionRepository;\n\n protected policyRepository: IPolicyRepository;\n\n protected permissionPolicyRepository: IPermissionPolicyRepository;\n\n protected validator: PermissionValidator;\n\n constructor(ctx: PermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.roleRepository = ctx.roleRepository;\n this.rolePermissionRepository = ctx.rolePermissionRepository;\n this.policyRepository = ctx.policyRepository;\n this.permissionPolicyRepository = ctx.permissionPolicyRepository;\n this.validator = new PermissionValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Permission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Permission> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Permission,\n created: boolean\n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Permission | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n if (\n entity.built_in &&\n isPropertySet(validated, 'name') &&\n entity.name !== validated.name\n ) {\n throw new BadRequestError('The name of a built-in permission can not be changed.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null,\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n entity = this.repository.merge(entity, validated);\n\n await this.repository.save(entity);\n\n return {\n entity,\n created: false,\n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated, ...this.resourceRealmMatch(validated) }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n await this.assignDefaultPolicy(entity);\n await this.assignToAdminRole(entity);\n await this.assignToRealmAdminRoles(entity);\n\n return {\n entity,\n created: true,\n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Permission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in permission can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n\n /**\n * Assign the system.default policy to a newly created permission.\n * This ensures all permissions are evaluated with the baseline security\n * policy (identity, permission-binding, realm-match) by default.\n */\n private async assignDefaultPolicy(permission: Permission): Promise<void> {\n const defaultPolicy = await this.policyRepository.findOneByName(SystemPolicyName.DEFAULT);\n if (!defaultPolicy) {\n throw new AuthupError(`The ${SystemPolicyName.DEFAULT} policy is not provisioned. Cannot create permissions without the default security policy.`);\n }\n\n const existing = await this.permissionPolicyRepository.findOneBy({\n permission_id: permission.id,\n policy_id: defaultPolicy.id,\n });\n if (existing) {\n return;\n }\n\n const entry = this.permissionPolicyRepository.create({\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n policy_id: defaultPolicy.id,\n policy_realm_id: defaultPolicy.realm_id,\n });\n await this.permissionPolicyRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to the global admin role.\n * The admin role receives every permission without policy restrictions.\n */\n private async assignToAdminRole(permission: Permission): Promise<void> {\n const adminRole = await this.roleRepository.findOneByName(ROLE_ADMIN_NAME);\n if (!adminRole) {\n return;\n }\n\n const existing = await this.rolePermissionRepository.findOneBy({\n role_id: adminRole.id,\n permission_id: permission.id,\n });\n if (existing) {\n return;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: adminRole.id,\n role_realm_id: adminRole.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n // Global admin: unrestricted realm reach.\n realm_scope: RealmScope.ANY,\n });\n await this.rolePermissionRepository.save(entry);\n }\n\n /**\n * Assign a newly created permission to all matching realm_admin roles.\n *\n * Uses differentiated realm_scope on the junction:\n * - CUD on global-capable entity types → own (strictly own realm)\n * - Everything else → ownOrNull (own realm + null/global resources)\n *\n * Eligible permissions:\n * - Built-in authup permissions (global) — assigned to all realm_admin roles\n * - Realm-scoped permissions — assigned to the realm_admin in the matching realm\n *\n * Excluded:\n * - Realm CRUD permissions (realm_create, realm_update, realm_delete)\n * - Custom global permissions (non-built-in with realm_id: null)\n */\n private async assignToRealmAdminRoles(permission: Permission): Promise<void> {\n if (REALM_ADMIN_EXCLUDED_PERMISSIONS.includes(permission.name as PermissionName)) {\n return;\n }\n\n const isBuiltIn = (Object.values(PermissionName) as string[]).includes(permission.name);\n if (!permission.realm_id && !isBuiltIn) {\n return;\n }\n\n const realmScope = REALM_ADMIN_BOUND_PERMISSIONS.includes(permission.name as PermissionName) ?\n RealmScope.OWN :\n RealmScope.OWN_OR_NULL;\n\n const realmAdminRoles = await this.roleRepository.findManyBy({ name: ROLE_REALM_ADMIN_NAME });\n\n for (const role of realmAdminRoles) {\n if (permission.realm_id && permission.realm_id !== role.realm_id) {\n continue;\n }\n\n const existing = await this.rolePermissionRepository.findOneBy({\n role_id: role.id,\n permission_id: permission.id,\n });\n if (existing) {\n continue;\n }\n\n const entry = this.rolePermissionRepository.create({\n role_id: role.id,\n role_realm_id: role.realm_id,\n permission_id: permission.id,\n permission_realm_id: permission.realm_id,\n realm_scope: realmScope,\n });\n await this.rolePermissionRepository.save(entry);\n }\n }\n}\n"],"mappings":"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"}
@@ -1,12 +1,13 @@
1
1
  import { PermissionPolicyValidator } from '@authup/core-kit';
2
2
  import type { PermissionPolicy } from '@authup/core-kit';
3
3
  import type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';
4
- import { AbstractEntityService } from '@authup/server-kit';
4
+ import { JunctionEntityService } from '@authup/server-kit';
5
5
  import type { IPermissionPolicyRepository, IPermissionPolicyService } from './types.ts';
6
6
  export type PermissionPolicyServiceContext = {
7
7
  repository: IPermissionPolicyRepository;
8
8
  };
9
- export declare class PermissionPolicyService extends AbstractEntityService implements IPermissionPolicyService {
9
+ export declare class PermissionPolicyService extends JunctionEntityService implements IPermissionPolicyService {
10
+ protected readonly ownerRealmKey = "permission_realm_id";
10
11
  protected repository: IPermissionPolicyRepository;
11
12
  protected validator: PermissionPolicyValidator;
12
13
  constructor(ctx: PermissionPolicyServiceContext);
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/permission-policy/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,MAAM,8BAA8B,GAAG;IACzC,UAAU,EAAE,2BAA2B,CAAC;CAC3C,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,qBAAsB,YAAW,wBAAwB;IAClG,SAAS,CAAC,UAAU,EAAE,2BAA2B,CAAC;IAElD,SAAS,CAAC,SAAS,EAAE,yBAAyB,CAAC;gBAEnC,GAAG,EAAE,8BAA8B;IAMzC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,gBAAgB,CAAC,CAAC;IAWtD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAgBtB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAkCtB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;CAmB/B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/permission-policy/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,MAAM,8BAA8B,GAAG;IACzC,UAAU,EAAE,2BAA2B,CAAC;CAC3C,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,qBAAsB,YAAW,wBAAwB;IAClG,SAAS,CAAC,QAAQ,CAAC,aAAa,yBAAyB;IAEzD,SAAS,CAAC,UAAU,EAAE,2BAA2B,CAAC;IAElD,SAAS,CAAC,SAAS,EAAE,yBAAyB,CAAC;gBAEnC,GAAG,EAAE,8BAA8B;IAMzC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,gBAAgB,CAAC,CAAC;IAWtD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAgBtB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;IAsCtB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,gBAAgB,CAAC;CAuB/B"}
@@ -3,11 +3,12 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { ValidatorGroup } from "@authup/kit";
5
5
  import { PermissionName, PermissionPolicyValidator } from "@authup/core-kit";
6
- import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
6
+ import { JunctionEntityService } from "@authup/server-kit";
7
+ import { BuiltInPolicyType, definePolicyData } from "@authup/access";
8
8
  import { EntityConflictError, EntityNotFoundError } from "@authup/errors";
9
9
  //#region src/core/entities/permission-policy/service.ts
10
- var PermissionPolicyService = class extends AbstractEntityService {
10
+ var PermissionPolicyService = class extends JunctionEntityService {
11
+ ownerRealmKey = "permission_realm_id";
11
12
  repository;
12
13
  validator;
13
14
  constructor(ctx) {
@@ -37,7 +38,10 @@ var PermissionPolicyService = class extends AbstractEntityService {
37
38
  if (validated.policy) validated.policy_realm_id = validated.policy.realm_id;
38
39
  await actor.permissionEvaluator.evaluate({
39
40
  name: PermissionName.PERMISSION_UPDATE,
40
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
41
+ data: definePolicyData({
42
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),
43
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated)
44
+ })
41
45
  });
42
46
  let entity = this.repository.create(validated);
43
47
  entity = await this.repository.save(entity);
@@ -49,7 +53,10 @@ var PermissionPolicyService = class extends AbstractEntityService {
49
53
  if (!entity) throw new EntityNotFoundError();
50
54
  await actor.permissionEvaluator.evaluate({
51
55
  name: PermissionName.PERMISSION_UPDATE,
52
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
56
+ data: definePolicyData({
57
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),
58
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity)
59
+ })
53
60
  });
54
61
  const { id: entityId } = entity;
55
62
  await this.repository.remove(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","PermissionPolicyValidator","AbstractEntityService","PermissionPolicyService","repository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validated","run","group","CREATE","validateJoinColumns","existing","permission_id","policy_id","permission","permission_realm_id","realm_id","policy","policy_realm_id","evaluate","input","ATTRIBUTES","save","delete","entityId","remove"],"sources":["../../../../src/core/entities/permission-policy/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, PermissionPolicyValidator } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository, IPermissionPolicyService } from './types.ts';\n\nexport type PermissionPolicyServiceContext = {\n repository: IPermissionPolicyRepository;\n};\n\nexport class PermissionPolicyService extends AbstractEntityService implements IPermissionPolicyService {\n protected repository: IPermissionPolicyRepository;\n\n protected validator: PermissionPolicyValidator;\n\n constructor(ctx: PermissionPolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n this.validator = new PermissionPolicyValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n permission_id: validated.permission_id,\n policy_id: validated.policy_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'permission-policy' });\n }\n\n if (validated.permission) {\n validated.permission_realm_id = validated.permission.realm_id;\n }\n\n if (validated.policy) {\n validated.policy_realm_id = validated.policy.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;;;AAoBA,IAAaQ,0BAAb,cAA6CD,sBAAAA;CAC/BE;CAEAC;CAEV,YAAYC,KAAqC;EAC7C,MAAK;EACL,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,YAAY,IAAIJ,0BAAAA;CACzB;CAEA,MAAMM,QACFC,OACAC,OACyD;EACzD,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM,CACFZ,eAAea,iBACfb,eAAec,iBAAAA,EAEvB,CAAA;EAEA,OAAO,KAAKV,WAAWW,SAASP,KAAAA;CACpC;CAEA,MAAMQ,OACFC,IACAR,OACyB;EACzB,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM,CACFZ,eAAea,iBACfb,eAAec,iBAAAA,EAEvB,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKd,WAAWe,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAIpB,oBAAAA;EAGd,OAAOoB;CACX;CAEA,MAAME,OACFC,MACAZ,OACyB;EACzB,MAAMA,MAAMC,oBAAoBY,YAAY,EAAEV,MAAMZ,eAAec,kBAAkB,CAAA;EAErF,MAAMS,YAAY,MAAM,KAAKlB,UAAUmB,IAAIH,MAAM,EAAEI,OAAO1B,eAAe2B,OAAO,CAAA;EAEhF,MAAM,KAAKtB,WAAWuB,oBAAoBJ,SAAAA;EAM1C,IAAIK,MAJmB,KAAKxB,WAAWe,UAAU;GAC7CU,eAAeN,UAAUM;GACzBC,WAAWP,UAAUO;EACzB,CAAA,GAEI,MAAM,IAAIjC,oBAAoB,EAAEqB,QAAQ,oBAAoB,CAAA;EAGhE,IAAIK,UAAUQ,YACVR,UAAUS,sBAAsBT,UAAUQ,WAAWE;EAGzD,IAAIV,UAAUW,QACVX,UAAUY,kBAAkBZ,UAAUW,OAAOD;EAGjD,MAAMxB,MAAMC,oBAAoB0B,SAAS;GACrCxB,MAAMZ,eAAec;GACrBuB,OAAO,IAAIzC,WAAW,GAAGD,kBAAkB2C,aAAaf,UAAU,CAAA;EACtE,CAAA;EAEA,IAAIL,SAAS,KAAKd,WAAWgB,OAAOG,SAAAA;EACpCL,SAAS,MAAM,KAAKd,WAAWmC,KAAKrB,MAAAA;EAEpC,OAAOA;CACX;CAEA,MAAMsB,OACFvB,IACAR,OACyB;EACzB,MAAMA,MAAMC,oBAAoBY,YAAY,EAAEV,MAAMZ,eAAec,kBAAkB,CAAA;EAErF,MAAMI,SAAS,MAAM,KAAKd,WAAWe,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAIpB,oBAAAA;EAGd,MAAMW,MAAMC,oBAAoB0B,SAAS;GACrCxB,MAAMZ,eAAec;GACrBuB,OAAO,IAAIzC,WAAW,GAAGD,kBAAkB2C,aAAapB,OAAO,CAAA;EACnE,CAAA;EAEA,MAAM,EAAED,IAAIwB,aAAavB;EACzB,MAAM,KAAKd,WAAWsC,OAAOxB,MAAAA;EAC7BA,OAAOD,KAAKwB;EAEZ,OAAOvB;CACX;AACJ"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","PermissionPolicyValidator","JunctionEntityService","PermissionPolicyService","ownerRealmKey","repository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validated","run","group","CREATE","validateJoinColumns","existing","permission_id","policy_id","permission","permission_realm_id","realm_id","policy","policy_realm_id","evaluate","ATTRIBUTES","junctionAttributes","REALM_MATCH","junctionResourceRealm","save","delete","entityId","remove"],"sources":["../../../../src/core/entities/permission-policy/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, PermissionPolicyValidator } from '@authup/core-kit';\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { JunctionEntityService } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository, IPermissionPolicyService } from './types.ts';\n\nexport type PermissionPolicyServiceContext = {\n repository: IPermissionPolicyRepository;\n};\n\nexport class PermissionPolicyService extends JunctionEntityService implements IPermissionPolicyService {\n protected readonly ownerRealmKey = 'permission_realm_id';\n\n protected repository: IPermissionPolicyRepository;\n\n protected validator: PermissionPolicyValidator;\n\n constructor(ctx: PermissionPolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n this.validator = new PermissionPolicyValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n permission_id: validated.permission_id,\n policy_id: validated.policy_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'permission-policy' });\n }\n\n if (validated.permission) {\n validated.permission_realm_id = validated.permission.realm_id;\n }\n\n if (validated.policy) {\n validated.policy_realm_id = validated.policy.realm_id;\n }\n\n // Stamp the owner (permission) realm so the realm_scope factor gates cross-realm writes.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated),\n }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<PermissionPolicy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n // Stamp the owner (permission) realm so the realm_scope factor gates cross-realm writes.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity),\n }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;;;AAoBA,IAAaQ,0BAAb,cAA6CD,sBAAAA;CACtBE,gBAAgB;CAEzBC;CAEAC;CAEV,YAAYC,KAAqC;EAC7C,MAAK;EACL,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,YAAY,IAAIL,0BAAAA;CACzB;CAEA,MAAMO,QACFC,OACAC,OACyD;EACzD,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM,CACFb,eAAec,iBACfd,eAAee,iBAAAA,EAEvB,CAAA;EAEA,OAAO,KAAKV,WAAWW,SAASP,KAAAA;CACpC;CAEA,MAAMQ,OACFC,IACAR,OACyB;EACzB,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM,CACFb,eAAec,iBACfd,eAAee,iBAAAA,EAEvB,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKd,WAAWe,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAIrB,oBAAAA;EAGd,OAAOqB;CACX;CAEA,MAAME,OACFC,MACAZ,OACyB;EACzB,MAAMA,MAAMC,oBAAoBY,YAAY,EAAEV,MAAMb,eAAee,kBAAkB,CAAA;EAErF,MAAMS,YAAY,MAAM,KAAKlB,UAAUmB,IAAIH,MAAM,EAAEI,OAAO3B,eAAe4B,OAAO,CAAA;EAEhF,MAAM,KAAKtB,WAAWuB,oBAAoBJ,SAAAA;EAM1C,IAAIK,MAJmB,KAAKxB,WAAWe,UAAU;GAC7CU,eAAeN,UAAUM;GACzBC,WAAWP,UAAUO;EACzB,CAAA,GAEI,MAAM,IAAIlC,oBAAoB,EAAEsB,QAAQ,oBAAoB,CAAA;EAGhE,IAAIK,UAAUQ,YACVR,UAAUS,sBAAsBT,UAAUQ,WAAWE;EAGzD,IAAIV,UAAUW,QACVX,UAAUY,kBAAkBZ,UAAUW,OAAOD;EAIjD,MAAMxB,MAAMC,oBAAoB0B,SAAS;GACrCxB,MAAMb,eAAee;GACrBO,MAAM1B,iBAAiB;KAClBD,kBAAkB2C,aAAa,KAAKC,mBAAmBf,SAAAA;KACvD7B,kBAAkB6C,cAAc,KAAKC,sBAAsBjB,SAAAA;GAChE,CAAA;EACJ,CAAA;EAEA,IAAIL,SAAS,KAAKd,WAAWgB,OAAOG,SAAAA;EACpCL,SAAS,MAAM,KAAKd,WAAWqC,KAAKvB,MAAAA;EAEpC,OAAOA;CACX;CAEA,MAAMwB,OACFzB,IACAR,OACyB;EACzB,MAAMA,MAAMC,oBAAoBY,YAAY,EAAEV,MAAMb,eAAee,kBAAkB,CAAA;EAErF,MAAMI,SAAS,MAAM,KAAKd,WAAWe,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAIrB,oBAAAA;EAId,MAAMY,MAAMC,oBAAoB0B,SAAS;GACrCxB,MAAMb,eAAee;GACrBO,MAAM1B,iBAAiB;KAClBD,kBAAkB2C,aAAa,KAAKC,mBAAmBpB,MAAAA;KACvDxB,kBAAkB6C,cAAc,KAAKC,sBAAsBtB,MAAAA;GAChE,CAAA;EACJ,CAAA;EAEA,MAAM,EAAED,IAAI0B,aAAazB;EACzB,MAAM,KAAKd,WAAWwC,OAAO1B,MAAAA;EAC7BA,OAAOD,KAAK0B;EAEZ,OAAOzB;CACX;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/policy/service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEH,eAAe,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,MAAM,oBAAoB,GAAG;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,aAAc,SAAQ,qBAAsB,YAAW,cAAc;IAC9E,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC;IAExC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;IAErC,SAAS,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;gBAE7C,GAAG,EAAE,oBAAoB;IAQ/B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAY5C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAiBZ,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAKZ,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAKZ,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;YA8FY,QAAQ;IAqBhB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;CA4BrB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/policy/service.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEH,eAAe,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,MAAM,oBAAoB,GAAG;IAC/B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,aAAc,SAAQ,qBAAsB,YAAW,cAAc;IAC9E,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC;IAExC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;IAErC,SAAS,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;gBAE7C,GAAG,EAAE,oBAAoB;IAQ/B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAY5C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;IAiBZ,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAKZ,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;IAKZ,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;YA+FY,QAAQ;IAqBhB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,CAAC;CA4BrB"}
@@ -5,7 +5,7 @@ import { PolicyAttributesValidator } from "./attributes-validator.mjs";
5
5
  import { ValidatorGroup, extendObject, isPropertySet, isUUID, removeObjectProperty } from "@authup/kit";
6
6
  import { PermissionName, PolicyValidator } from "@authup/core-kit";
7
7
  import { AbstractEntityService } from "@authup/server-kit";
8
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
8
+ import { BuiltInPolicyType, definePolicyData } from "@authup/access";
9
9
  import { BadRequestError, EntityNotFoundError } from "@authup/errors";
10
10
  //#region src/core/entities/policy/service.ts
11
11
  var PolicyService = class extends AbstractEntityService {
@@ -72,10 +72,13 @@ var PolicyService = class extends AbstractEntityService {
72
72
  if (entity.built_in) throw new BadRequestError("A built-in policy can not be updated.");
73
73
  await actor.permissionEvaluator.evaluate({
74
74
  name: PermissionName.PERMISSION_UPDATE,
75
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
76
- ...entity,
77
- ...validated
78
- } })
75
+ data: definePolicyData({
76
+ [BuiltInPolicyType.ATTRIBUTES]: {
77
+ ...entity,
78
+ ...validated
79
+ },
80
+ [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null
81
+ })
79
82
  });
80
83
  await this.repository.checkUniqueness(validated, entity);
81
84
  extendObject(entity, validated);
@@ -88,7 +91,10 @@ var PolicyService = class extends AbstractEntityService {
88
91
  if (!isPropertySet(validated, "realm_id") && actor.identity) validated.realm_id = this.getActorRealmId(actor) || null;
89
92
  await actor.permissionEvaluator.evaluate({
90
93
  name: PermissionName.PERMISSION_CREATE,
91
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
94
+ data: definePolicyData({
95
+ [BuiltInPolicyType.ATTRIBUTES]: validated,
96
+ ...this.resourceRealmMatch(validated)
97
+ })
92
98
  });
93
99
  await this.repository.checkUniqueness(validated);
94
100
  entity = this.repository.create(validated);
@@ -116,7 +122,10 @@ var PolicyService = class extends AbstractEntityService {
116
122
  if (entity.built_in) throw new BadRequestError("A built-in policy can not be deleted.");
117
123
  await actor.permissionEvaluator.evaluate({
118
124
  name: PermissionName.PERMISSION_DELETE,
119
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
125
+ data: definePolicyData({
126
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
127
+ ...this.resourceRealmMatch(entity)
128
+ })
120
129
  });
121
130
  const { id: entityId } = entity;
122
131
  await this.repository.deleteFromTree(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ValidatorGroup","extendObject","isPropertySet","isUUID","removeObjectProperty","BadRequestError","EntityNotFoundError","PermissionName","PolicyValidator","AbstractEntityService","PolicyAttributesValidator","PolicyService","repository","realmRepository","validator","attributesValidator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","PERMISSION_DELETE","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","PERMISSION_CREATE","CREATE","validated","validate","validateJoinColumns","parent","type","COMPOSITE","built_in","evaluate","input","ATTRIBUTES","checkUniqueness","saveWithEA","created","identity","getActorRealmId","run","attributes","Array","isArray","children","promises","map","child","Promise","all","delete","entityId","deleteFromTree"],"sources":["../../../../src/core/entities/policy/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport {\n ValidatorGroup,\n extendObject,\n isPropertySet,\n isUUID,\n removeObjectProperty,\n} from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n PolicyValidator,\n} from '@authup/core-kit';\nimport type { Policy } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\nimport type { IPolicyRepository, IPolicyService } from './types.ts';\n\nexport type PolicyServiceContext = {\n repository: IPolicyRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class PolicyService extends AbstractEntityService implements IPolicyService {\n protected repository: IPolicyRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: PolicyValidator;\n\n protected attributesValidator: PolicyAttributesValidator;\n\n constructor(ctx: PolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new PolicyValidator();\n this.attributesValidator = new PolicyAttributesValidator({});\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Policy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Policy,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Policy | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validate(data, group);\n\n await this.repository.validateJoinColumns(validated);\n\n if (\n validated.parent &&\n validated.parent.type !== BuiltInPolicyType.COMPOSITE\n ) {\n throw new BadRequestError('The parent policy must be of type group.');\n }\n\n if (entity) {\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be updated.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n extendObject(entity, validated);\n\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n private async validate(\n data: Record<string, any>,\n group: string,\n ): Promise<Policy> {\n const validated = await this.validator.run(data, { group });\n\n const attributes = await this.attributesValidator.run(data);\n extendObject(validated, attributes);\n\n if (Array.isArray(data.children)) {\n if (data.type === BuiltInPolicyType.COMPOSITE) {\n const promises = data.children.map(\n (child) => this.validate(child, group),\n );\n validated.children = await Promise.all(promises);\n }\n }\n\n return validated;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n\n await this.repository.deleteFromTree(entity);\n\n entity.id = entityId;\n\n // todo: remove after PolicyEntity - parent delete on cascade\n removeObjectProperty(entity, 'children');\n\n return entity;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","ValidatorGroup","extendObject","isPropertySet","isUUID","removeObjectProperty","BadRequestError","EntityNotFoundError","PermissionName","PolicyValidator","AbstractEntityService","PolicyAttributesValidator","PolicyService","repository","realmRepository","validator","attributesValidator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","PERMISSION_READ","PERMISSION_UPDATE","PERMISSION_DELETE","findMany","getOne","idOrName","realm","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","PERMISSION_CREATE","CREATE","validated","validate","validateJoinColumns","parent","type","COMPOSITE","built_in","evaluate","ATTRIBUTES","REALM_MATCH","checkUniqueness","saveWithEA","created","identity","getActorRealmId","resourceRealmMatch","run","attributes","Array","isArray","children","promises","map","child","Promise","all","delete","entityId","deleteFromTree"],"sources":["../../../../src/core/entities/policy/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport {\n ValidatorGroup,\n extendObject,\n isPropertySet,\n isUUID,\n removeObjectProperty,\n} from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n PolicyValidator,\n} from '@authup/core-kit';\nimport type { Policy } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\nimport type { IPolicyRepository, IPolicyService } from './types.ts';\n\nexport type PolicyServiceContext = {\n repository: IPolicyRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class PolicyService extends AbstractEntityService implements IPolicyService {\n protected repository: IPolicyRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: PolicyValidator;\n\n protected attributesValidator: PolicyAttributesValidator;\n\n constructor(ctx: PolicyServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new PolicyValidator();\n this.attributesValidator = new PolicyAttributesValidator({});\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Policy>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n realm?: string,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.PERMISSION_READ,\n PermissionName.PERMISSION_UPDATE,\n PermissionName.PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName, realm);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Policy> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Policy,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Policy | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validate(data, group);\n\n await this.repository.validateJoinColumns(validated);\n\n if (\n validated.parent &&\n validated.parent.type !== BuiltInPolicyType.COMPOSITE\n ) {\n throw new BadRequestError('The parent policy must be of type group.');\n }\n\n if (entity) {\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be updated.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null,\n }),\n });\n\n await this.repository.checkUniqueness(validated, entity);\n\n extendObject(entity, validated);\n\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_CREATE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated, ...this.resourceRealmMatch(validated) }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.saveWithEA(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n private async validate(\n data: Record<string, any>,\n group: string,\n ): Promise<Policy> {\n const validated = await this.validator.run(data, { group });\n\n const attributes = await this.attributesValidator.run(data);\n extendObject(validated, attributes);\n\n if (Array.isArray(data.children)) {\n if (data.type === BuiltInPolicyType.COMPOSITE) {\n const promises = data.children.map(\n (child) => this.validate(child, group),\n );\n validated.children = await Promise.all(promises);\n }\n }\n\n return validated;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Policy> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in policy can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.PERMISSION_DELETE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n\n const { id: entityId } = entity;\n\n await this.repository.deleteFromTree(entity);\n\n entity.id = entityId;\n\n // todo: remove after PolicyEntity - parent delete on cascade\n removeObjectProperty(entity, 'children');\n\n return entity;\n }\n}\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { ValidatorGroup, isPropertySet, isUUID } from "@authup/kit";
5
5
  import { PermissionName, REALM_MASTER_NAME, RealmValidator } from "@authup/core-kit";
6
6
  import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
7
+ import { BuiltInPolicyType, definePolicyData } from "@authup/access";
8
8
  import { BadRequestError, EntityNotFoundError } from "@authup/errors";
9
9
  //#region src/core/entities/realm/service.ts
10
10
  var RealmService = class extends AbstractEntityService {
@@ -57,7 +57,7 @@ var RealmService = class extends AbstractEntityService {
57
57
  if (entity) {
58
58
  await actor.permissionEvaluator.evaluate({
59
59
  name: PermissionName.REALM_UPDATE,
60
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
60
+ data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
61
61
  ...entity,
62
62
  ...validated
63
63
  } })
@@ -72,7 +72,7 @@ var RealmService = class extends AbstractEntityService {
72
72
  }
73
73
  await actor.permissionEvaluator.evaluate({
74
74
  name: PermissionName.REALM_CREATE,
75
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
75
+ data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
76
76
  });
77
77
  entity = this.repository.create(validated);
78
78
  await this.repository.save(entity);
@@ -93,7 +93,7 @@ var RealmService = class extends AbstractEntityService {
93
93
  if (entity.built_in) throw new BadRequestError("A built-in realm can not be deleted.");
94
94
  await actor.permissionEvaluator.evaluate({
95
95
  name: PermissionName.REALM_DELETE,
96
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
96
+ data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
97
97
  });
98
98
  const { id: entityId } = entity;
99
99
  await this.repository.remove(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ValidatorGroup","isPropertySet","isUUID","BadRequestError","EntityNotFoundError","PermissionName","REALM_MASTER_NAME","RealmValidator","AbstractEntityService","RealmService","repository","validator","webClientProvisioner","logger","ctx","getMany","query","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","actor","save","undefined","update","updateOnly","options","group","where","id","name","findOneBy","permissionEvaluator","preEvaluate","REALM_UPDATE","UPDATE","REALM_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","input","ATTRIBUTES","merge","created","ensureForRealm","e","warn","Error","message","String","delete","REALM_DELETE","built_in","entityId","remove"],"sources":["../../../../src/core/entities/realm/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n REALM_MASTER_NAME,\n RealmValidator,\n} from '@authup/core-kit';\nimport type { Realm } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult, Logger } from '@authup/server-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IWebClientProvisioner } from '../client/types.ts';\nimport type { IRealmRepository, IRealmService } from './types.ts';\n\nexport type RealmServiceContext = {\n repository: IRealmRepository;\n webClientProvisioner?: IWebClientProvisioner;\n logger?: Logger;\n};\n\nexport class RealmService extends AbstractEntityService implements IRealmService {\n protected repository: IRealmRepository;\n\n protected validator: RealmValidator;\n\n protected webClientProvisioner?: IWebClientProvisioner;\n\n protected logger?: Logger;\n\n constructor(ctx: RealmServiceContext) {\n super();\n this.repository = ctx.repository;\n this.webClientProvisioner = ctx.webClientProvisioner;\n this.logger = ctx.logger;\n this.validator = new RealmValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n ): Promise<EntityRepositoryFindManyResult<Realm>> {\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n ): Promise<Realm> {\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Realm,\n created: boolean \n }> {\n let group: string;\n\n let entity: Realm | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n if (entity.name === REALM_MASTER_NAME && isPropertySet(validated, 'name') && entity.name !== validated.name) {\n throw new BadRequestError(`The name of the ${REALM_MASTER_NAME} can not be changed.`);\n }\n\n entity = this.repository.merge(entity, validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n // Provision the realm's public `web` client via the system-level\n // provisioner (NOT clientService.create) — it must not be gated on\n // the actor's CLIENT_CREATE, since a realm creator may lack it.\n // Realm creation must stay atomic from the caller's perspective: the\n // realm is already persisted, so a provisioning failure is logged and\n // swallowed (startup provisioning reconciles every realm's web client).\n if (this.webClientProvisioner) {\n try {\n await this.webClientProvisioner.ensureForRealm(entity);\n } catch (e) {\n if (this.logger) {\n this.logger.warn(\n `Failed to provision web client for realm ${entity.id}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n }\n\n return {\n entity,\n created: true,\n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Realm> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in realm can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","ValidatorGroup","isPropertySet","isUUID","BadRequestError","EntityNotFoundError","PermissionName","REALM_MASTER_NAME","RealmValidator","AbstractEntityService","RealmService","repository","validator","webClientProvisioner","logger","ctx","getMany","query","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","actor","save","undefined","update","updateOnly","options","group","where","id","name","findOneBy","permissionEvaluator","preEvaluate","REALM_UPDATE","UPDATE","REALM_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","ATTRIBUTES","merge","created","ensureForRealm","e","warn","Error","message","String","delete","REALM_DELETE","built_in","entityId","remove"],"sources":["../../../../src/core/entities/realm/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n REALM_MASTER_NAME,\n RealmValidator,\n} from '@authup/core-kit';\nimport type { Realm } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult, Logger } from '@authup/server-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IWebClientProvisioner } from '../client/types.ts';\nimport type { IRealmRepository, IRealmService } from './types.ts';\n\nexport type RealmServiceContext = {\n repository: IRealmRepository;\n webClientProvisioner?: IWebClientProvisioner;\n logger?: Logger;\n};\n\nexport class RealmService extends AbstractEntityService implements IRealmService {\n protected repository: IRealmRepository;\n\n protected validator: RealmValidator;\n\n protected webClientProvisioner?: IWebClientProvisioner;\n\n protected logger?: Logger;\n\n constructor(ctx: RealmServiceContext) {\n super();\n this.repository = ctx.repository;\n this.webClientProvisioner = ctx.webClientProvisioner;\n this.logger = ctx.logger;\n this.validator = new RealmValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n ): Promise<EntityRepositoryFindManyResult<Realm>> {\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n ): Promise<Realm> {\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Realm> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Realm,\n created: boolean \n }> {\n let group: string;\n\n let entity: Realm | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n if (entity.name === REALM_MASTER_NAME && isPropertySet(validated, 'name') && entity.name !== validated.name) {\n throw new BadRequestError(`The name of the ${REALM_MASTER_NAME} can not be changed.`);\n }\n\n entity = this.repository.merge(entity, validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_CREATE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n // Provision the realm's public `web` client via the system-level\n // provisioner (NOT clientService.create) — it must not be gated on\n // the actor's CLIENT_CREATE, since a realm creator may lack it.\n // Realm creation must stay atomic from the caller's perspective: the\n // realm is already persisted, so a provisioning failure is logged and\n // swallowed (startup provisioning reconciles every realm's web client).\n if (this.webClientProvisioner) {\n try {\n await this.webClientProvisioner.ensureForRealm(entity);\n } catch (e) {\n if (this.logger) {\n this.logger.warn(\n `Failed to provision web client for realm ${entity.id}: ${e instanceof Error ? e.message : String(e)}`,\n );\n }\n }\n }\n\n return {\n entity,\n created: true,\n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Realm> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.REALM_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.built_in) {\n throw new BadRequestError('A built-in realm can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.REALM_DELETE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}