@zudojs/permissions 0.0.1

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 (179) hide show
  1. package/README.md +41 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/ability/ability.core.d.ts +29 -0
  4. package/dist/ability/ability.core.d.ts.map +1 -0
  5. package/dist/ability/ability.core.js +38 -0
  6. package/dist/ability/ability.core.js.map +1 -0
  7. package/dist/ability/index.d.ts +7 -0
  8. package/dist/ability/index.d.ts.map +1 -0
  9. package/dist/ability/index.js +7 -0
  10. package/dist/ability/index.js.map +1 -0
  11. package/dist/actor/actor.core.d.ts +28 -0
  12. package/dist/actor/actor.core.d.ts.map +1 -0
  13. package/dist/actor/actor.core.js +40 -0
  14. package/dist/actor/actor.core.js.map +1 -0
  15. package/dist/actor/index.d.ts +7 -0
  16. package/dist/actor/index.d.ts.map +1 -0
  17. package/dist/actor/index.js +7 -0
  18. package/dist/actor/index.js.map +1 -0
  19. package/dist/cache/cache.core.d.ts +17 -0
  20. package/dist/cache/cache.core.d.ts.map +1 -0
  21. package/dist/cache/cache.core.js +51 -0
  22. package/dist/cache/cache.core.js.map +1 -0
  23. package/dist/cache/index.d.ts +7 -0
  24. package/dist/cache/index.d.ts.map +1 -0
  25. package/dist/cache/index.js +7 -0
  26. package/dist/cache/index.js.map +1 -0
  27. package/dist/conditions/conditions.core.d.ts +40 -0
  28. package/dist/conditions/conditions.core.d.ts.map +1 -0
  29. package/dist/conditions/conditions.core.js +78 -0
  30. package/dist/conditions/conditions.core.js.map +1 -0
  31. package/dist/conditions/index.d.ts +7 -0
  32. package/dist/conditions/index.d.ts.map +1 -0
  33. package/dist/conditions/index.js +7 -0
  34. package/dist/conditions/index.js.map +1 -0
  35. package/dist/evaluator/authorizationEngine.d.ts +47 -0
  36. package/dist/evaluator/authorizationEngine.d.ts.map +1 -0
  37. package/dist/evaluator/authorizationEngine.js +49 -0
  38. package/dist/evaluator/authorizationEngine.js.map +1 -0
  39. package/dist/evaluator/evaluator.core.d.ts +11 -0
  40. package/dist/evaluator/evaluator.core.d.ts.map +1 -0
  41. package/dist/evaluator/evaluator.core.js +57 -0
  42. package/dist/evaluator/evaluator.core.js.map +1 -0
  43. package/dist/evaluator/evaluator.explain.d.ts +12 -0
  44. package/dist/evaluator/evaluator.explain.d.ts.map +1 -0
  45. package/dist/evaluator/evaluator.explain.js +79 -0
  46. package/dist/evaluator/evaluator.explain.js.map +1 -0
  47. package/dist/evaluator/evaluator.pipeline.d.ts +28 -0
  48. package/dist/evaluator/evaluator.pipeline.d.ts.map +1 -0
  49. package/dist/evaluator/evaluator.pipeline.js +83 -0
  50. package/dist/evaluator/evaluator.pipeline.js.map +1 -0
  51. package/dist/evaluator/index.d.ts +8 -0
  52. package/dist/evaluator/index.d.ts.map +1 -0
  53. package/dist/evaluator/index.js +7 -0
  54. package/dist/evaluator/index.js.map +1 -0
  55. package/dist/http/httpHelpers.d.ts +28 -0
  56. package/dist/http/httpHelpers.d.ts.map +1 -0
  57. package/dist/http/httpHelpers.js +29 -0
  58. package/dist/http/httpHelpers.js.map +1 -0
  59. package/dist/http/httpMiddleware.core.d.ts +48 -0
  60. package/dist/http/httpMiddleware.core.d.ts.map +1 -0
  61. package/dist/http/httpMiddleware.core.js +81 -0
  62. package/dist/http/httpMiddleware.core.js.map +1 -0
  63. package/dist/http/httpTypes.d.ts +40 -0
  64. package/dist/http/httpTypes.d.ts.map +1 -0
  65. package/dist/http/httpTypes.js +10 -0
  66. package/dist/http/httpTypes.js.map +1 -0
  67. package/dist/http/index.d.ts +11 -0
  68. package/dist/http/index.d.ts.map +1 -0
  69. package/dist/http/index.js +10 -0
  70. package/dist/http/index.js.map +1 -0
  71. package/dist/index.d.ts +27 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +27 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/observability/index.d.ts +7 -0
  76. package/dist/observability/index.d.ts.map +1 -0
  77. package/dist/observability/index.js +7 -0
  78. package/dist/observability/index.js.map +1 -0
  79. package/dist/observability/observability.core.d.ts +41 -0
  80. package/dist/observability/observability.core.d.ts.map +1 -0
  81. package/dist/observability/observability.core.js +54 -0
  82. package/dist/observability/observability.core.js.map +1 -0
  83. package/dist/permission/index.d.ts +8 -0
  84. package/dist/permission/index.d.ts.map +1 -0
  85. package/dist/permission/index.js +8 -0
  86. package/dist/permission/index.js.map +1 -0
  87. package/dist/permission/permission.core.d.ts +30 -0
  88. package/dist/permission/permission.core.d.ts.map +1 -0
  89. package/dist/permission/permission.core.js +72 -0
  90. package/dist/permission/permission.core.js.map +1 -0
  91. package/dist/permission/permissionRegistry.d.ts +63 -0
  92. package/dist/permission/permissionRegistry.d.ts.map +1 -0
  93. package/dist/permission/permissionRegistry.js +88 -0
  94. package/dist/permission/permissionRegistry.js.map +1 -0
  95. package/dist/permissionErrors/index.d.ts +8 -0
  96. package/dist/permissionErrors/index.d.ts.map +1 -0
  97. package/dist/permissionErrors/index.js +8 -0
  98. package/dist/permissionErrors/index.js.map +1 -0
  99. package/dist/permissionErrors/permissionError.access.d.ts +39 -0
  100. package/dist/permissionErrors/permissionError.access.d.ts.map +1 -0
  101. package/dist/permissionErrors/permissionError.access.js +65 -0
  102. package/dist/permissionErrors/permissionError.access.js.map +1 -0
  103. package/dist/permissionErrors/permissionError.base.d.ts +19 -0
  104. package/dist/permissionErrors/permissionError.base.d.ts.map +1 -0
  105. package/dist/permissionErrors/permissionError.base.js +21 -0
  106. package/dist/permissionErrors/permissionError.base.js.map +1 -0
  107. package/dist/permissionErrors/permissionError.types.d.ts +6 -0
  108. package/dist/permissionErrors/permissionError.types.d.ts.map +1 -0
  109. package/dist/permissionErrors/permissionError.types.js +6 -0
  110. package/dist/permissionErrors/permissionError.types.js.map +1 -0
  111. package/dist/permissionErrors/permissionError.validation.d.ts +47 -0
  112. package/dist/permissionErrors/permissionError.validation.d.ts.map +1 -0
  113. package/dist/permissionErrors/permissionError.validation.js +78 -0
  114. package/dist/permissionErrors/permissionError.validation.js.map +1 -0
  115. package/dist/permissionTypes/index.d.ts +9 -0
  116. package/dist/permissionTypes/index.d.ts.map +1 -0
  117. package/dist/permissionTypes/index.js +9 -0
  118. package/dist/permissionTypes/index.js.map +1 -0
  119. package/dist/permissionTypes/permissionActor.d.ts +28 -0
  120. package/dist/permissionTypes/permissionActor.d.ts.map +1 -0
  121. package/dist/permissionTypes/permissionActor.js +7 -0
  122. package/dist/permissionTypes/permissionActor.js.map +1 -0
  123. package/dist/permissionTypes/policyTypes.d.ts +62 -0
  124. package/dist/permissionTypes/policyTypes.d.ts.map +1 -0
  125. package/dist/permissionTypes/policyTypes.js +7 -0
  126. package/dist/permissionTypes/policyTypes.js.map +1 -0
  127. package/dist/permissionTypes/ruleTypes.d.ts +50 -0
  128. package/dist/permissionTypes/ruleTypes.d.ts.map +1 -0
  129. package/dist/permissionTypes/ruleTypes.js +7 -0
  130. package/dist/permissionTypes/ruleTypes.js.map +1 -0
  131. package/dist/policy/index.d.ts +7 -0
  132. package/dist/policy/index.d.ts.map +1 -0
  133. package/dist/policy/index.js +7 -0
  134. package/dist/policy/index.js.map +1 -0
  135. package/dist/policy/policyRegistry.d.ts +36 -0
  136. package/dist/policy/policyRegistry.d.ts.map +1 -0
  137. package/dist/policy/policyRegistry.js +57 -0
  138. package/dist/policy/policyRegistry.js.map +1 -0
  139. package/dist/resolvers/index.d.ts +7 -0
  140. package/dist/resolvers/index.d.ts.map +1 -0
  141. package/dist/resolvers/index.js +7 -0
  142. package/dist/resolvers/index.js.map +1 -0
  143. package/dist/resolvers/resolvers.core.d.ts +23 -0
  144. package/dist/resolvers/resolvers.core.d.ts.map +1 -0
  145. package/dist/resolvers/resolvers.core.js +46 -0
  146. package/dist/resolvers/resolvers.core.js.map +1 -0
  147. package/dist/role/index.d.ts +8 -0
  148. package/dist/role/index.d.ts.map +1 -0
  149. package/dist/role/index.js +8 -0
  150. package/dist/role/index.js.map +1 -0
  151. package/dist/role/roleHierarchy.d.ts +15 -0
  152. package/dist/role/roleHierarchy.d.ts.map +1 -0
  153. package/dist/role/roleHierarchy.js +48 -0
  154. package/dist/role/roleHierarchy.js.map +1 -0
  155. package/dist/role/roleRegistry.d.ts +45 -0
  156. package/dist/role/roleRegistry.d.ts.map +1 -0
  157. package/dist/role/roleRegistry.js +67 -0
  158. package/dist/role/roleRegistry.js.map +1 -0
  159. package/dist/rule/index.d.ts +8 -0
  160. package/dist/rule/index.d.ts.map +1 -0
  161. package/dist/rule/index.js +8 -0
  162. package/dist/rule/index.js.map +1 -0
  163. package/dist/rule/rule.core.d.ts +24 -0
  164. package/dist/rule/rule.core.d.ts.map +1 -0
  165. package/dist/rule/rule.core.js +79 -0
  166. package/dist/rule/rule.core.js.map +1 -0
  167. package/dist/rule/ruleCompiler.d.ts +27 -0
  168. package/dist/rule/ruleCompiler.d.ts.map +1 -0
  169. package/dist/rule/ruleCompiler.js +76 -0
  170. package/dist/rule/ruleCompiler.js.map +1 -0
  171. package/dist/utils/index.d.ts +7 -0
  172. package/dist/utils/index.d.ts.map +1 -0
  173. package/dist/utils/index.js +7 -0
  174. package/dist/utils/index.js.map +1 -0
  175. package/dist/utils/utils.helper.d.ts +37 -0
  176. package/dist/utils/utils.helper.d.ts.map +1 -0
  177. package/dist/utils/utils.helper.js +50 -0
  178. package/dist/utils/utils.helper.js.map +1 -0
  179. package/package.json +61 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Validation and policy-related permission errors.
3
+ */
4
+ import { ErrorCode } from "@zudojs/errors";
5
+ import { PermissionError } from "./permissionError.base.js";
6
+ /**
7
+ * A permission string is malformed.
8
+ */
9
+ export class InvalidPermissionError extends PermissionError {
10
+ constructor(permission) {
11
+ super(`Invalid permission format: ${permission}`, {
12
+ code: ErrorCode.VALIDATION_FAILED,
13
+ metadata: { permission },
14
+ });
15
+ }
16
+ }
17
+ /**
18
+ * A role definition is invalid.
19
+ */
20
+ export class InvalidRoleError extends PermissionError {
21
+ constructor(message) {
22
+ super(message, { code: ErrorCode.VALIDATION_FAILED });
23
+ }
24
+ }
25
+ /**
26
+ * Circular role inheritance detected.
27
+ */
28
+ export class CircularRoleInheritanceError extends PermissionError {
29
+ constructor(chain) {
30
+ super(`Circular role inheritance: ${chain.join(" → ")}`, {
31
+ code: ErrorCode.VALIDATION_FAILED,
32
+ metadata: { chain: chain.join(",") },
33
+ });
34
+ }
35
+ }
36
+ /**
37
+ * A policy evaluation failed.
38
+ */
39
+ export class PolicyError extends PermissionError {
40
+ constructor(policyName, cause) {
41
+ super(`Policy evaluation failed: ${policyName}`, {
42
+ code: ErrorCode.OPERATION_FAILED,
43
+ cause,
44
+ metadata: { policyName },
45
+ });
46
+ }
47
+ }
48
+ /**
49
+ * A policy evaluation exceeded the timeout.
50
+ */
51
+ export class PolicyTimeoutError extends PermissionError {
52
+ constructor(policyName, timeoutMs) {
53
+ super(`Policy timeout: ${policyName} exceeded ${timeoutMs}ms`, {
54
+ code: ErrorCode.TIMEOUT,
55
+ metadata: { policyName, timeoutMs },
56
+ });
57
+ }
58
+ }
59
+ /**
60
+ * A permission resolver failed.
61
+ */
62
+ export class PermissionResolverError extends PermissionError {
63
+ constructor(message, cause) {
64
+ super(message, {
65
+ code: ErrorCode.OPERATION_FAILED,
66
+ cause,
67
+ });
68
+ }
69
+ }
70
+ /**
71
+ * Authorization was cancelled via AbortSignal.
72
+ */
73
+ export class AuthorizationAbortedError extends PermissionError {
74
+ constructor() {
75
+ super("Authorization aborted", { code: ErrorCode.OPERATION_CANCELLED });
76
+ }
77
+ }
78
+ //# sourceMappingURL=permissionError.validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissionError.validation.js","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,eAAe;IACzD,YAAY,UAAkB;QAC5B,KAAK,CAAC,8BAA8B,UAAU,EAAE,EAAE;YAChD,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,EAAE,UAAU,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,eAAe;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,4BAA6B,SAAQ,eAAe;IAC/D,YAAY,KAAwB;QAClC,KAAK,CAAC,8BAA8B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;YACvD,IAAI,EAAE,SAAS,CAAC,iBAAiB;YACjC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,eAAe;IAC9C,YAAY,UAAkB,EAAE,KAAe;QAC7C,KAAK,CAAC,6BAA6B,UAAU,EAAE,EAAE;YAC/C,IAAI,EAAE,SAAS,CAAC,gBAAgB;YAChC,KAAK;YACL,QAAQ,EAAE,EAAE,UAAU,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,YAAY,UAAkB,EAAE,SAAiB;QAC/C,KAAK,CAAC,mBAAmB,UAAU,aAAa,SAAS,IAAI,EAAE;YAC7D,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,SAAS,CAAC,gBAAgB;YAChC,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,eAAe;IAC5D;QACE,KAAK,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Core transaction type definitions.
3
+ *
4
+ * @module permissionTypes
5
+ */
6
+ export { type PermissionActor, type Permission, type PermissionString, } from "./permissionActor.js";
7
+ export { type RuleEffect, type PermissionRule, type PermissionConditionFn, type PermissionContext, type PermissionDecision, } from "./ruleTypes.js";
8
+ export { type RoleDefinition, type PermissionResolver, type RoleResolver, type PermissionCache, type PermissionPolicyDefinition, type ExplainStep, type ExplainResult, type AuthorizationOptions, } from "./policyTypes.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissionTypes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Core transaction type definitions.
3
+ *
4
+ * @module permissionTypes
5
+ */
6
+ export {} from "./permissionActor.js";
7
+ export {} from "./ruleTypes.js";
8
+ export {} from "./policyTypes.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissionTypes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIN,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAMN,MAAM,gBAAgB,CAAC;AAExB,OAAO,EASN,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Core domain types: actor, permission, and permission string.
3
+ *
4
+ * @module permissionTypes/permissionActor
5
+ */
6
+ /** An entity requesting access — user, service, worker, bot, etc. */
7
+ export interface PermissionActor {
8
+ /** Unique identifier for the actor. */
9
+ readonly id: string;
10
+ /** Actor type (e.g. "user", "service", "system"). */
11
+ readonly type?: string;
12
+ /** Roles assigned to this actor. */
13
+ readonly roles?: readonly string[];
14
+ /** Direct permissions granted to this actor. */
15
+ readonly permissions?: readonly string[];
16
+ /** Permissions explicitly denied to this actor. */
17
+ readonly deniedPermissions?: readonly string[];
18
+ }
19
+ /** A parsed permission with resource and action. */
20
+ export interface Permission {
21
+ /** Resource being accessed (e.g. "post", "billing.invoice"). */
22
+ readonly resource: string;
23
+ /** Action being performed (e.g. "read", "update", "*"). */
24
+ readonly action: string;
25
+ }
26
+ /** Permission string format: "resource:action" or wildcards like "post:*", "*:*". */
27
+ export type PermissionString = string;
28
+ //# sourceMappingURL=permissionActor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissionActor.d.ts","sourceRoot":"","sources":["../../src/permissionTypes/permissionActor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,uCAAuC;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,gDAAgD;IAChD,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,mDAAmD;IACnD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED,oDAAoD;AACpD,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,qFAAqF;AACrF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core domain types: actor, permission, and permission string.
3
+ *
4
+ * @module permissionTypes/permissionActor
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=permissionActor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissionActor.js","sourceRoot":"","sources":["../../src/permissionTypes/permissionActor.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Role, resolver, cache, policy, explain, and options types.
3
+ *
4
+ * @module permissionTypes/policyTypes
5
+ */
6
+ import type { PermissionActor } from "./permissionActor.js";
7
+ import type { PermissionRule, PermissionContext, PermissionDecision } from "./ruleTypes.js";
8
+ /** A role definition with permissions and optional inheritance. */
9
+ export interface RoleDefinition {
10
+ /** Role name (e.g. "admin", "editor"). */
11
+ readonly name: string;
12
+ /** Permissions granted by this role. */
13
+ readonly permissions: readonly string[];
14
+ /** Roles this role inherits from. */
15
+ readonly inherits?: readonly string[];
16
+ /** Role description. */
17
+ readonly description?: string;
18
+ /** Whether this is a system role (cannot be deleted). */
19
+ readonly system?: boolean;
20
+ }
21
+ /** Resolves permissions for an actor from an external source. */
22
+ export interface PermissionResolver {
23
+ resolvePermissions(actor: PermissionActor): Promise<readonly PermissionRule[]>;
24
+ }
25
+ /** Resolves roles for an actor from an external source. */
26
+ export interface RoleResolver {
27
+ resolveRoles(actor: PermissionActor): Promise<readonly string[]>;
28
+ }
29
+ /** Cache adapter for authorization decisions. */
30
+ export interface PermissionCache {
31
+ get(key: string): Promise<PermissionDecision | undefined>;
32
+ set(key: string, value: PermissionDecision, options?: {
33
+ readonly ttl?: number;
34
+ }): Promise<void>;
35
+ delete(key: string): Promise<void>;
36
+ invalidateActor(actorId: string): Promise<void>;
37
+ }
38
+ /** A named authorization policy. */
39
+ export interface PermissionPolicyDefinition {
40
+ readonly name: string;
41
+ readonly permissions: readonly string[];
42
+ readonly cacheable?: boolean;
43
+ readonly priority?: number;
44
+ evaluate(context: PermissionContext): PermissionDecision | Promise<PermissionDecision>;
45
+ }
46
+ /** A step in an explain trace. */
47
+ export interface ExplainStep {
48
+ readonly type: "role" | "permission" | "rule" | "policy" | "deny";
49
+ readonly detail: string;
50
+ readonly matched: boolean;
51
+ }
52
+ /** Full explanation of an authorization decision. */
53
+ export interface ExplainResult {
54
+ readonly allowed: boolean;
55
+ readonly steps: readonly ExplainStep[];
56
+ }
57
+ /** Options for authorization checks. */
58
+ export interface AuthorizationOptions {
59
+ readonly signal?: AbortSignal;
60
+ readonly policyTimeout?: number;
61
+ }
62
+ //# sourceMappingURL=policyTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyTypes.d.ts","sourceRoot":"","sources":["../../src/permissionTypes/policyTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gBAAgB,CAAC;AAExB,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,wBAAwB;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,CAChB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC,CAAC;CACvC;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAClE;AAED,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC1D,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,oCAAoC;AACpC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CACN,OAAO,EAAE,iBAAiB,GACzB,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACrD;AAED,kCAAkC;AAClC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;CACxC;AAED,wCAAwC;AACxC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Role, resolver, cache, policy, explain, and options types.
3
+ *
4
+ * @module permissionTypes/policyTypes
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=policyTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyTypes.js","sourceRoot":"","sources":["../../src/permissionTypes/policyTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Rule, condition, context, and decision types.
3
+ *
4
+ * @module permissionTypes/ruleTypes
5
+ */
6
+ import type { PermissionActor, Permission } from "./permissionActor.js";
7
+ /** Whether a rule allows or denies access. */
8
+ export type RuleEffect = "allow" | "deny";
9
+ /** A permission rule that grants or denies access under conditions. */
10
+ export interface PermissionRule {
11
+ /** Allow or deny. */
12
+ readonly effect: RuleEffect;
13
+ /** Action(s) this rule applies to. */
14
+ readonly action: string | readonly string[];
15
+ /** Resource(s) this rule applies to. */
16
+ readonly resource: string | readonly string[];
17
+ /** Optional condition function for ABAC. */
18
+ readonly condition?: PermissionConditionFn;
19
+ /** Rule priority — higher wins. Same priority: deny wins. */
20
+ readonly priority?: number;
21
+ /** Human-readable rule name for debugging. */
22
+ readonly name?: string;
23
+ }
24
+ /** A function that evaluates whether a condition is met. */
25
+ export type PermissionConditionFn = (context: PermissionContext) => boolean | Promise<boolean>;
26
+ /** Context provided during authorization evaluation. */
27
+ export interface PermissionContext {
28
+ /** The actor requesting access. */
29
+ readonly actor: PermissionActor;
30
+ /** The permission string being checked (e.g. "post:update"). */
31
+ readonly permission: Permission;
32
+ /** The target resource (optional). */
33
+ readonly resource?: unknown;
34
+ /** Arbitrary metadata (IP, tenant, timestamp, etc.). */
35
+ readonly metadata?: ReadonlyMap<string, unknown>;
36
+ }
37
+ /** Result of an authorization check. */
38
+ export interface PermissionDecision {
39
+ /** Whether the action is allowed. */
40
+ readonly allowed: boolean;
41
+ /** Human-readable reason for the decision. */
42
+ readonly reason?: string;
43
+ /** Name of the policy/rule that produced the decision. */
44
+ readonly policy?: string;
45
+ /** The matched permission string. */
46
+ readonly matchedPermission?: string;
47
+ /** Additional decision metadata. */
48
+ readonly metadata?: unknown;
49
+ }
50
+ //# sourceMappingURL=ruleTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleTypes.d.ts","sourceRoot":"","sources":["../../src/permissionTypes/ruleTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAExE,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC5C,wCAAwC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IAC9C,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAC3C,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,4DAA4D;AAC5D,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,iBAAiB,KACvB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD;AAED,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,oCAAoC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Rule, condition, context, and decision types.
3
+ *
4
+ * @module permissionTypes/ruleTypes
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=ruleTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ruleTypes.js","sourceRoot":"","sources":["../../src/permissionTypes/ruleTypes.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Policy registry and management for authorization.
3
+ *
4
+ * @module policy
5
+ */
6
+ export { createPolicyRegistry } from "./policyRegistry.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Policy registry and management for authorization.
3
+ *
4
+ * @module policy
5
+ */
6
+ export { createPolicyRegistry } from "./policyRegistry.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Policy registry — manages named authorization policies.
3
+ *
4
+ * @module policy/policyRegistry
5
+ */
6
+ import type { PermissionPolicyDefinition } from "../permissionTypes/index.js";
7
+ /**
8
+ * Create a policy registry.
9
+ */
10
+ export declare function createPolicyRegistry(): {
11
+ /**
12
+ * Register a policy.
13
+ */
14
+ define(definition: PermissionPolicyDefinition): void;
15
+ /**
16
+ * Get a policy by name.
17
+ */
18
+ get(name: string): PermissionPolicyDefinition | undefined;
19
+ /**
20
+ * Get all policies that apply to a given permission string.
21
+ */
22
+ forPermission(permission: string): readonly PermissionPolicyDefinition[];
23
+ /**
24
+ * Get all registered policy names.
25
+ */
26
+ names(): readonly string[];
27
+ /**
28
+ * Remove a policy.
29
+ */
30
+ remove(name: string): boolean;
31
+ /**
32
+ * Clear all policies.
33
+ */
34
+ clear(): void;
35
+ };
36
+ //# sourceMappingURL=policyRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyRegistry.d.ts","sourceRoot":"","sources":["../../src/policy/policyRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAE9E;;GAEG;AACH,wBAAgB,oBAAoB;IAIhC;;OAEG;IACH,MAAM,aAAa,0BAA0B,GAAG,IAAI;IAIpD;;OAEG;IACH,GAAG,OAAO,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAIzD;;OAEG;IACH,aAAa,aAAa,MAAM,GAAG,SAAS,0BAA0B,EAAE;IAWxE;;OAEG;IACH,KAAK,IAAI,SAAS,MAAM,EAAE;IAI1B;;OAEG;IACH,MAAM,OAAO,MAAM,GAAG,OAAO;IAI7B;;OAEG;IACH,KAAK,IAAI,IAAI;EAIhB"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Policy registry — manages named authorization policies.
3
+ *
4
+ * @module policy/policyRegistry
5
+ */
6
+ /**
7
+ * Create a policy registry.
8
+ */
9
+ export function createPolicyRegistry() {
10
+ const policies = new Map();
11
+ return {
12
+ /**
13
+ * Register a policy.
14
+ */
15
+ define(definition) {
16
+ policies.set(definition.name, Object.freeze({ ...definition }));
17
+ },
18
+ /**
19
+ * Get a policy by name.
20
+ */
21
+ get(name) {
22
+ return policies.get(name);
23
+ },
24
+ /**
25
+ * Get all policies that apply to a given permission string.
26
+ */
27
+ forPermission(permission) {
28
+ const results = [];
29
+ for (const [, policy] of policies) {
30
+ if (policy.permissions.includes(permission)) {
31
+ results.push(policy);
32
+ }
33
+ }
34
+ // Sort by priority descending
35
+ return results.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
36
+ },
37
+ /**
38
+ * Get all registered policy names.
39
+ */
40
+ names() {
41
+ return Array.from(policies.keys());
42
+ },
43
+ /**
44
+ * Remove a policy.
45
+ */
46
+ remove(name) {
47
+ return policies.delete(name);
48
+ },
49
+ /**
50
+ * Clear all policies.
51
+ */
52
+ clear() {
53
+ policies.clear();
54
+ },
55
+ };
56
+ }
57
+ //# sourceMappingURL=policyRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policyRegistry.js","sourceRoot":"","sources":["../../src/policy/policyRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE/D,OAAO;QACL;;WAEG;QACH,MAAM,CAAC,UAAsC;YAC3C,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;QAClE,CAAC;QAED;;WAEG;QACH,GAAG,CAAC,IAAY;YACd,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED;;WAEG;QACH,aAAa,CAAC,UAAkB;YAC9B,MAAM,OAAO,GAAiC,EAAE,CAAC;YACjD,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAClC,IAAI,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,8BAA8B;YAC9B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC;QAED;;WAEG;QACH,KAAK;YACH,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,IAAY;YACjB,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED;;WAEG;QACH,KAAK;YACH,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Permission, role, and actor resolvers.
3
+ *
4
+ * @module resolvers
5
+ */
6
+ export { createMemoryPermissionResolver, createMemoryRoleResolver, createStaticPermissionResolver, createStaticRoleResolver, } from "./resolvers.core.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Permission, role, and actor resolvers.
3
+ *
4
+ * @module resolvers
5
+ */
6
+ export { createMemoryPermissionResolver, createMemoryRoleResolver, createStaticPermissionResolver, createStaticRoleResolver, } from "./resolvers.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Resolver implementations for permissions, roles, and actors.
3
+ *
4
+ * @module resolvers/resolvers
5
+ */
6
+ import type { PermissionRule, PermissionResolver, RoleResolver } from "../permissionTypes/index.js";
7
+ /**
8
+ * In-memory permission resolver — returns permissions from a map.
9
+ */
10
+ export declare function createMemoryPermissionResolver(store: Map<string, readonly PermissionRule[]>): PermissionResolver;
11
+ /**
12
+ * In-memory role resolver — returns roles from a map.
13
+ */
14
+ export declare function createMemoryRoleResolver(store: Map<string, readonly string[]>): RoleResolver;
15
+ /**
16
+ * Static permission resolver — always returns the same rules.
17
+ */
18
+ export declare function createStaticPermissionResolver(rules: readonly PermissionRule[]): PermissionResolver;
19
+ /**
20
+ * Static role resolver — always returns the same roles.
21
+ */
22
+ export declare function createStaticRoleResolver(roles: readonly string[]): RoleResolver;
23
+ //# sourceMappingURL=resolvers.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.core.d.ts","sourceRoot":"","sources":["../../src/resolvers/resolvers.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAEV,cAAc,EACd,kBAAkB,EAClB,YAAY,EACb,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC,GAC5C,kBAAkB,CAQpB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,GACpC,YAAY,CAMd;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,cAAc,EAAE,GAC/B,kBAAkB,CAMpB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,YAAY,CAMd"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Resolver implementations for permissions, roles, and actors.
3
+ *
4
+ * @module resolvers/resolvers
5
+ */
6
+ /**
7
+ * In-memory permission resolver — returns permissions from a map.
8
+ */
9
+ export function createMemoryPermissionResolver(store) {
10
+ return {
11
+ async resolvePermissions(actor) {
12
+ return store.get(actor.id) ?? [];
13
+ },
14
+ };
15
+ }
16
+ /**
17
+ * In-memory role resolver — returns roles from a map.
18
+ */
19
+ export function createMemoryRoleResolver(store) {
20
+ return {
21
+ async resolveRoles(actor) {
22
+ return store.get(actor.id) ?? [];
23
+ },
24
+ };
25
+ }
26
+ /**
27
+ * Static permission resolver — always returns the same rules.
28
+ */
29
+ export function createStaticPermissionResolver(rules) {
30
+ return {
31
+ async resolvePermissions() {
32
+ return rules;
33
+ },
34
+ };
35
+ }
36
+ /**
37
+ * Static role resolver — always returns the same roles.
38
+ */
39
+ export function createStaticRoleResolver(roles) {
40
+ return {
41
+ async resolveRoles() {
42
+ return roles;
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=resolvers.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolvers.core.js","sourceRoot":"","sources":["../../src/resolvers/resolvers.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAA6C;IAE7C,OAAO;QACL,KAAK,CAAC,kBAAkB,CACtB,KAAsB;YAEtB,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAqC;IAErC,OAAO;QACL,KAAK,CAAC,YAAY,CAAC,KAAsB;YACvC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAAgC;IAEhC,OAAO;QACL,KAAK,CAAC,kBAAkB;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAwB;IAExB,OAAO;QACL,KAAK,CAAC,YAAY;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Role definitions, registry, and inheritance hierarchy.
3
+ *
4
+ * @module role
5
+ */
6
+ export { createRoleRegistry, type RoleRegistryOptions, } from "./roleRegistry.js";
7
+ export { resolveRolePermissions } from "./roleHierarchy.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/role/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Role definitions, registry, and inheritance hierarchy.
3
+ *
4
+ * @module role
5
+ */
6
+ export { createRoleRegistry, } from "./roleRegistry.js";
7
+ export { resolveRolePermissions } from "./roleHierarchy.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/role/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Role hierarchy resolver — resolves inherited permissions from role chains.
3
+ *
4
+ * @module role/roleHierarchy
5
+ */
6
+ import type { RoleDefinition } from "../permissionTypes/index.js";
7
+ /**
8
+ * Resolve all permissions for a set of role names, following inheritance chains.
9
+ *
10
+ * @param roleNames - Direct role names assigned to the actor.
11
+ * @param getRole - Function to look up a role definition by name.
12
+ * @returns Deduplicated list of all permission strings.
13
+ */
14
+ export declare function resolveRolePermissions(roleNames: readonly string[], getRole: (name: string) => RoleDefinition | undefined): readonly string[];
15
+ //# sourceMappingURL=roleHierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roleHierarchy.d.ts","sourceRoot":"","sources":["../../src/role/roleHierarchy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAMlE;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,GACpD,SAAS,MAAM,EAAE,CASnB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Role hierarchy resolver — resolves inherited permissions from role chains.
3
+ *
4
+ * @module role/roleHierarchy
5
+ */
6
+ import { CircularRoleInheritanceError, RoleNotFoundError, } from "../permissionErrors/index.js";
7
+ /**
8
+ * Resolve all permissions for a set of role names, following inheritance chains.
9
+ *
10
+ * @param roleNames - Direct role names assigned to the actor.
11
+ * @param getRole - Function to look up a role definition by name.
12
+ * @returns Deduplicated list of all permission strings.
13
+ */
14
+ export function resolveRolePermissions(roleNames, getRole) {
15
+ const permissions = new Set();
16
+ const visited = new Set();
17
+ for (const name of roleNames) {
18
+ collectPermissions(name, getRole, permissions, visited, []);
19
+ }
20
+ return Array.from(permissions);
21
+ }
22
+ /**
23
+ * Collect permissions from a role and its ancestors, detecting cycles.
24
+ */
25
+ function collectPermissions(roleName, getRole, permissions, visited, chain) {
26
+ const role = getRole(roleName);
27
+ if (!role) {
28
+ throw new RoleNotFoundError(roleName);
29
+ }
30
+ // Cycle detection — check before adding to visited
31
+ if (chain.includes(roleName)) {
32
+ throw new CircularRoleInheritanceError([...chain, roleName]);
33
+ }
34
+ // Skip if already fully processed (not in current chain)
35
+ if (visited.has(roleName))
36
+ return;
37
+ visited.add(roleName);
38
+ const newChain = [...chain, roleName];
39
+ for (const perm of role.permissions) {
40
+ permissions.add(perm);
41
+ }
42
+ if (role.inherits) {
43
+ for (const parent of role.inherits) {
44
+ collectPermissions(parent, getRole, permissions, visited, newChain);
45
+ }
46
+ }
47
+ }
48
+ //# sourceMappingURL=roleHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roleHierarchy.js","sourceRoot":"","sources":["../../src/role/roleHierarchy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,SAA4B,EAC5B,OAAqD;IAErD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,QAAgB,EAChB,OAAqD,EACrD,WAAwB,EACxB,OAAoB,EACpB,KAAe;IAEf,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,mDAAmD;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,4BAA4B,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,yDAAyD;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;IAElC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC"}