@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.
- package/README.md +41 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ability/ability.core.d.ts +29 -0
- package/dist/ability/ability.core.d.ts.map +1 -0
- package/dist/ability/ability.core.js +38 -0
- package/dist/ability/ability.core.js.map +1 -0
- package/dist/ability/index.d.ts +7 -0
- package/dist/ability/index.d.ts.map +1 -0
- package/dist/ability/index.js +7 -0
- package/dist/ability/index.js.map +1 -0
- package/dist/actor/actor.core.d.ts +28 -0
- package/dist/actor/actor.core.d.ts.map +1 -0
- package/dist/actor/actor.core.js +40 -0
- package/dist/actor/actor.core.js.map +1 -0
- package/dist/actor/index.d.ts +7 -0
- package/dist/actor/index.d.ts.map +1 -0
- package/dist/actor/index.js +7 -0
- package/dist/actor/index.js.map +1 -0
- package/dist/cache/cache.core.d.ts +17 -0
- package/dist/cache/cache.core.d.ts.map +1 -0
- package/dist/cache/cache.core.js +51 -0
- package/dist/cache/cache.core.js.map +1 -0
- package/dist/cache/index.d.ts +7 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +7 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/conditions/conditions.core.d.ts +40 -0
- package/dist/conditions/conditions.core.d.ts.map +1 -0
- package/dist/conditions/conditions.core.js +78 -0
- package/dist/conditions/conditions.core.js.map +1 -0
- package/dist/conditions/index.d.ts +7 -0
- package/dist/conditions/index.d.ts.map +1 -0
- package/dist/conditions/index.js +7 -0
- package/dist/conditions/index.js.map +1 -0
- package/dist/evaluator/authorizationEngine.d.ts +47 -0
- package/dist/evaluator/authorizationEngine.d.ts.map +1 -0
- package/dist/evaluator/authorizationEngine.js +49 -0
- package/dist/evaluator/authorizationEngine.js.map +1 -0
- package/dist/evaluator/evaluator.core.d.ts +11 -0
- package/dist/evaluator/evaluator.core.d.ts.map +1 -0
- package/dist/evaluator/evaluator.core.js +57 -0
- package/dist/evaluator/evaluator.core.js.map +1 -0
- package/dist/evaluator/evaluator.explain.d.ts +12 -0
- package/dist/evaluator/evaluator.explain.d.ts.map +1 -0
- package/dist/evaluator/evaluator.explain.js +79 -0
- package/dist/evaluator/evaluator.explain.js.map +1 -0
- package/dist/evaluator/evaluator.pipeline.d.ts +28 -0
- package/dist/evaluator/evaluator.pipeline.d.ts.map +1 -0
- package/dist/evaluator/evaluator.pipeline.js +83 -0
- package/dist/evaluator/evaluator.pipeline.js.map +1 -0
- package/dist/evaluator/index.d.ts +8 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +7 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/http/httpHelpers.d.ts +28 -0
- package/dist/http/httpHelpers.d.ts.map +1 -0
- package/dist/http/httpHelpers.js +29 -0
- package/dist/http/httpHelpers.js.map +1 -0
- package/dist/http/httpMiddleware.core.d.ts +48 -0
- package/dist/http/httpMiddleware.core.d.ts.map +1 -0
- package/dist/http/httpMiddleware.core.js +81 -0
- package/dist/http/httpMiddleware.core.js.map +1 -0
- package/dist/http/httpTypes.d.ts +40 -0
- package/dist/http/httpTypes.d.ts.map +1 -0
- package/dist/http/httpTypes.js +10 -0
- package/dist/http/httpTypes.js.map +1 -0
- package/dist/http/index.d.ts +11 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +10 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/observability/index.d.ts +7 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +7 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/observability.core.d.ts +41 -0
- package/dist/observability/observability.core.d.ts.map +1 -0
- package/dist/observability/observability.core.js +54 -0
- package/dist/observability/observability.core.js.map +1 -0
- package/dist/permission/index.d.ts +8 -0
- package/dist/permission/index.d.ts.map +1 -0
- package/dist/permission/index.js +8 -0
- package/dist/permission/index.js.map +1 -0
- package/dist/permission/permission.core.d.ts +30 -0
- package/dist/permission/permission.core.d.ts.map +1 -0
- package/dist/permission/permission.core.js +72 -0
- package/dist/permission/permission.core.js.map +1 -0
- package/dist/permission/permissionRegistry.d.ts +63 -0
- package/dist/permission/permissionRegistry.d.ts.map +1 -0
- package/dist/permission/permissionRegistry.js +88 -0
- package/dist/permission/permissionRegistry.js.map +1 -0
- package/dist/permissionErrors/index.d.ts +8 -0
- package/dist/permissionErrors/index.d.ts.map +1 -0
- package/dist/permissionErrors/index.js +8 -0
- package/dist/permissionErrors/index.js.map +1 -0
- package/dist/permissionErrors/permissionError.access.d.ts +39 -0
- package/dist/permissionErrors/permissionError.access.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.access.js +65 -0
- package/dist/permissionErrors/permissionError.access.js.map +1 -0
- package/dist/permissionErrors/permissionError.base.d.ts +19 -0
- package/dist/permissionErrors/permissionError.base.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.base.js +21 -0
- package/dist/permissionErrors/permissionError.base.js.map +1 -0
- package/dist/permissionErrors/permissionError.types.d.ts +6 -0
- package/dist/permissionErrors/permissionError.types.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.types.js +6 -0
- package/dist/permissionErrors/permissionError.types.js.map +1 -0
- package/dist/permissionErrors/permissionError.validation.d.ts +47 -0
- package/dist/permissionErrors/permissionError.validation.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.validation.js +78 -0
- package/dist/permissionErrors/permissionError.validation.js.map +1 -0
- package/dist/permissionTypes/index.d.ts +9 -0
- package/dist/permissionTypes/index.d.ts.map +1 -0
- package/dist/permissionTypes/index.js +9 -0
- package/dist/permissionTypes/index.js.map +1 -0
- package/dist/permissionTypes/permissionActor.d.ts +28 -0
- package/dist/permissionTypes/permissionActor.d.ts.map +1 -0
- package/dist/permissionTypes/permissionActor.js +7 -0
- package/dist/permissionTypes/permissionActor.js.map +1 -0
- package/dist/permissionTypes/policyTypes.d.ts +62 -0
- package/dist/permissionTypes/policyTypes.d.ts.map +1 -0
- package/dist/permissionTypes/policyTypes.js +7 -0
- package/dist/permissionTypes/policyTypes.js.map +1 -0
- package/dist/permissionTypes/ruleTypes.d.ts +50 -0
- package/dist/permissionTypes/ruleTypes.d.ts.map +1 -0
- package/dist/permissionTypes/ruleTypes.js +7 -0
- package/dist/permissionTypes/ruleTypes.js.map +1 -0
- package/dist/policy/index.d.ts +7 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +7 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policyRegistry.d.ts +36 -0
- package/dist/policy/policyRegistry.d.ts.map +1 -0
- package/dist/policy/policyRegistry.js +57 -0
- package/dist/policy/policyRegistry.js.map +1 -0
- package/dist/resolvers/index.d.ts +7 -0
- package/dist/resolvers/index.d.ts.map +1 -0
- package/dist/resolvers/index.js +7 -0
- package/dist/resolvers/index.js.map +1 -0
- package/dist/resolvers/resolvers.core.d.ts +23 -0
- package/dist/resolvers/resolvers.core.d.ts.map +1 -0
- package/dist/resolvers/resolvers.core.js +46 -0
- package/dist/resolvers/resolvers.core.js.map +1 -0
- package/dist/role/index.d.ts +8 -0
- package/dist/role/index.d.ts.map +1 -0
- package/dist/role/index.js +8 -0
- package/dist/role/index.js.map +1 -0
- package/dist/role/roleHierarchy.d.ts +15 -0
- package/dist/role/roleHierarchy.d.ts.map +1 -0
- package/dist/role/roleHierarchy.js +48 -0
- package/dist/role/roleHierarchy.js.map +1 -0
- package/dist/role/roleRegistry.d.ts +45 -0
- package/dist/role/roleRegistry.d.ts.map +1 -0
- package/dist/role/roleRegistry.js +67 -0
- package/dist/role/roleRegistry.js.map +1 -0
- package/dist/rule/index.d.ts +8 -0
- package/dist/rule/index.d.ts.map +1 -0
- package/dist/rule/index.js +8 -0
- package/dist/rule/index.js.map +1 -0
- package/dist/rule/rule.core.d.ts +24 -0
- package/dist/rule/rule.core.d.ts.map +1 -0
- package/dist/rule/rule.core.js +79 -0
- package/dist/rule/rule.core.js.map +1 -0
- package/dist/rule/ruleCompiler.d.ts +27 -0
- package/dist/rule/ruleCompiler.d.ts.map +1 -0
- package/dist/rule/ruleCompiler.js +76 -0
- package/dist/rule/ruleCompiler.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/utils.helper.d.ts +37 -0
- package/dist/utils/utils.helper.d.ts.map +1 -0
- package/dist/utils/utils.helper.js +50 -0
- package/dist/utils/utils.helper.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability helpers for authorization events and metrics.
|
|
3
|
+
*
|
|
4
|
+
* @module observability/observability
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a permission event emitter.
|
|
8
|
+
*/
|
|
9
|
+
export function createPermissionEventEmitter() {
|
|
10
|
+
const handlers = new Set();
|
|
11
|
+
return {
|
|
12
|
+
/** Register an event handler. */
|
|
13
|
+
on(handler) {
|
|
14
|
+
handlers.add(handler);
|
|
15
|
+
return () => {
|
|
16
|
+
handlers.delete(handler);
|
|
17
|
+
};
|
|
18
|
+
},
|
|
19
|
+
/** Emit a permission check event. */
|
|
20
|
+
emit(event) {
|
|
21
|
+
for (const handler of handlers) {
|
|
22
|
+
try {
|
|
23
|
+
handler(event);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Swallow handler errors to prevent breaking authorization
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Wrap a permission check with observability.
|
|
34
|
+
*
|
|
35
|
+
* @param emitter - The event emitter.
|
|
36
|
+
* @param fn - The permission check function.
|
|
37
|
+
* @returns Wrapped function that emits events.
|
|
38
|
+
*/
|
|
39
|
+
export function withObservability(emitter, fn) {
|
|
40
|
+
return (async (...args) => {
|
|
41
|
+
const start = performance.now();
|
|
42
|
+
const decision = await fn(...args);
|
|
43
|
+
const durationMs = performance.now() - start;
|
|
44
|
+
emitter.emit({
|
|
45
|
+
actorId: args[0]?.id ?? "unknown",
|
|
46
|
+
permission: args[1] ?? "unknown",
|
|
47
|
+
allowed: decision.allowed,
|
|
48
|
+
reason: decision.reason,
|
|
49
|
+
durationMs,
|
|
50
|
+
});
|
|
51
|
+
return decision;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=observability.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.core.js","sourceRoot":"","sources":["../../src/observability/observability.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuBH;;GAEG;AACH,MAAM,UAAU,4BAA4B;IAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,OAAO;QACL,iCAAiC;QACjC,EAAE,CAAC,OAA+B;YAChC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,GAAG,EAAE;gBACV,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC,CAAC;QACJ,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,KAA2B;YAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAE/B,OAAwD,EAAE,EAAK;IAC/D,OAAO,CAAC,KAAK,EAAE,GAAG,IAAwB,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAE7C,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAG,IAAI,CAAC,CAAC,CAA6B,EAAE,EAAE,IAAI,SAAS;YAC9D,UAAU,EAAG,IAAI,CAAC,CAAC,CAAY,IAAI,SAAS;YAC5C,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU;SACX,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAM,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission parsing, matching, and registry.
|
|
3
|
+
*
|
|
4
|
+
* @module permission
|
|
5
|
+
*/
|
|
6
|
+
export { parsePermission, isValidPermission, matches, matchesPermission, } from "./permission.core.js";
|
|
7
|
+
export { createPermissionRegistry, type PermissionRegistryOptions, } from "./permissionRegistry.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permission/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission parsing, matching, and registry.
|
|
3
|
+
*
|
|
4
|
+
* @module permission
|
|
5
|
+
*/
|
|
6
|
+
export { parsePermission, isValidPermission, matches, matchesPermission, } from "./permission.core.js";
|
|
7
|
+
export { createPermissionRegistry, } from "./permissionRegistry.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permission/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,GAEzB,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission string parsing and wildcard matching.
|
|
3
|
+
*
|
|
4
|
+
* @module permission/permission
|
|
5
|
+
*/
|
|
6
|
+
import type { Permission } from "../permissionTypes/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Parse a permission string into a structured Permission.
|
|
9
|
+
*
|
|
10
|
+
* @example parsePermission("post:update") → { resource: "post", action: "update" }
|
|
11
|
+
* @example parsePermission("billing.invoice:refund") → { resource: "billing.invoice", action: "refund" }
|
|
12
|
+
*/
|
|
13
|
+
export declare function parsePermission(permission: string): Permission;
|
|
14
|
+
/**
|
|
15
|
+
* Check if a permission string is valid without throwing.
|
|
16
|
+
*/
|
|
17
|
+
export declare function isValidPermission(permission: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Check if a permission matches a target permission, supporting wildcards.
|
|
20
|
+
*
|
|
21
|
+
* @example matches("post:*", "post:update") → true
|
|
22
|
+
* @example matches("*:*", "anything:goes") → true
|
|
23
|
+
* @example matches("post:read", "post:update") → false
|
|
24
|
+
*/
|
|
25
|
+
export declare function matches(pattern: string, target: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a permission string matches a structured Permission object.
|
|
28
|
+
*/
|
|
29
|
+
export declare function matchesPermission(pattern: string, permission: Permission): boolean;
|
|
30
|
+
//# sourceMappingURL=permission.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.core.d.ts","sourceRoot":"","sources":["../../src/permission/permission.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAM9D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAiBhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,GACrB,OAAO,CAWT"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission string parsing and wildcard matching.
|
|
3
|
+
*
|
|
4
|
+
* @module permission/permission
|
|
5
|
+
*/
|
|
6
|
+
import { InvalidPermissionError } from "../permissionErrors/index.js";
|
|
7
|
+
/** Regex for valid permission format: resource:action (supports namespaces and wildcards). */
|
|
8
|
+
const PERMISSION_REGEX = /^[a-zA-Z0-9._*-]+:[a-zA-Z0-9._*-]+$/;
|
|
9
|
+
/**
|
|
10
|
+
* Parse a permission string into a structured Permission.
|
|
11
|
+
*
|
|
12
|
+
* @example parsePermission("post:update") → { resource: "post", action: "update" }
|
|
13
|
+
* @example parsePermission("billing.invoice:refund") → { resource: "billing.invoice", action: "refund" }
|
|
14
|
+
*/
|
|
15
|
+
export function parsePermission(permission) {
|
|
16
|
+
if (!PERMISSION_REGEX.test(permission)) {
|
|
17
|
+
throw new InvalidPermissionError(permission);
|
|
18
|
+
}
|
|
19
|
+
const lastColon = permission.lastIndexOf(":");
|
|
20
|
+
const resource = permission.slice(0, lastColon);
|
|
21
|
+
const action = permission.slice(lastColon + 1);
|
|
22
|
+
return Object.freeze({ resource, action });
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if a permission string is valid without throwing.
|
|
26
|
+
*/
|
|
27
|
+
export function isValidPermission(permission) {
|
|
28
|
+
return PERMISSION_REGEX.test(permission);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a permission matches a target permission, supporting wildcards.
|
|
32
|
+
*
|
|
33
|
+
* @example matches("post:*", "post:update") → true
|
|
34
|
+
* @example matches("*:*", "anything:goes") → true
|
|
35
|
+
* @example matches("post:read", "post:update") → false
|
|
36
|
+
*/
|
|
37
|
+
export function matches(pattern, target) {
|
|
38
|
+
if (pattern === "*:*")
|
|
39
|
+
return true;
|
|
40
|
+
const patternParsed = parsePermissionSafe(pattern);
|
|
41
|
+
const targetParsed = parsePermissionSafe(target);
|
|
42
|
+
if (!patternParsed || !targetParsed)
|
|
43
|
+
return false;
|
|
44
|
+
const resourceMatch = patternParsed.resource === "*" ||
|
|
45
|
+
patternParsed.resource === targetParsed.resource;
|
|
46
|
+
const actionMatch = patternParsed.action === "*" ||
|
|
47
|
+
patternParsed.action === targetParsed.action;
|
|
48
|
+
return resourceMatch && actionMatch;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a permission string matches a structured Permission object.
|
|
52
|
+
*/
|
|
53
|
+
export function matchesPermission(pattern, permission) {
|
|
54
|
+
const parsed = parsePermissionSafe(pattern);
|
|
55
|
+
if (!parsed)
|
|
56
|
+
return false;
|
|
57
|
+
const resourceMatch = parsed.resource === "*" || parsed.resource === permission.resource;
|
|
58
|
+
const actionMatch = parsed.action === "*" || parsed.action === permission.action;
|
|
59
|
+
return resourceMatch && actionMatch;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Parse a permission string, returning null on invalid format instead of throwing.
|
|
63
|
+
*/
|
|
64
|
+
function parsePermissionSafe(permission) {
|
|
65
|
+
if (!PERMISSION_REGEX.test(permission))
|
|
66
|
+
return null;
|
|
67
|
+
const lastColon = permission.lastIndexOf(":");
|
|
68
|
+
const resource = permission.slice(0, lastColon);
|
|
69
|
+
const action = permission.slice(lastColon + 1);
|
|
70
|
+
return { resource, action };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=permission.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission.core.js","sourceRoot":"","sources":["../../src/permission/permission.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,8FAA8F;AAC9F,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,MAAc;IACrD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,aAAa,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAElD,MAAM,aAAa,GACjB,aAAa,CAAC,QAAQ,KAAK,GAAG;QAC9B,aAAa,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;IAEnD,MAAM,WAAW,GACf,aAAa,CAAC,MAAM,KAAK,GAAG;QAC5B,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;IAE/C,OAAO,aAAa,IAAI,WAAW,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,UAAsB;IAEtB,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE1B,MAAM,aAAa,GACjB,MAAM,CAAC,QAAQ,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAAC;IAErE,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC;IAE/D,OAAO,aAAa,IAAI,WAAW,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,UAAkB;IAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry for defining and looking up permissions.
|
|
3
|
+
*
|
|
4
|
+
* @module permission/permissionRegistry
|
|
5
|
+
*/
|
|
6
|
+
import type { Permission } from "../permissionTypes/index.js";
|
|
7
|
+
/** A registered permission with optional metadata. */
|
|
8
|
+
interface RegisteredPermission {
|
|
9
|
+
readonly parsed: Permission;
|
|
10
|
+
readonly description?: string;
|
|
11
|
+
readonly implies?: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/** Options for the permission registry. */
|
|
14
|
+
export interface PermissionRegistryOptions {
|
|
15
|
+
/** Allow overwriting existing permissions. Defaults to false. */
|
|
16
|
+
readonly allowOverride?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a permission registry.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createPermissionRegistry(options?: PermissionRegistryOptions): {
|
|
22
|
+
/**
|
|
23
|
+
* Register a permission by string or structured object.
|
|
24
|
+
*/
|
|
25
|
+
define(permission: string | Permission, opts?: {
|
|
26
|
+
readonly description?: string;
|
|
27
|
+
readonly implies?: readonly string[];
|
|
28
|
+
}): void;
|
|
29
|
+
/**
|
|
30
|
+
* Look up a registered permission by string.
|
|
31
|
+
*/
|
|
32
|
+
get(permission: string): Permission | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Get the full registered permission entry.
|
|
35
|
+
*/
|
|
36
|
+
getEntry(permission: string): RegisteredPermission | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Check if a permission is registered.
|
|
39
|
+
*/
|
|
40
|
+
has(permission: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get all registered permission strings.
|
|
43
|
+
*/
|
|
44
|
+
all(): readonly string[];
|
|
45
|
+
/**
|
|
46
|
+
* Get permissions that match a pattern.
|
|
47
|
+
*/
|
|
48
|
+
match(pattern: string): readonly Permission[];
|
|
49
|
+
/**
|
|
50
|
+
* Get permissions implied by a given permission.
|
|
51
|
+
*/
|
|
52
|
+
getImplied(permission: string): readonly string[];
|
|
53
|
+
/**
|
|
54
|
+
* Remove a permission from the registry.
|
|
55
|
+
*/
|
|
56
|
+
remove(permission: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Clear all registered permissions.
|
|
59
|
+
*/
|
|
60
|
+
clear(): void;
|
|
61
|
+
};
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=permissionRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionRegistry.d.ts","sourceRoot":"","sources":["../../src/permission/permissionRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAO9D,sDAAsD;AACtD,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,2CAA2C;AAC3C,MAAM,WAAW,yBAAyB;IACxC,iEAAiE;IACjE,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,yBAAyB;IAKxE;;OAEG;IACH,MAAM,aACQ,MAAM,GAAG,UAAU,SACxB;QACL,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACtC,GACA,IAAI;IAkBP;;OAEG;IACH,GAAG,aAAa,MAAM,GAAG,UAAU,GAAG,SAAS;IAI/C;;OAEG;IACH,QAAQ,aAAa,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAI9D;;OAEG;IACH,GAAG,aAAa,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,GAAG,IAAI,SAAS,MAAM,EAAE;IAIxB;;OAEG;IACH,KAAK,UAAU,MAAM,GAAG,SAAS,UAAU,EAAE;IAU7C;;OAEG;IACH,UAAU,aAAa,MAAM,GAAG,SAAS,MAAM,EAAE;IAIjD;;OAEG;IACH,MAAM,aAAa,MAAM,GAAG,OAAO;IAInC;;OAEG;IACH,KAAK,IAAI,IAAI;EAIhB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry for defining and looking up permissions.
|
|
3
|
+
*
|
|
4
|
+
* @module permission/permissionRegistry
|
|
5
|
+
*/
|
|
6
|
+
import { DuplicatePermissionError, PermissionNotFoundError, } from "../permissionErrors/index.js";
|
|
7
|
+
import { parsePermission, matchesPermission } from "./permission.core.js";
|
|
8
|
+
/**
|
|
9
|
+
* Create a permission registry.
|
|
10
|
+
*/
|
|
11
|
+
export function createPermissionRegistry(options) {
|
|
12
|
+
const permissions = new Map();
|
|
13
|
+
const allowOverride = options?.allowOverride ?? false;
|
|
14
|
+
return {
|
|
15
|
+
/**
|
|
16
|
+
* Register a permission by string or structured object.
|
|
17
|
+
*/
|
|
18
|
+
define(permission, opts) {
|
|
19
|
+
const parsed = typeof permission === "string"
|
|
20
|
+
? parsePermission(permission)
|
|
21
|
+
: permission;
|
|
22
|
+
const key = `${parsed.resource}:${parsed.action}`;
|
|
23
|
+
if (permissions.has(key) && !allowOverride) {
|
|
24
|
+
throw new DuplicatePermissionError(key);
|
|
25
|
+
}
|
|
26
|
+
permissions.set(key, {
|
|
27
|
+
parsed: Object.freeze(parsed),
|
|
28
|
+
description: opts?.description,
|
|
29
|
+
implies: opts?.implies,
|
|
30
|
+
});
|
|
31
|
+
},
|
|
32
|
+
/**
|
|
33
|
+
* Look up a registered permission by string.
|
|
34
|
+
*/
|
|
35
|
+
get(permission) {
|
|
36
|
+
return permissions.get(permission)?.parsed;
|
|
37
|
+
},
|
|
38
|
+
/**
|
|
39
|
+
* Get the full registered permission entry.
|
|
40
|
+
*/
|
|
41
|
+
getEntry(permission) {
|
|
42
|
+
return permissions.get(permission);
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Check if a permission is registered.
|
|
46
|
+
*/
|
|
47
|
+
has(permission) {
|
|
48
|
+
return permissions.has(permission);
|
|
49
|
+
},
|
|
50
|
+
/**
|
|
51
|
+
* Get all registered permission strings.
|
|
52
|
+
*/
|
|
53
|
+
all() {
|
|
54
|
+
return Array.from(permissions.keys());
|
|
55
|
+
},
|
|
56
|
+
/**
|
|
57
|
+
* Get permissions that match a pattern.
|
|
58
|
+
*/
|
|
59
|
+
match(pattern) {
|
|
60
|
+
const results = [];
|
|
61
|
+
for (const [, entry] of permissions) {
|
|
62
|
+
if (matchesPermission(pattern, entry.parsed)) {
|
|
63
|
+
results.push(entry.parsed);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
67
|
+
},
|
|
68
|
+
/**
|
|
69
|
+
* Get permissions implied by a given permission.
|
|
70
|
+
*/
|
|
71
|
+
getImplied(permission) {
|
|
72
|
+
return permissions.get(permission)?.implies ?? [];
|
|
73
|
+
},
|
|
74
|
+
/**
|
|
75
|
+
* Remove a permission from the registry.
|
|
76
|
+
*/
|
|
77
|
+
remove(permission) {
|
|
78
|
+
return permissions.delete(permission);
|
|
79
|
+
},
|
|
80
|
+
/**
|
|
81
|
+
* Clear all registered permissions.
|
|
82
|
+
*/
|
|
83
|
+
clear() {
|
|
84
|
+
permissions.clear();
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=permissionRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionRegistry.js","sourceRoot":"","sources":["../../src/permission/permissionRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAe1E;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAmC;IAC1E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC5D,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,KAAK,CAAC;IAEtD,OAAO;QACL;;WAEG;QACH,MAAM,CACJ,UAA+B,EAC/B,IAGC;YAED,MAAM,MAAM,GACV,OAAO,UAAU,KAAK,QAAQ;gBAC5B,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC;gBAC7B,CAAC,CAAC,UAAU,CAAC;YACjB,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAElD,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC3C,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;YAED,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC7B,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,OAAO,EAAE,IAAI,EAAE,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;QAED;;WAEG;QACH,GAAG,CAAC,UAAkB;YACpB,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7C,CAAC;QAED;;WAEG;QACH,QAAQ,CAAC,UAAkB;YACzB,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAED;;WAEG;QACH,GAAG,CAAC,UAAkB;YACpB,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAED;;WAEG;QACH,GAAG;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QAED;;WAEG;QACH,KAAK,CAAC,OAAe;YACnB,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC;gBACpC,IAAI,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED;;WAEG;QACH,UAAU,CAAC,UAAkB;YAC3B,OAAO,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QACpD,CAAC;QAED;;WAEG;QACH,MAAM,CAAC,UAAkB;YACvB,OAAO,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;QAED;;WAEG;QACH,KAAK;YACH,WAAW,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission error types.
|
|
3
|
+
*
|
|
4
|
+
* @module permissionErrors
|
|
5
|
+
*/
|
|
6
|
+
export { PermissionError } from "./permissionError.base.js";
|
|
7
|
+
export { PermissionDeniedError, PermissionNotFoundError, DuplicatePermissionError, RoleNotFoundError, DuplicateRoleError, InvalidPermissionError, InvalidRoleError, CircularRoleInheritanceError, PolicyError, PolicyTimeoutError, PermissionResolverError, AuthorizationAbortedError, } from "./permissionError.types.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/permissionErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission error types.
|
|
3
|
+
*
|
|
4
|
+
* @module permissionErrors
|
|
5
|
+
*/
|
|
6
|
+
export { PermissionError } from "./permissionError.base.js";
|
|
7
|
+
export { PermissionDeniedError, PermissionNotFoundError, DuplicatePermissionError, RoleNotFoundError, DuplicateRoleError, InvalidPermissionError, InvalidRoleError, CircularRoleInheritanceError, PolicyError, PolicyTimeoutError, PermissionResolverError, AuthorizationAbortedError, } from "./permissionError.types.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/permissionErrors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access-related permission errors.
|
|
3
|
+
*/
|
|
4
|
+
import { PermissionError } from "./permissionError.base.js";
|
|
5
|
+
/**
|
|
6
|
+
* Access denied — the actor is not authorized.
|
|
7
|
+
*/
|
|
8
|
+
export declare class PermissionDeniedError extends PermissionError {
|
|
9
|
+
constructor(message?: string, options?: {
|
|
10
|
+
readonly actorId?: string;
|
|
11
|
+
readonly permission?: string;
|
|
12
|
+
readonly resourceType?: string;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A referenced permission does not exist in the registry.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PermissionNotFoundError extends PermissionError {
|
|
19
|
+
constructor(permission: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A duplicate permission was registered.
|
|
23
|
+
*/
|
|
24
|
+
export declare class DuplicatePermissionError extends PermissionError {
|
|
25
|
+
constructor(permission: string);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A referenced role does not exist in the registry.
|
|
29
|
+
*/
|
|
30
|
+
export declare class RoleNotFoundError extends PermissionError {
|
|
31
|
+
constructor(role: string);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A duplicate role was registered.
|
|
35
|
+
*/
|
|
36
|
+
export declare class DuplicateRoleError extends PermissionError {
|
|
37
|
+
constructor(role: string);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=permissionError.access.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.access.d.ts","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.access.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,YACE,OAAO,SAAkB,EACzB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KAChC,EAUF;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,UAAU,EAAE,MAAM,EAK7B;CACF;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,eAAe;IAC3D,YAAY,UAAU,EAAE,MAAM,EAK7B;CACF;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAI,EAAE,MAAM,EAKvB;CACF;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,YAAY,IAAI,EAAE,MAAM,EAKvB;CACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access-related permission errors.
|
|
3
|
+
*/
|
|
4
|
+
import { ErrorCode } from "@zudojs/errors";
|
|
5
|
+
import { PermissionError } from "./permissionError.base.js";
|
|
6
|
+
/**
|
|
7
|
+
* Access denied — the actor is not authorized.
|
|
8
|
+
*/
|
|
9
|
+
export class PermissionDeniedError extends PermissionError {
|
|
10
|
+
constructor(message = "Access denied", options) {
|
|
11
|
+
super(message, {
|
|
12
|
+
code: ErrorCode.ACCESS_DENIED,
|
|
13
|
+
metadata: {
|
|
14
|
+
actorId: options?.actorId,
|
|
15
|
+
permission: options?.permission,
|
|
16
|
+
resourceType: options?.resourceType,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A referenced permission does not exist in the registry.
|
|
23
|
+
*/
|
|
24
|
+
export class PermissionNotFoundError extends PermissionError {
|
|
25
|
+
constructor(permission) {
|
|
26
|
+
super(`Permission not found: ${permission}`, {
|
|
27
|
+
code: ErrorCode.NOT_FOUND,
|
|
28
|
+
metadata: { permission },
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A duplicate permission was registered.
|
|
34
|
+
*/
|
|
35
|
+
export class DuplicatePermissionError extends PermissionError {
|
|
36
|
+
constructor(permission) {
|
|
37
|
+
super(`Duplicate permission: ${permission}`, {
|
|
38
|
+
code: ErrorCode.CONFLICT,
|
|
39
|
+
metadata: { permission },
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A referenced role does not exist in the registry.
|
|
45
|
+
*/
|
|
46
|
+
export class RoleNotFoundError extends PermissionError {
|
|
47
|
+
constructor(role) {
|
|
48
|
+
super(`Role not found: ${role}`, {
|
|
49
|
+
code: ErrorCode.NOT_FOUND,
|
|
50
|
+
metadata: { role },
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A duplicate role was registered.
|
|
56
|
+
*/
|
|
57
|
+
export class DuplicateRoleError extends PermissionError {
|
|
58
|
+
constructor(role) {
|
|
59
|
+
super(`Duplicate role: ${role}`, {
|
|
60
|
+
code: ErrorCode.CONFLICT,
|
|
61
|
+
metadata: { role },
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=permissionError.access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.access.js","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.access.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,qBAAsB,SAAQ,eAAe;IACxD,YACE,OAAO,GAAG,eAAe,EACzB,OAIC;QAED,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,SAAS,CAAC,aAAa;YAC7B,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,UAAU,EAAE,OAAO,EAAE,UAAU;gBAC/B,YAAY,EAAE,OAAO,EAAE,YAAY;aACpC;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,UAAkB;QAC5B,KAAK,CAAC,yBAAyB,UAAU,EAAE,EAAE;YAC3C,IAAI,EAAE,SAAS,CAAC,SAAS;YACzB,QAAQ,EAAE,EAAE,UAAU,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,eAAe;IAC3D,YAAY,UAAkB;QAC5B,KAAK,CAAC,yBAAyB,UAAU,EAAE,EAAE;YAC3C,IAAI,EAAE,SAAS,CAAC,QAAQ;YACxB,QAAQ,EAAE,EAAE,UAAU,EAAE;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,EAAE;YAC/B,IAAI,EAAE,SAAS,CAAC,SAAS;YACzB,QAAQ,EAAE,EAAE,IAAI,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IACrD,YAAY,IAAY;QACtB,KAAK,CAAC,mBAAmB,IAAI,EAAE,EAAE;YAC/B,IAAI,EAAE,SAAS,CAAC,QAAQ;YACxB,QAAQ,EAAE,EAAE,IAAI,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base PermissionError class.
|
|
3
|
+
*
|
|
4
|
+
* @module permissionErrors/permissionError
|
|
5
|
+
*
|
|
6
|
+
* Extends AuthorizationError from @zudojs/errors.
|
|
7
|
+
*/
|
|
8
|
+
import { AuthorizationError, ErrorCode, type ErrorMetadata } from "@zudojs/errors";
|
|
9
|
+
/**
|
|
10
|
+
* Base error for all permission-related failures.
|
|
11
|
+
*/
|
|
12
|
+
export declare class PermissionError extends AuthorizationError {
|
|
13
|
+
constructor(message: string, options?: {
|
|
14
|
+
readonly code?: ErrorCode;
|
|
15
|
+
readonly metadata?: ErrorMetadata;
|
|
16
|
+
readonly cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=permissionError.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.base.d.ts","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,KAAK,aAAa,EACnB,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;QAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;KAC1B,EAOF;CACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base PermissionError class.
|
|
3
|
+
*
|
|
4
|
+
* @module permissionErrors/permissionError
|
|
5
|
+
*
|
|
6
|
+
* Extends AuthorizationError from @zudojs/errors.
|
|
7
|
+
*/
|
|
8
|
+
import { AuthorizationError, ErrorCode, } from "@zudojs/errors";
|
|
9
|
+
/**
|
|
10
|
+
* Base error for all permission-related failures.
|
|
11
|
+
*/
|
|
12
|
+
export class PermissionError extends AuthorizationError {
|
|
13
|
+
constructor(message, options) {
|
|
14
|
+
super(message, {
|
|
15
|
+
code: options?.code ?? ErrorCode.FORBIDDEN,
|
|
16
|
+
metadata: options?.metadata,
|
|
17
|
+
cause: options?.cause,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=permissionError.base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.base.js","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.base.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,kBAAkB,EAClB,SAAS,GAEV,MAAM,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IACrD,YACE,OAAe,EACf,OAIC;QAED,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,SAAS;YAC1C,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission error types — re-exports from focused files.
|
|
3
|
+
*/
|
|
4
|
+
export { PermissionDeniedError, PermissionNotFoundError, DuplicatePermissionError, RoleNotFoundError, DuplicateRoleError, } from "./permissionError.access.js";
|
|
5
|
+
export { InvalidPermissionError, InvalidRoleError, CircularRoleInheritanceError, PolicyError, PolicyTimeoutError, PermissionResolverError, AuthorizationAbortedError, } from "./permissionError.validation.js";
|
|
6
|
+
//# sourceMappingURL=permissionError.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.types.d.ts","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission error types — re-exports from focused files.
|
|
3
|
+
*/
|
|
4
|
+
export { PermissionDeniedError, PermissionNotFoundError, DuplicatePermissionError, RoleNotFoundError, DuplicateRoleError, } from "./permissionError.access.js";
|
|
5
|
+
export { InvalidPermissionError, InvalidRoleError, CircularRoleInheritanceError, PolicyError, PolicyTimeoutError, PermissionResolverError, AuthorizationAbortedError, } from "./permissionError.validation.js";
|
|
6
|
+
//# sourceMappingURL=permissionError.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.types.js","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,WAAW,EACX,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation and policy-related permission errors.
|
|
3
|
+
*/
|
|
4
|
+
import { PermissionError } from "./permissionError.base.js";
|
|
5
|
+
/**
|
|
6
|
+
* A permission string is malformed.
|
|
7
|
+
*/
|
|
8
|
+
export declare class InvalidPermissionError extends PermissionError {
|
|
9
|
+
constructor(permission: string);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A role definition is invalid.
|
|
13
|
+
*/
|
|
14
|
+
export declare class InvalidRoleError extends PermissionError {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Circular role inheritance detected.
|
|
19
|
+
*/
|
|
20
|
+
export declare class CircularRoleInheritanceError extends PermissionError {
|
|
21
|
+
constructor(chain: readonly string[]);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A policy evaluation failed.
|
|
25
|
+
*/
|
|
26
|
+
export declare class PolicyError extends PermissionError {
|
|
27
|
+
constructor(policyName: string, cause?: unknown);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A policy evaluation exceeded the timeout.
|
|
31
|
+
*/
|
|
32
|
+
export declare class PolicyTimeoutError extends PermissionError {
|
|
33
|
+
constructor(policyName: string, timeoutMs: number);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A permission resolver failed.
|
|
37
|
+
*/
|
|
38
|
+
export declare class PermissionResolverError extends PermissionError {
|
|
39
|
+
constructor(message: string, cause?: unknown);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Authorization was cancelled via AbortSignal.
|
|
43
|
+
*/
|
|
44
|
+
export declare class AuthorizationAbortedError extends PermissionError {
|
|
45
|
+
constructor();
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=permissionError.validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissionError.validation.d.ts","sourceRoot":"","sources":["../../src/permissionErrors/permissionError.validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;IACzD,YAAY,UAAU,EAAE,MAAM,EAK7B;CACF;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;IACnD,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,eAAe;IAC/D,YAAY,KAAK,EAAE,SAAS,MAAM,EAAE,EAKnC;CACF;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,eAAe;IAC9C,YAAY,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAM9C;CACF;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,YAAY,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAKhD;CACF;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,eAAe;IAC1D,YAAY,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAK3C;CACF;AAED;;GAEG;AACH,qBAAa,yBAA0B,SAAQ,eAAe;IAC5D,cAEC;CACF"}
|