@ddd-ts-kit/auth 0.0.0-stage → 0.1.0

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 (398) hide show
  1. package/README.md +834 -2
  2. package/dist/abac/attribute-policy.d.ts +13 -0
  3. package/dist/abac/attribute-policy.d.ts.map +1 -0
  4. package/dist/abac/attribute-policy.js +10 -0
  5. package/dist/abac/attribute-policy.js.map +1 -0
  6. package/dist/abac/condition.d.ts +6 -0
  7. package/dist/abac/condition.d.ts.map +1 -0
  8. package/dist/abac/condition.js +10 -0
  9. package/dist/abac/condition.js.map +1 -0
  10. package/dist/abac/policy-based-authorizer.d.ts +23 -0
  11. package/dist/abac/policy-based-authorizer.d.ts.map +1 -0
  12. package/dist/abac/policy-based-authorizer.js +39 -0
  13. package/dist/abac/policy-based-authorizer.js.map +1 -0
  14. package/dist/abac/policy-input.d.ts +17 -0
  15. package/dist/abac/policy-input.d.ts.map +1 -0
  16. package/dist/abac/policy-input.js +2 -0
  17. package/dist/abac/policy-input.js.map +1 -0
  18. package/dist/abac/resource-attribute-values.d.ts +3 -0
  19. package/dist/abac/resource-attribute-values.d.ts.map +1 -0
  20. package/dist/abac/resource-attribute-values.js +2 -0
  21. package/dist/abac/resource-attribute-values.js.map +1 -0
  22. package/dist/abac/resource-attributes.d.ts +8 -0
  23. package/dist/abac/resource-attributes.d.ts.map +1 -0
  24. package/dist/abac/resource-attributes.js +5 -0
  25. package/dist/abac/resource-attributes.js.map +1 -0
  26. package/dist/authentication/actor-of.d.ts +7 -0
  27. package/dist/authentication/actor-of.d.ts.map +1 -0
  28. package/dist/authentication/actor-of.js +9 -0
  29. package/dist/authentication/actor-of.js.map +1 -0
  30. package/dist/authentication/authenticator.d.ts +11 -0
  31. package/dist/authentication/authenticator.d.ts.map +1 -0
  32. package/dist/authentication/authenticator.js +9 -0
  33. package/dist/authentication/authenticator.js.map +1 -0
  34. package/dist/authentication/bearer-credential.d.ts +7 -0
  35. package/dist/authentication/bearer-credential.d.ts.map +1 -0
  36. package/dist/authentication/bearer-credential.js +19 -0
  37. package/dist/authentication/bearer-credential.js.map +1 -0
  38. package/dist/authentication/header-values.d.ts +2 -0
  39. package/dist/authentication/header-values.d.ts.map +1 -0
  40. package/dist/authentication/header-values.js +2 -0
  41. package/dist/authentication/header-values.js.map +1 -0
  42. package/dist/authentication/in-actor-context.d.ts +15 -0
  43. package/dist/authentication/in-actor-context.d.ts.map +1 -0
  44. package/dist/authentication/in-actor-context.js +11 -0
  45. package/dist/authentication/in-actor-context.js.map +1 -0
  46. package/dist/authentication/principal-resolver.d.ts +10 -0
  47. package/dist/authentication/principal-resolver.d.ts.map +1 -0
  48. package/dist/authentication/principal-resolver.js +25 -0
  49. package/dist/authentication/principal-resolver.js.map +1 -0
  50. package/dist/authentication/resolve-session.d.ts +9 -0
  51. package/dist/authentication/resolve-session.d.ts.map +1 -0
  52. package/dist/authentication/resolve-session.js +12 -0
  53. package/dist/authentication/resolve-session.js.map +1 -0
  54. package/dist/authentication/session-authenticator.d.ts +13 -0
  55. package/dist/authentication/session-authenticator.d.ts.map +1 -0
  56. package/dist/authentication/session-authenticator.js +11 -0
  57. package/dist/authentication/session-authenticator.js.map +1 -0
  58. package/dist/authentication/session-of.d.ts +9 -0
  59. package/dist/authentication/session-of.d.ts.map +1 -0
  60. package/dist/authentication/session-of.js +27 -0
  61. package/dist/authentication/session-of.js.map +1 -0
  62. package/dist/authorization/access-scope.d.ts +16 -0
  63. package/dist/authorization/access-scope.d.ts.map +1 -0
  64. package/dist/authorization/access-scope.js +2 -0
  65. package/dist/authorization/access-scope.js.map +1 -0
  66. package/dist/authorization/access.d.ts +17 -0
  67. package/dist/authorization/access.d.ts.map +1 -0
  68. package/dist/authorization/access.js +8 -0
  69. package/dist/authorization/access.js.map +1 -0
  70. package/dist/authorization/authorization-context.d.ts +3 -0
  71. package/dist/authorization/authorization-context.d.ts.map +1 -0
  72. package/dist/authorization/authorization-context.js +2 -0
  73. package/dist/authorization/authorization-context.js.map +1 -0
  74. package/dist/authorization/authorizer.d.ts +15 -0
  75. package/dist/authorization/authorizer.d.ts.map +1 -0
  76. package/dist/authorization/authorizer.js +8 -0
  77. package/dist/authorization/authorizer.js.map +1 -0
  78. package/dist/authorization/check-request.d.ts +11 -0
  79. package/dist/authorization/check-request.d.ts.map +1 -0
  80. package/dist/authorization/check-request.js +2 -0
  81. package/dist/authorization/check-request.js.map +1 -0
  82. package/dist/authorization/decision-record-of.d.ts +7 -0
  83. package/dist/authorization/decision-record-of.d.ts.map +1 -0
  84. package/dist/authorization/decision-record-of.js +11 -0
  85. package/dist/authorization/decision-record-of.js.map +1 -0
  86. package/dist/authorization/decision-record.d.ts +15 -0
  87. package/dist/authorization/decision-record.d.ts.map +1 -0
  88. package/dist/authorization/decision-record.js +2 -0
  89. package/dist/authorization/decision-record.js.map +1 -0
  90. package/dist/authorization/decision.d.ts +10 -0
  91. package/dist/authorization/decision.d.ts.map +1 -0
  92. package/dist/authorization/decision.js +5 -0
  93. package/dist/authorization/decision.js.map +1 -0
  94. package/dist/authorization/denial-reason.d.ts +14 -0
  95. package/dist/authorization/denial-reason.d.ts.map +1 -0
  96. package/dist/authorization/denial-reason.js +14 -0
  97. package/dist/authorization/denial-reason.js.map +1 -0
  98. package/dist/authorization/is-resource-ref.d.ts +4 -0
  99. package/dist/authorization/is-resource-ref.d.ts.map +1 -0
  100. package/dist/authorization/is-resource-ref.js +11 -0
  101. package/dist/authorization/is-resource-ref.js.map +1 -0
  102. package/dist/authorization/list-request.d.ts +8 -0
  103. package/dist/authorization/list-request.d.ts.map +1 -0
  104. package/dist/authorization/list-request.js +2 -0
  105. package/dist/authorization/list-request.js.map +1 -0
  106. package/dist/authorization/on-decision.d.ts +3 -0
  107. package/dist/authorization/on-decision.d.ts.map +1 -0
  108. package/dist/authorization/on-decision.js +2 -0
  109. package/dist/authorization/on-decision.js.map +1 -0
  110. package/dist/authorization/resource-ref.d.ts +6 -0
  111. package/dist/authorization/resource-ref.d.ts.map +1 -0
  112. package/dist/authorization/resource-ref.js +2 -0
  113. package/dist/authorization/resource-ref.js.map +1 -0
  114. package/dist/di/authorization-map-of.d.ts +5 -0
  115. package/dist/di/authorization-map-of.d.ts.map +1 -0
  116. package/dist/di/authorization-map-of.js +30 -0
  117. package/dist/di/authorization-map-of.js.map +1 -0
  118. package/dist/di/authorization-module.d.ts +24 -0
  119. package/dist/di/authorization-module.d.ts.map +1 -0
  120. package/dist/di/authorization-module.js +75 -0
  121. package/dist/di/authorization-module.js.map +1 -0
  122. package/dist/di.d.ts +7 -0
  123. package/dist/di.d.ts.map +1 -0
  124. package/dist/di.js +7 -0
  125. package/dist/di.js.map +1 -0
  126. package/dist/errors/authorization-setup-error.d.ts +5 -0
  127. package/dist/errors/authorization-setup-error.d.ts.map +1 -0
  128. package/dist/errors/authorization-setup-error.js +8 -0
  129. package/dist/errors/authorization-setup-error.js.map +1 -0
  130. package/dist/errors/forbidden-error.d.ts +14 -0
  131. package/dist/errors/forbidden-error.d.ts.map +1 -0
  132. package/dist/errors/forbidden-error.js +18 -0
  133. package/dist/errors/forbidden-error.js.map +1 -0
  134. package/dist/errors/invalid-credential-error.d.ts +8 -0
  135. package/dist/errors/invalid-credential-error.d.ts.map +1 -0
  136. package/dist/errors/invalid-credential-error.js +12 -0
  137. package/dist/errors/invalid-credential-error.js.map +1 -0
  138. package/dist/errors/listing-not-supported-error.d.ts +5 -0
  139. package/dist/errors/listing-not-supported-error.d.ts.map +1 -0
  140. package/dist/errors/listing-not-supported-error.js +8 -0
  141. package/dist/errors/listing-not-supported-error.js.map +1 -0
  142. package/dist/errors/missing-actor-error.d.ts +6 -0
  143. package/dist/errors/missing-actor-error.d.ts.map +1 -0
  144. package/dist/errors/missing-actor-error.js +8 -0
  145. package/dist/errors/missing-actor-error.js.map +1 -0
  146. package/dist/errors/unauthenticated-error.d.ts +12 -0
  147. package/dist/errors/unauthenticated-error.d.ts.map +1 -0
  148. package/dist/errors/unauthenticated-error.js +14 -0
  149. package/dist/errors/unauthenticated-error.js.map +1 -0
  150. package/dist/errors/undeclared-use-case-error.d.ts +9 -0
  151. package/dist/errors/undeclared-use-case-error.d.ts.map +1 -0
  152. package/dist/errors/undeclared-use-case-error.js +11 -0
  153. package/dist/errors/undeclared-use-case-error.js.map +1 -0
  154. package/dist/index.d.ts +51 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +36 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/jwt/claims.d.ts +3 -0
  159. package/dist/jwt/claims.d.ts.map +1 -0
  160. package/dist/jwt/claims.js +2 -0
  161. package/dist/jwt/claims.js.map +1 -0
  162. package/dist/jwt/is-service-account.d.ts +3 -0
  163. package/dist/jwt/is-service-account.d.ts.map +1 -0
  164. package/dist/jwt/is-service-account.js +7 -0
  165. package/dist/jwt/is-service-account.js.map +1 -0
  166. package/dist/jwt/jwt-authenticator.d.ts +45 -0
  167. package/dist/jwt/jwt-authenticator.d.ts.map +1 -0
  168. package/dist/jwt/jwt-authenticator.js +109 -0
  169. package/dist/jwt/jwt-authenticator.js.map +1 -0
  170. package/dist/jwt/keycloak-actor-of.d.ts +6 -0
  171. package/dist/jwt/keycloak-actor-of.d.ts.map +1 -0
  172. package/dist/jwt/keycloak-actor-of.js +56 -0
  173. package/dist/jwt/keycloak-actor-of.js.map +1 -0
  174. package/dist/jwt/keycloak-authentication-method.d.ts +5 -0
  175. package/dist/jwt/keycloak-authentication-method.d.ts.map +1 -0
  176. package/dist/jwt/keycloak-authentication-method.js +6 -0
  177. package/dist/jwt/keycloak-authentication-method.js.map +1 -0
  178. package/dist/jwt/keycloak-authenticator.d.ts +23 -0
  179. package/dist/jwt/keycloak-authenticator.d.ts.map +1 -0
  180. package/dist/jwt/keycloak-authenticator.js +25 -0
  181. package/dist/jwt/keycloak-authenticator.js.map +1 -0
  182. package/dist/jwt/keycloak-claim-options.d.ts +9 -0
  183. package/dist/jwt/keycloak-claim-options.d.ts.map +1 -0
  184. package/dist/jwt/keycloak-claim-options.js +2 -0
  185. package/dist/jwt/keycloak-claim-options.js.map +1 -0
  186. package/dist/jwt/session-of-claims.d.ts +13 -0
  187. package/dist/jwt/session-of-claims.d.ts.map +1 -0
  188. package/dist/jwt/session-of-claims.js +71 -0
  189. package/dist/jwt/session-of-claims.js.map +1 -0
  190. package/dist/jwt/without-trailing-slashes.d.ts +3 -0
  191. package/dist/jwt/without-trailing-slashes.d.ts.map +1 -0
  192. package/dist/jwt/without-trailing-slashes.js +9 -0
  193. package/dist/jwt/without-trailing-slashes.js.map +1 -0
  194. package/dist/jwt.d.ts +3 -0
  195. package/dist/jwt.d.ts.map +1 -0
  196. package/dist/jwt.js +3 -0
  197. package/dist/jwt.js.map +1 -0
  198. package/dist/permissions/define-permissions.d.ts +13 -0
  199. package/dist/permissions/define-permissions.d.ts.map +1 -0
  200. package/dist/permissions/define-permissions.js +23 -0
  201. package/dist/permissions/define-permissions.js.map +1 -0
  202. package/dist/permissions/grant-covers.d.ts +3 -0
  203. package/dist/permissions/grant-covers.d.ts.map +1 -0
  204. package/dist/permissions/grant-covers.js +5 -0
  205. package/dist/permissions/grant-covers.js.map +1 -0
  206. package/dist/permissions/grant-pattern.d.ts +5 -0
  207. package/dist/permissions/grant-pattern.d.ts.map +1 -0
  208. package/dist/permissions/grant-pattern.js +12 -0
  209. package/dist/permissions/grant-pattern.js.map +1 -0
  210. package/dist/permissions/grant.d.ts +4 -0
  211. package/dist/permissions/grant.d.ts.map +1 -0
  212. package/dist/permissions/grant.js +2 -0
  213. package/dist/permissions/grant.js.map +1 -0
  214. package/dist/permissions/is-permission.d.ts +3 -0
  215. package/dist/permissions/is-permission.d.ts.map +1 -0
  216. package/dist/permissions/is-permission.js +10 -0
  217. package/dist/permissions/is-permission.js.map +1 -0
  218. package/dist/permissions/permission-registry.d.ts +12 -0
  219. package/dist/permissions/permission-registry.d.ts.map +1 -0
  220. package/dist/permissions/permission-registry.js +31 -0
  221. package/dist/permissions/permission-registry.js.map +1 -0
  222. package/dist/permissions/permission.d.ts +9 -0
  223. package/dist/permissions/permission.d.ts.map +1 -0
  224. package/dist/permissions/permission.js +2 -0
  225. package/dist/permissions/permission.js.map +1 -0
  226. package/dist/policies/define-policy.d.ts +4 -0
  227. package/dist/policies/define-policy.d.ts.map +1 -0
  228. package/dist/policies/define-policy.js +10 -0
  229. package/dist/policies/define-policy.js.map +1 -0
  230. package/dist/policies/policy-access.d.ts +32 -0
  231. package/dist/policies/policy-access.d.ts.map +1 -0
  232. package/dist/policies/policy-access.js +78 -0
  233. package/dist/policies/policy-access.js.map +1 -0
  234. package/dist/policies/policy-context.d.ts +5 -0
  235. package/dist/policies/policy-context.d.ts.map +1 -0
  236. package/dist/policies/policy-context.js +2 -0
  237. package/dist/policies/policy-context.js.map +1 -0
  238. package/dist/policies/policy.d.ts +18 -0
  239. package/dist/policies/policy.d.ts.map +1 -0
  240. package/dist/policies/policy.js +2 -0
  241. package/dist/policies/policy.js.map +1 -0
  242. package/dist/rbac/role-based-authorizer.d.ts +35 -0
  243. package/dist/rbac/role-based-authorizer.d.ts.map +1 -0
  244. package/dist/rbac/role-based-authorizer.js +68 -0
  245. package/dist/rbac/role-based-authorizer.js.map +1 -0
  246. package/dist/rbac/tenant-of-context.d.ts +4 -0
  247. package/dist/rbac/tenant-of-context.d.ts.map +1 -0
  248. package/dist/rbac/tenant-of-context.js +6 -0
  249. package/dist/rbac/tenant-of-context.js.map +1 -0
  250. package/dist/rebac/define-schema.d.ts +8 -0
  251. package/dist/rebac/define-schema.d.ts.map +1 -0
  252. package/dist/rebac/define-schema.js +99 -0
  253. package/dist/rebac/define-schema.js.map +1 -0
  254. package/dist/rebac/evaluation.d.ts +31 -0
  255. package/dist/rebac/evaluation.d.ts.map +1 -0
  256. package/dist/rebac/evaluation.js +94 -0
  257. package/dist/rebac/evaluation.js.map +1 -0
  258. package/dist/rebac/expand-node.d.ts +13 -0
  259. package/dist/rebac/expand-node.d.ts.map +1 -0
  260. package/dist/rebac/expand-node.js +2 -0
  261. package/dist/rebac/expand-node.js.map +1 -0
  262. package/dist/rebac/in-memory-relation-tuple-store.d.ts +12 -0
  263. package/dist/rebac/in-memory-relation-tuple-store.d.ts.map +1 -0
  264. package/dist/rebac/in-memory-relation-tuple-store.js +25 -0
  265. package/dist/rebac/in-memory-relation-tuple-store.js.map +1 -0
  266. package/dist/rebac/invalid-tuple-error.d.ts +5 -0
  267. package/dist/rebac/invalid-tuple-error.d.ts.map +1 -0
  268. package/dist/rebac/invalid-tuple-error.js +8 -0
  269. package/dist/rebac/invalid-tuple-error.js.map +1 -0
  270. package/dist/rebac/object-of.d.ts +3 -0
  271. package/dist/rebac/object-of.d.ts.map +1 -0
  272. package/dist/rebac/object-of.js +4 -0
  273. package/dist/rebac/object-of.js.map +1 -0
  274. package/dist/rebac/parse-object.d.ts +3 -0
  275. package/dist/rebac/parse-object.d.ts.map +1 -0
  276. package/dist/rebac/parse-object.js +10 -0
  277. package/dist/rebac/parse-object.js.map +1 -0
  278. package/dist/rebac/parse-subject.d.ts +3 -0
  279. package/dist/rebac/parse-subject.d.ts.map +1 -0
  280. package/dist/rebac/parse-subject.js +11 -0
  281. package/dist/rebac/parse-subject.js.map +1 -0
  282. package/dist/rebac/permission-mapping.d.ts +3 -0
  283. package/dist/rebac/permission-mapping.d.ts.map +1 -0
  284. package/dist/rebac/permission-mapping.js +2 -0
  285. package/dist/rebac/permission-mapping.js.map +1 -0
  286. package/dist/rebac/relation-based-authorizer.d.ts +45 -0
  287. package/dist/rebac/relation-based-authorizer.d.ts.map +1 -0
  288. package/dist/rebac/relation-based-authorizer.js +113 -0
  289. package/dist/rebac/relation-based-authorizer.js.map +1 -0
  290. package/dist/rebac/relation-tuple-store.d.ts +16 -0
  291. package/dist/rebac/relation-tuple-store.d.ts.map +1 -0
  292. package/dist/rebac/relation-tuple-store.js +8 -0
  293. package/dist/rebac/relation-tuple-store.js.map +1 -0
  294. package/dist/rebac/relation-tuple.d.ts +12 -0
  295. package/dist/rebac/relation-tuple.d.ts.map +1 -0
  296. package/dist/rebac/relation-tuple.js +2 -0
  297. package/dist/rebac/relation-tuple.js.map +1 -0
  298. package/dist/rebac/resolution.d.ts +9 -0
  299. package/dist/rebac/resolution.d.ts.map +1 -0
  300. package/dist/rebac/resolution.js +2 -0
  301. package/dist/rebac/resolution.js.map +1 -0
  302. package/dist/rebac/reverse-expansion-limit-error.d.ts +5 -0
  303. package/dist/rebac/reverse-expansion-limit-error.d.ts.map +1 -0
  304. package/dist/rebac/reverse-expansion-limit-error.js +8 -0
  305. package/dist/rebac/reverse-expansion-limit-error.js.map +1 -0
  306. package/dist/rebac/rewrite.d.ts +24 -0
  307. package/dist/rebac/rewrite.d.ts.map +1 -0
  308. package/dist/rebac/rewrite.js +15 -0
  309. package/dist/rebac/rewrite.js.map +1 -0
  310. package/dist/rebac/schema-checked-tuple-store.d.ts +14 -0
  311. package/dist/rebac/schema-checked-tuple-store.d.ts.map +1 -0
  312. package/dist/rebac/schema-checked-tuple-store.js +25 -0
  313. package/dist/rebac/schema-checked-tuple-store.js.map +1 -0
  314. package/dist/rebac/schema-definition.d.ts +3 -0
  315. package/dist/rebac/schema-definition.d.ts.map +1 -0
  316. package/dist/rebac/schema-definition.js +2 -0
  317. package/dist/rebac/schema-definition.js.map +1 -0
  318. package/dist/rebac/schema-error.d.ts +5 -0
  319. package/dist/rebac/schema-error.d.ts.map +1 -0
  320. package/dist/rebac/schema-error.js +8 -0
  321. package/dist/rebac/schema-error.js.map +1 -0
  322. package/dist/rebac/schema.d.ts +18 -0
  323. package/dist/rebac/schema.d.ts.map +1 -0
  324. package/dist/rebac/schema.js +49 -0
  325. package/dist/rebac/schema.js.map +1 -0
  326. package/dist/rebac/subject-ref.d.ts +6 -0
  327. package/dist/rebac/subject-ref.d.ts.map +1 -0
  328. package/dist/rebac/subject-ref.js +2 -0
  329. package/dist/rebac/subject-ref.js.map +1 -0
  330. package/dist/rebac/tuple-key.d.ts +3 -0
  331. package/dist/rebac/tuple-key.d.ts.map +1 -0
  332. package/dist/rebac/tuple-key.js +4 -0
  333. package/dist/rebac/tuple-key.js.map +1 -0
  334. package/dist/rebac/type-definition.d.ts +7 -0
  335. package/dist/rebac/type-definition.d.ts.map +1 -0
  336. package/dist/rebac/type-definition.js +2 -0
  337. package/dist/rebac/type-definition.js.map +1 -0
  338. package/dist/rebac.d.ts +22 -0
  339. package/dist/rebac.d.ts.map +1 -0
  340. package/dist/rebac.js +15 -0
  341. package/dist/rebac.js.map +1 -0
  342. package/dist/testing/actor-builder.d.ts +21 -0
  343. package/dist/testing/actor-builder.d.ts.map +1 -0
  344. package/dist/testing/actor-builder.js +26 -0
  345. package/dist/testing/actor-builder.js.map +1 -0
  346. package/dist/testing/allow-all.d.ts +9 -0
  347. package/dist/testing/allow-all.d.ts.map +1 -0
  348. package/dist/testing/allow-all.js +11 -0
  349. package/dist/testing/allow-all.js.map +1 -0
  350. package/dist/testing/an-actor.d.ts +4 -0
  351. package/dist/testing/an-actor.d.ts.map +1 -0
  352. package/dist/testing/an-actor.js +7 -0
  353. package/dist/testing/an-actor.js.map +1 -0
  354. package/dist/testing/authorizer-contract.d.ts +18 -0
  355. package/dist/testing/authorizer-contract.d.ts.map +1 -0
  356. package/dist/testing/authorizer-contract.js +102 -0
  357. package/dist/testing/authorizer-contract.js.map +1 -0
  358. package/dist/testing/deny-all.d.ts +10 -0
  359. package/dist/testing/deny-all.d.ts.map +1 -0
  360. package/dist/testing/deny-all.js +14 -0
  361. package/dist/testing/deny-all.js.map +1 -0
  362. package/dist/testing/fake-authenticator.d.ts +13 -0
  363. package/dist/testing/fake-authenticator.d.ts.map +1 -0
  364. package/dist/testing/fake-authenticator.js +26 -0
  365. package/dist/testing/fake-authenticator.js.map +1 -0
  366. package/dist/testing/recording-authorizer.d.ts +15 -0
  367. package/dist/testing/recording-authorizer.d.ts.map +1 -0
  368. package/dist/testing/recording-authorizer.js +19 -0
  369. package/dist/testing/recording-authorizer.js.map +1 -0
  370. package/dist/testing/relation-tuple-store-contract.d.ts +10 -0
  371. package/dist/testing/relation-tuple-store-contract.d.ts.map +1 -0
  372. package/dist/testing/relation-tuple-store-contract.js +68 -0
  373. package/dist/testing/relation-tuple-store-contract.js.map +1 -0
  374. package/dist/testing.d.ts +9 -0
  375. package/dist/testing.d.ts.map +1 -0
  376. package/dist/testing.js +9 -0
  377. package/dist/testing.js.map +1 -0
  378. package/dist/use-cases/authorization-map.d.ts +18 -0
  379. package/dist/use-cases/authorization-map.d.ts.map +1 -0
  380. package/dist/use-cases/authorization-map.js +32 -0
  381. package/dist/use-cases/authorization-map.js.map +1 -0
  382. package/dist/use-cases/authorization-middleware.d.ts +17 -0
  383. package/dist/use-cases/authorization-middleware.d.ts.map +1 -0
  384. package/dist/use-cases/authorization-middleware.js +49 -0
  385. package/dist/use-cases/authorization-middleware.js.map +1 -0
  386. package/dist/use-cases/public-use-case.d.ts +5 -0
  387. package/dist/use-cases/public-use-case.d.ts.map +1 -0
  388. package/dist/use-cases/public-use-case.js +5 -0
  389. package/dist/use-cases/public-use-case.js.map +1 -0
  390. package/dist/use-cases/requires.d.ts +17 -0
  391. package/dist/use-cases/requires.d.ts.map +1 -0
  392. package/dist/use-cases/requires.js +14 -0
  393. package/dist/use-cases/requires.js.map +1 -0
  394. package/dist/use-cases/use-case-declaration.d.ts +17 -0
  395. package/dist/use-cases/use-case-declaration.d.ts.map +1 -0
  396. package/dist/use-cases/use-case-declaration.js +2 -0
  397. package/dist/use-cases/use-case-declaration.js.map +1 -0
  398. package/package.json +67 -4
@@ -0,0 +1,68 @@
1
+ import { isAnonymous, isSystem } from '@ddd-ts-kit/kernel';
2
+ import { ALLOWED, deny } from '../authorization/decision.js';
3
+ import { DenialReason } from '../authorization/denial-reason.js';
4
+ import { AuthorizationSetupError } from '../errors/authorization-setup-error.js';
5
+ import { grantCovers } from '../permissions/grant-covers.js';
6
+ import { grantPattern } from '../permissions/grant-pattern.js';
7
+ /** RBAC: an actor may do what one of its roles grants. It decides on actions, not on elements. */
8
+ export class RoleBasedAuthorizer {
9
+ options;
10
+ grants;
11
+ constructor(options) {
12
+ this.options = options;
13
+ this.grants = effectiveGrants(options);
14
+ }
15
+ async check(request) {
16
+ if (isAnonymous(request.actor)) {
17
+ return deny(DenialReason.anonymous);
18
+ }
19
+ if (!this.holds(request.actor, request.permission)) {
20
+ return deny(DenialReason.noMatchingRole);
21
+ }
22
+ return (await this.targetsAnotherTenant(request)) ? deny(DenialReason.tenantMismatch) : ALLOWED;
23
+ }
24
+ /** Constant time: everything, nothing, or the rows of the actor's tenant. */
25
+ async listAccessible({ actor, permission }) {
26
+ if (isAnonymous(actor) || !this.holds(actor, permission)) {
27
+ return { kind: 'none' };
28
+ }
29
+ if (this.options.tenantOf === undefined || this.crossesTenants(actor)) {
30
+ return { kind: 'all' };
31
+ }
32
+ return actor.tenantId === undefined ? { kind: 'none' } : { kind: 'filter', filter: { tenantId: actor.tenantId } };
33
+ }
34
+ holds(actor, permission) {
35
+ return this.rolesOf(actor).some((role) => (this.grants.get(role) ?? []).some((pattern) => grantCovers(pattern, permission)));
36
+ }
37
+ rolesOf(actor) {
38
+ const { systemRole } = this.options;
39
+ return isSystem(actor) && systemRole !== undefined ? [...actor.roles, systemRole] : actor.roles;
40
+ }
41
+ async targetsAnotherTenant(request) {
42
+ if (this.options.tenantOf === undefined || this.crossesTenants(request.actor)) {
43
+ return false;
44
+ }
45
+ const targeted = await this.options.tenantOf(request);
46
+ return targeted !== undefined && targeted !== request.actor.tenantId;
47
+ }
48
+ crossesTenants(actor) {
49
+ const crossing = this.options.crossTenantRoles ?? [];
50
+ return this.rolesOf(actor).some((role) => crossing.includes(role));
51
+ }
52
+ }
53
+ function effectiveGrants(options) {
54
+ const inherits = options.inherits ?? {};
55
+ const roles = new Set([...Object.keys(options.roles), ...Object.keys(inherits)]);
56
+ const own = new Map([...roles].map((role) => [role, (options.roles[role] ?? []).map(grantPattern)]));
57
+ const lineage = (role, path) => {
58
+ if (!roles.has(role)) {
59
+ throw new AuthorizationSetupError(`Role "${path.at(-1) ?? role}" inherits the unknown role "${role}".`);
60
+ }
61
+ if (path.includes(role)) {
62
+ throw new AuthorizationSetupError(`Role hierarchy cycle: ${[...path, role].join(' -> ')}.`);
63
+ }
64
+ return [role, ...(inherits[role] ?? []).flatMap((parent) => lineage(parent, [...path, role]))];
65
+ };
66
+ return new Map([...roles].map((role) => [role, [...new Set(lineage(role, []).flatMap((ancestor) => own.get(ancestor) ?? []))]]));
67
+ }
68
+ //# sourceMappingURL=role-based-authorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-based-authorizer.js","sourceRoot":"","sources":["../../src/rbac/role-based-authorizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CheckRequest } from '../authorization/check-request.js';
2
+ /** For `tenantOf`: reads `context.tenantId`, which `requires(..., { context })` provides. */
3
+ export declare function tenantOfContext(request: CheckRequest): string | undefined;
4
+ //# sourceMappingURL=tenant-of-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-of-context.d.ts","sourceRoot":"","sources":["../../src/rbac/tenant-of-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAIzE"}
@@ -0,0 +1,6 @@
1
+ /** For `tenantOf`: reads `context.tenantId`, which `requires(..., { context })` provides. */
2
+ export function tenantOfContext(request) {
3
+ const tenantId = request.context?.['tenantId'];
4
+ return typeof tenantId === 'string' ? tenantId : undefined;
5
+ }
6
+ //# sourceMappingURL=tenant-of-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-of-context.js","sourceRoot":"","sources":["../../src/rbac/tenant-of-context.ts"],"names":[],"mappings":"AAEA,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;IAE/C,OAAO,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Schema } from './schema.js';
2
+ import type { SchemaDefinition } from './schema-definition.js';
3
+ /**
4
+ * The object types, their relations and how permissions derive from them. Validated here, so
5
+ * an unknown type or relation, or a rewrite that could never terminate, never reaches a check.
6
+ */
7
+ export declare function defineSchema(definition: SchemaDefinition): Schema;
8
+ //# sourceMappingURL=define-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-schema.d.ts","sourceRoot":"","sources":["../../src/rebac/define-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAcjE"}
@@ -0,0 +1,99 @@
1
+ import { Schema } from './schema.js';
2
+ import { SchemaError } from './schema-error.js';
3
+ /**
4
+ * The object types, their relations and how permissions derive from them. Validated here, so
5
+ * an unknown type or relation, or a rewrite that could never terminate, never reaches a check.
6
+ */
7
+ export function defineSchema(definition) {
8
+ const schema = new Schema(definition);
9
+ for (const type of schema.types()) {
10
+ assertNoNameClash(schema, type);
11
+ assertSubjectsExist(schema, type);
12
+ for (const [name, rewrite] of Object.entries(schema.permissions(type))) {
13
+ assertResolves(schema, { type, name }, rewrite);
14
+ assertTerminates(schema, type, [name]);
15
+ }
16
+ }
17
+ return schema;
18
+ }
19
+ function assertNoNameClash(schema, type) {
20
+ const relations = Object.keys(schema.relations(type));
21
+ const clash = Object.keys(schema.permissions(type)).find((name) => relations.includes(name));
22
+ if (clash !== undefined) {
23
+ throw new SchemaError(`"${type}" declares "${clash}" both as a relation and as a permission.`);
24
+ }
25
+ }
26
+ function assertSubjectsExist(schema, type) {
27
+ for (const [name, subjects] of Object.entries(schema.relations(type))) {
28
+ for (const subject of subjects) {
29
+ const [subjectType = '', relation] = subject.split('#');
30
+ if (!schema.types().includes(subjectType)) {
31
+ throw new SchemaError(`"${type}#${name}" accepts the unknown type "${subjectType}".`);
32
+ }
33
+ if (relation !== undefined && schema.resolve(subjectType, relation) === undefined) {
34
+ throw new SchemaError(`"${type}#${name}" accepts "${subject}", but "${subjectType}" has no "${relation}".`);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ function assertResolves(schema, at, rewrite) {
40
+ if (typeof rewrite === 'string') {
41
+ if (schema.resolve(at.type, rewrite) !== undefined) {
42
+ return;
43
+ }
44
+ throw new SchemaError(`"${at.type}#${at.name}" refers to "${rewrite}", which "${at.type}" does not declare.`);
45
+ }
46
+ if (rewrite.kind === 'from') {
47
+ assertFollows(schema, at, rewrite);
48
+ return;
49
+ }
50
+ const children = rewrite.kind === 'exclusion' ? [rewrite.base, rewrite.subtract] : rewrite.children;
51
+ if (children.length === 0) {
52
+ throw new SchemaError(`"${at.type}#${at.name}" has an empty ${rewrite.kind}.`);
53
+ }
54
+ for (const child of children) {
55
+ assertResolves(schema, at, child);
56
+ }
57
+ }
58
+ function assertFollows(schema, at, { relation, permission }) {
59
+ const followed = schema.resolve(at.type, relation);
60
+ if (followed?.kind !== 'relation') {
61
+ throw new SchemaError(`"${at.type}#${at.name}" follows "${relation}", which is not a relation of "${at.type}".`);
62
+ }
63
+ for (const target of followed.subjects) {
64
+ if (target.includes('#')) {
65
+ throw new SchemaError(`"${at.type}#${at.name}" follows "${relation}", which accepts the userset "${target}": only objects can be followed.`);
66
+ }
67
+ if (schema.resolve(target, permission) === undefined) {
68
+ throw new SchemaError(`"${at.type}#${at.name}" asks "${permission}" of "${target}", which does not declare it.`);
69
+ }
70
+ }
71
+ }
72
+ /**
73
+ * A permission defined by itself through names alone (`edit: 'view'`, `view: 'edit'`) reads
74
+ * no tuple and would loop for ever. A loop through `from` or a userset reads a tuple at each
75
+ * turn: it depends on the data and is cut at run time by the cycle protection.
76
+ */
77
+ function assertTerminates(schema, type, path) {
78
+ const rewrite = schema.permissions(type)[path.at(-1) ?? ''];
79
+ if (rewrite === undefined) {
80
+ return;
81
+ }
82
+ for (const name of namesIn(rewrite)) {
83
+ if (path.includes(name)) {
84
+ throw new SchemaError(`"${type}" has a rewrite that cannot terminate: ${[...path, name].join(' -> ')}.`);
85
+ }
86
+ assertTerminates(schema, type, [...path, name]);
87
+ }
88
+ }
89
+ function namesIn(rewrite) {
90
+ if (typeof rewrite === 'string') {
91
+ return [rewrite];
92
+ }
93
+ if (rewrite.kind === 'from') {
94
+ return [];
95
+ }
96
+ const children = rewrite.kind === 'exclusion' ? [rewrite.base, rewrite.subtract] : rewrite.children;
97
+ return children.flatMap(namesIn);
98
+ }
99
+ //# sourceMappingURL=define-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-schema.js","sourceRoot":"","sources":["../../src/rebac/define-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ExpandNode } from './expand-node.js';
2
+ import type { RelationTupleStore } from './relation-tuple-store.js';
3
+ import type { Schema } from './schema.js';
4
+ export interface EvaluationOptions {
5
+ readonly schema: Schema;
6
+ readonly store: RelationTupleStore;
7
+ /** `<type>:<id>` of who is asking. */
8
+ readonly subject: string;
9
+ readonly maxDepth: number;
10
+ /** Visits every branch instead of stopping at the first that settles the answer. */
11
+ readonly exhaustive: boolean;
12
+ }
13
+ /** One question, answered by walking the rewrites of the schema over the stored tuples. */
14
+ export declare class Evaluation {
15
+ private readonly options;
16
+ private cutByDepthLimit;
17
+ constructor(options: EvaluationOptions);
18
+ /** True when a branch was cut by the depth limit: the answer is then not to be trusted. */
19
+ get depthExceeded(): boolean;
20
+ evaluate(object: string, relation: string, path?: readonly string[]): Promise<ExpandNode>;
21
+ private relation;
22
+ /** Runs the steps in order and stops at the first whose answer is `settling`, unless exhaustive. */
23
+ private until;
24
+ private tuple;
25
+ private rewrite;
26
+ private computed;
27
+ private from;
28
+ private exclusion;
29
+ private set;
30
+ }
31
+ //# sourceMappingURL=evaluation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation.d.ts","sourceRoot":"","sources":["../../src/rebac/evaluation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,sCAAsC;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAWD,2FAA2F;AAC3F,qBAAa,UAAU;IAGT,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,eAAe,CAAS;IAEhC,YAA6B,OAAO,EAAE,iBAAiB,EAAI;IAE3D,2FAA2F;IAC3F,IAAI,aAAa,IAAI,OAAO,CAE3B;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBlG;YAEa,QAAQ;IAWtB,oGAAoG;YACtF,KAAK;YAgBL,KAAK;IAYnB,OAAO,CAAC,OAAO;YAYD,QAAQ;YAMR,IAAI;YAYJ,SAAS;YAYT,GAAG;CAYlB"}
@@ -0,0 +1,94 @@
1
+ import { parseObject } from './parse-object.js';
2
+ /** One question, answered by walking the rewrites of the schema over the stored tuples. */
3
+ export class Evaluation {
4
+ options;
5
+ cutByDepthLimit = false;
6
+ constructor(options) {
7
+ this.options = options;
8
+ }
9
+ /** True when a branch was cut by the depth limit: the answer is then not to be trusted. */
10
+ get depthExceeded() {
11
+ return this.cutByDepthLimit;
12
+ }
13
+ async evaluate(object, relation, path = []) {
14
+ const key = `${object}#${relation}`;
15
+ const here = { object, relation, path: [...path, key] };
16
+ if (path.includes(key)) {
17
+ return node(here, { via: 'cycle', allowed: false });
18
+ }
19
+ if (path.length >= this.options.maxDepth) {
20
+ this.cutByDepthLimit = true;
21
+ return node(here, { via: 'depth-limit', allowed: false });
22
+ }
23
+ const resolution = this.options.schema.resolve(parseObject(object).type, relation);
24
+ if (resolution === undefined) {
25
+ return node(here, { via: 'unknown', allowed: false });
26
+ }
27
+ return resolution.kind === 'relation' ? this.relation(here) : this.rewrite(here, resolution.rewrite);
28
+ }
29
+ async relation(here) {
30
+ const tuples = await this.options.store.readByObject(here.object, here.relation);
31
+ const children = await this.until(true, tuples.map((tuple) => () => this.tuple(here, tuple)));
32
+ return node(here, { via: 'relation', allowed: children.some(isAllowed), children });
33
+ }
34
+ /** Runs the steps in order and stops at the first whose answer is `settling`, unless exhaustive. */
35
+ async until(settling, steps) {
36
+ const visited = [];
37
+ for (const step of steps) {
38
+ const outcome = await step();
39
+ visited.push(outcome);
40
+ if (!this.options.exhaustive && outcome.allowed === settling) {
41
+ break;
42
+ }
43
+ }
44
+ return visited;
45
+ }
46
+ async tuple(here, tuple) {
47
+ const [object = '', relation] = tuple.subject.split('#');
48
+ if (relation === undefined) {
49
+ return node(here, { via: 'direct', allowed: tuple.subject === this.options.subject, tuple });
50
+ }
51
+ const members = await this.evaluate(object, relation, here.path);
52
+ return node(here, { via: 'userset', allowed: members.allowed, children: [members], tuple });
53
+ }
54
+ rewrite(here, rewrite) {
55
+ if (typeof rewrite === 'string') {
56
+ return this.computed(here, rewrite);
57
+ }
58
+ if (rewrite.kind === 'from') {
59
+ return this.from(here, rewrite);
60
+ }
61
+ return rewrite.kind === 'exclusion' ? this.exclusion(here, rewrite) : this.set(here, rewrite);
62
+ }
63
+ async computed(here, name) {
64
+ const child = await this.evaluate(here.object, name, here.path);
65
+ return node(here, { via: 'computed', allowed: child.allowed, children: [child] });
66
+ }
67
+ async from(here, { relation, permission }) {
68
+ const tuples = await this.options.store.readByObject(here.object, relation);
69
+ const followed = tuples.filter((tuple) => !tuple.subject.includes('#'));
70
+ const children = await this.until(true, followed.map((tuple) => async () => ({ ...(await this.evaluate(tuple.subject, permission, here.path)), tuple })));
71
+ return node(here, { via: 'from', allowed: children.some(isAllowed), children });
72
+ }
73
+ async exclusion(here, { base, subtract }) {
74
+ const kept = await this.rewrite(here, base);
75
+ if (!kept.allowed && !this.options.exhaustive) {
76
+ return node(here, { via: 'exclusion', allowed: false, children: [kept] });
77
+ }
78
+ const removed = await this.rewrite(here, subtract);
79
+ return node(here, { via: 'exclusion', allowed: kept.allowed && !removed.allowed, children: [kept, removed] });
80
+ }
81
+ async set(here, { kind, children }) {
82
+ const settles = kind === 'union';
83
+ const visited = await this.until(settles, children.map((child) => () => this.rewrite(here, child)));
84
+ const allowed = settles ? visited.some(isAllowed) : visited.every(isAllowed);
85
+ return node(here, { via: kind, allowed, children: visited });
86
+ }
87
+ }
88
+ function node({ object, relation }, outcome) {
89
+ return { object, relation, children: [], ...outcome };
90
+ }
91
+ function isAllowed(outcome) {
92
+ return outcome.allowed;
93
+ }
94
+ //# sourceMappingURL=evaluation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation.js","sourceRoot":"","sources":["../../src/rebac/evaluation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RelationTuple } from './relation-tuple.js';
2
+ /** One step of an evaluation: what was asked of which object, how, and with what answer. */
3
+ export interface ExpandNode {
4
+ readonly object: string;
5
+ /** The relation or permission evaluated on the object. */
6
+ readonly relation: string;
7
+ readonly via: 'relation' | 'direct' | 'userset' | 'computed' | 'union' | 'intersection' | 'exclusion' | 'from' | 'cycle' | 'depth-limit' | 'unknown';
8
+ readonly allowed: boolean;
9
+ /** The stored fact that led to this step. */
10
+ readonly tuple?: RelationTuple;
11
+ readonly children: readonly ExpandNode[];
12
+ }
13
+ //# sourceMappingURL=expand-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-node.d.ts","sourceRoot":"","sources":["../../src/rebac/expand-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EACR,UAAU,GACV,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,GACP,cAAc,GACd,WAAW,GACX,MAAM,GACN,OAAO,GACP,aAAa,GACb,SAAS,CAAC;IACd,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CAC1C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=expand-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-node.js","sourceRoot":"","sources":["../../src/rebac/expand-node.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { RelationTuple } from './relation-tuple.js';
2
+ import type { RelationTupleStore } from './relation-tuple-store.js';
3
+ export declare class InMemoryRelationTupleStore implements RelationTupleStore {
4
+ private readonly tuples;
5
+ write(tuples: readonly RelationTuple[]): Promise<void>;
6
+ delete(tuples: readonly RelationTuple[]): Promise<void>;
7
+ readByObject(object: string, relation: string): Promise<readonly RelationTuple[]>;
8
+ readBySubject(subject: string): Promise<readonly RelationTuple[]>;
9
+ /** Every stored tuple, for the assertions of a test. */
10
+ all(): readonly RelationTuple[];
11
+ }
12
+ //# sourceMappingURL=in-memory-relation-tuple-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-relation-tuple-store.d.ts","sourceRoot":"","sources":["../../src/rebac/in-memory-relation-tuple-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,qBAAa,0BAA2B,YAAW,kBAAkB;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAErD,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI3D;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;IAEK,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAEtF;IAEK,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAEtE;IAED,wDAAwD;IACxD,GAAG,IAAI,SAAS,aAAa,EAAE,CAE9B;CACF"}
@@ -0,0 +1,25 @@
1
+ import { tupleKey } from './tuple-key.js';
2
+ export class InMemoryRelationTupleStore {
3
+ tuples = new Map();
4
+ async write(tuples) {
5
+ for (const tuple of tuples) {
6
+ this.tuples.set(tupleKey(tuple), { ...tuple });
7
+ }
8
+ }
9
+ async delete(tuples) {
10
+ for (const tuple of tuples) {
11
+ this.tuples.delete(tupleKey(tuple));
12
+ }
13
+ }
14
+ async readByObject(object, relation) {
15
+ return this.all().filter((tuple) => tuple.object === object && tuple.relation === relation);
16
+ }
17
+ async readBySubject(subject) {
18
+ return this.all().filter((tuple) => tuple.subject === subject);
19
+ }
20
+ /** Every stored tuple, for the assertions of a test. */
21
+ all() {
22
+ return [...this.tuples.values()];
23
+ }
24
+ }
25
+ //# sourceMappingURL=in-memory-relation-tuple-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-relation-tuple-store.js","sourceRoot":"","sources":["../../src/rebac/in-memory-relation-tuple-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,MAAM,OAAO,0BAA0B;IACpB,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE3D,KAAK,CAAC,KAAK,CAAC,MAAgC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAgC;QAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,QAAgB;QACjD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,wDAAwD;IACxD,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /** A tuple that cannot be read or that the schema does not allow. */
2
+ export declare class InvalidTupleError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ //# sourceMappingURL=invalid-tuple-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-tuple-error.d.ts","sourceRoot":"","sources":["../../src/rebac/invalid-tuple-error.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF"}
@@ -0,0 +1,8 @@
1
+ /** A tuple that cannot be read or that the schema does not allow. */
2
+ export class InvalidTupleError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'InvalidTupleError';
6
+ }
7
+ }
8
+ //# sourceMappingURL=invalid-tuple-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-tuple-error.js","sourceRoot":"","sources":["../../src/rebac/invalid-tuple-error.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { ResourceRef } from '../authorization/resource-ref.js';
2
+ export declare function objectOf(resource: ResourceRef): string;
3
+ //# sourceMappingURL=object-of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-of.d.ts","sourceRoot":"","sources":["../../src/rebac/object-of.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,4 @@
1
+ export function objectOf(resource) {
2
+ return `${resource.type}:${resource.id}`;
3
+ }
4
+ //# sourceMappingURL=object-of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-of.js","sourceRoot":"","sources":["../../src/rebac/object-of.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,QAAqB;IAC5C,OAAO,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ResourceRef } from '../authorization/resource-ref.js';
2
+ export declare function parseObject(object: string): ResourceRef;
3
+ //# sourceMappingURL=parse-object.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-object.d.ts","sourceRoot":"","sources":["../../src/rebac/parse-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAKpE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAQvD"}
@@ -0,0 +1,10 @@
1
+ import { InvalidTupleError } from './invalid-tuple-error.js';
2
+ const OBJECT_PATTERN = /^([a-z][a-z0-9_-]*):([^#@\s]+)$/;
3
+ export function parseObject(object) {
4
+ const [, type, id] = OBJECT_PATTERN.exec(object) ?? [];
5
+ if (type === undefined || id === undefined) {
6
+ throw new InvalidTupleError(`"${object}" is not an object: expected <type>:<id>.`);
7
+ }
8
+ return { type, id };
9
+ }
10
+ //# sourceMappingURL=parse-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-object.js","sourceRoot":"","sources":["../../src/rebac/parse-object.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,cAAc,GAAG,iCAAiC,CAAC;AAEzD,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,IAAI,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,iBAAiB,CAAC,IAAI,MAAM,2CAA2C,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SubjectRef } from './subject-ref.js';
2
+ export declare function parseSubject(subject: string): SubjectRef;
3
+ //# sourceMappingURL=parse-subject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-subject.d.ts","sourceRoot":"","sources":["../../src/rebac/parse-subject.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAQxD"}
@@ -0,0 +1,11 @@
1
+ import { InvalidTupleError } from './invalid-tuple-error.js';
2
+ import { parseObject } from './parse-object.js';
3
+ const NAME_PATTERN = /^[a-z][a-z0-9_-]*$/;
4
+ export function parseSubject(subject) {
5
+ const [object = '', relation, ...rest] = subject.split('#');
6
+ if (rest.length > 0 || (relation !== undefined && !NAME_PATTERN.test(relation))) {
7
+ throw new InvalidTupleError(`"${subject}" is not a subject: expected <type>:<id> or <type>:<id>#<relation>.`);
8
+ }
9
+ return relation === undefined ? parseObject(object) : { ...parseObject(object), relation };
10
+ }
11
+ //# sourceMappingURL=parse-subject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-subject.js","sourceRoot":"","sources":["../../src/rebac/parse-subject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAE1C,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAChF,MAAM,IAAI,iBAAiB,CAAC,IAAI,OAAO,qEAAqE,CAAC,CAAC;IAChH,CAAC;IAED,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Per resource type, the schema permission each kit permission stands for: `{ document: { 'docs:document.edit': 'edit' } }`. */
2
+ export type PermissionMapping = Readonly<Record<string, Readonly<Record<string, string>>>>;
3
+ //# sourceMappingURL=permission-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-mapping.d.ts","sourceRoot":"","sources":["../../src/rebac/permission-mapping.ts"],"names":[],"mappings":"AAAA,iIAAiI;AACjI,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=permission-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-mapping.js","sourceRoot":"","sources":["../../src/rebac/permission-mapping.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { type Actor } from '@ddd-ts-kit/kernel';
2
+ import type { AccessScope } from '../authorization/access-scope.js';
3
+ import type { Authorizer } from '../authorization/authorizer.js';
4
+ import type { CheckRequest } from '../authorization/check-request.js';
5
+ import { type Decision } from '../authorization/decision.js';
6
+ import type { ListRequest } from '../authorization/list-request.js';
7
+ import type { ExpandNode } from './expand-node.js';
8
+ import type { PermissionMapping } from './permission-mapping.js';
9
+ import type { RelationTupleStore } from './relation-tuple-store.js';
10
+ import type { Schema } from './schema.js';
11
+ export interface RelationBasedAuthorizerOptions {
12
+ readonly schema: Schema;
13
+ readonly store: RelationTupleStore;
14
+ readonly mapping: PermissionMapping;
15
+ /** How many `object#relation` hops one check may chain. Default 16. Beyond it the answer is no. */
16
+ readonly maxDepth?: number;
17
+ /** How many subjects a listing may walk through before giving up loudly. Default 10000. */
18
+ readonly listLimit?: number;
19
+ /** The subject an actor is in the tuples. Default `<actor type>:<actor id>`, such as `user:ada`. */
20
+ readonly subjectOf?: (actor: Actor) => string;
21
+ }
22
+ /**
23
+ * ReBAC in the manner of Zanzibar, evaluated in process: a permission holds when the rewrites
24
+ * of the schema find a path of stored tuples from the object to the actor.
25
+ */
26
+ export declare class RelationBasedAuthorizer implements Authorizer {
27
+ private readonly options;
28
+ constructor(options: RelationBasedAuthorizerOptions);
29
+ check(request: CheckRequest): Promise<Decision>;
30
+ /**
31
+ * By reverse expansion: walks every tuple reachable from the actor, then checks each object
32
+ * of the type it met. Cost: one read per reachable subject and userset, plus one check per
33
+ * candidate. Fine for thousands of tuples per actor, not for a search index.
34
+ */
35
+ listAccessible({ actor, permission, resourceType }: ListRequest): Promise<AccessScope>;
36
+ /** Why is this allowed, or not: the whole evaluation tree, every branch visited. For debugging. */
37
+ expand(request: Required<Pick<CheckRequest, 'actor' | 'permission' | 'resource'>>): Promise<ExpandNode>;
38
+ private mapped;
39
+ private evaluation;
40
+ private subjectOf;
41
+ private reachable;
42
+ /** How an object may itself be the subject of a tuple: as such, or as one of its usersets. */
43
+ private subjectFormsOf;
44
+ }
45
+ //# sourceMappingURL=relation-based-authorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-based-authorizer.d.ts","sourceRoot":"","sources":["../../src/rebac/relation-based-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAGpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,oGAAoG;IACpG,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC;CAC/C;AAKD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,UAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAApC,YAA6B,OAAO,EAAE,8BAA8B,EAEnE;IAEK,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuBpD;IAED;;;;OAIG;IACG,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB3F;IAED,mGAAmG;IAC7F,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAU5G;IAED,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,SAAS;YAIH,SAAS;IAyBvB,8FAA8F;IAC9F,OAAO,CAAC,cAAc;CAKvB"}