@siremzam/sentinel 0.3.1 → 0.3.2

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 (59) hide show
  1. package/README.md +573 -177
  2. package/dist/engine-C6IASR5F.d.cts +283 -0
  3. package/dist/engine-C6IASR5F.d.ts +283 -0
  4. package/dist/index.cjs +877 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.d.cts +58 -0
  7. package/dist/index.d.ts +58 -10
  8. package/dist/index.js +838 -5
  9. package/dist/index.js.map +1 -1
  10. package/dist/middleware/express.cjs +58 -0
  11. package/dist/middleware/express.cjs.map +1 -0
  12. package/dist/middleware/express.d.cts +35 -0
  13. package/dist/middleware/express.d.ts +6 -6
  14. package/dist/middleware/express.js +31 -39
  15. package/dist/middleware/express.js.map +1 -1
  16. package/dist/middleware/fastify.cjs +59 -0
  17. package/dist/middleware/fastify.cjs.map +1 -0
  18. package/dist/middleware/fastify.d.cts +29 -0
  19. package/dist/middleware/fastify.d.ts +6 -6
  20. package/dist/middleware/fastify.js +32 -39
  21. package/dist/middleware/fastify.js.map +1 -1
  22. package/dist/middleware/nestjs.cjs +84 -0
  23. package/dist/middleware/nestjs.cjs.map +1 -0
  24. package/dist/middleware/nestjs.d.cts +67 -0
  25. package/dist/middleware/nestjs.d.ts +9 -9
  26. package/dist/middleware/nestjs.js +51 -76
  27. package/dist/middleware/nestjs.js.map +1 -1
  28. package/dist/server.cjs +184 -0
  29. package/dist/server.cjs.map +1 -0
  30. package/dist/server.d.cts +54 -0
  31. package/dist/server.d.ts +10 -8
  32. package/dist/server.js +149 -153
  33. package/dist/server.js.map +1 -1
  34. package/package.json +22 -9
  35. package/dist/engine.d.ts +0 -70
  36. package/dist/engine.d.ts.map +0 -1
  37. package/dist/engine.js +0 -562
  38. package/dist/engine.js.map +0 -1
  39. package/dist/index.d.ts.map +0 -1
  40. package/dist/middleware/express.d.ts.map +0 -1
  41. package/dist/middleware/fastify.d.ts.map +0 -1
  42. package/dist/middleware/nestjs.d.ts.map +0 -1
  43. package/dist/policy-builder.d.ts +0 -39
  44. package/dist/policy-builder.d.ts.map +0 -1
  45. package/dist/policy-builder.js +0 -92
  46. package/dist/policy-builder.js.map +0 -1
  47. package/dist/role-hierarchy.d.ts +0 -42
  48. package/dist/role-hierarchy.d.ts.map +0 -1
  49. package/dist/role-hierarchy.js +0 -87
  50. package/dist/role-hierarchy.js.map +0 -1
  51. package/dist/serialization.d.ts +0 -52
  52. package/dist/serialization.d.ts.map +0 -1
  53. package/dist/serialization.js +0 -144
  54. package/dist/serialization.js.map +0 -1
  55. package/dist/server.d.ts.map +0 -1
  56. package/dist/types.d.ts +0 -137
  57. package/dist/types.d.ts.map +0 -1
  58. package/dist/types.js +0 -27
  59. package/dist/types.js.map +0 -1
@@ -1,92 +0,0 @@
1
- let ruleCounter = 0;
2
- function nextRuleId(prefix) {
3
- return `${prefix}-${++ruleCounter}`;
4
- }
5
- export class RuleBuilder {
6
- _effect;
7
- _roles = "*";
8
- _actions = "*";
9
- _resources = "*";
10
- _conditions = [];
11
- _priority = 0;
12
- _description;
13
- _id;
14
- constructor(effect) {
15
- this._effect = effect;
16
- this._id = nextRuleId(effect);
17
- }
18
- id(id) {
19
- this._id = id;
20
- return this;
21
- }
22
- roles(...roles) {
23
- this._roles = roles;
24
- return this;
25
- }
26
- anyRole() {
27
- this._roles = "*";
28
- return this;
29
- }
30
- actions(...actions) {
31
- this._actions = actions;
32
- return this;
33
- }
34
- anyAction() {
35
- this._actions = "*";
36
- return this;
37
- }
38
- on(...resources) {
39
- this._resources = resources;
40
- return this;
41
- }
42
- anyResource() {
43
- this._resources = "*";
44
- return this;
45
- }
46
- when(condition) {
47
- this._conditions.push(condition);
48
- return this;
49
- }
50
- priority(p) {
51
- this._priority = p;
52
- return this;
53
- }
54
- describe(desc) {
55
- this._description = desc;
56
- return this;
57
- }
58
- build() {
59
- return {
60
- id: this._id,
61
- effect: this._effect,
62
- roles: this._roles,
63
- actions: this._actions,
64
- resources: this._resources,
65
- conditions: this._conditions.length > 0 ? this._conditions : undefined,
66
- priority: this._priority,
67
- description: this._description,
68
- };
69
- }
70
- }
71
- export function allow() {
72
- return new RuleBuilder("allow");
73
- }
74
- export function deny() {
75
- return new RuleBuilder("deny");
76
- }
77
- /**
78
- * Creates schema-bound allow/deny factories so you don't need to pass
79
- * the generic parameter on every call.
80
- *
81
- * ```ts
82
- * const { allow, deny } = createPolicyFactory<MySchema>();
83
- * allow().roles("admin").anyAction().anyResource().build();
84
- * ```
85
- */
86
- export function createPolicyFactory() {
87
- return {
88
- allow: () => new RuleBuilder("allow"),
89
- deny: () => new RuleBuilder("deny"),
90
- };
91
- }
92
- //# sourceMappingURL=policy-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"policy-builder.js","sourceRoot":"","sources":["../src/policy-builder.ts"],"names":[],"mappings":"AAUA,IAAI,WAAW,GAAG,CAAC,CAAC;AAEpB,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO,GAAG,MAAM,IAAI,EAAE,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,OAAO,WAAW;IACd,OAAO,CAAe;IACtB,MAAM,GAAyB,GAAG,CAAC;IACnC,QAAQ,GAA2B,GAAG,CAAC;IACvC,UAAU,GAA6B,GAAG,CAAC;IAC3C,WAAW,GAAmB,EAAE,CAAC;IACjC,SAAS,GAAG,CAAC,CAAC;IACd,YAAY,CAAU;IACtB,GAAG,CAAS;IAEpB,YAAY,MAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,EAAE,CAAC,EAAU;QACX,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,GAAG,KAAqB;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,OAAyB;QAClC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS;QACP,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,EAAE,CAAC,GAAG,SAA6B;QACjC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW;QACT,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,SAAuB;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,CAAS;QAChB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,IAAY;QACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,GAAG;YACZ,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,OAAO,EAAE,IAAI,CAAC,QAAQ;YACtB,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YACtE,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,WAAW,EAAE,IAAI,CAAC,YAAY;SAC/B,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,KAAK;IACnB,OAAO,IAAI,WAAW,CAAI,OAAO,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,IAAI,WAAW,CAAI,MAAM,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IAIjC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAI,OAAO,CAAC;QACxC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,CAAI,MAAM,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -1,42 +0,0 @@
1
- import type { SchemaDefinition, InferRole } from "./types.js";
2
- /**
3
- * Defines a role inheritance hierarchy.
4
- *
5
- * When a role inherits from another, it gains all permissions of its parent roles.
6
- * Cycles are detected and rejected at definition time.
7
- *
8
- * ```ts
9
- * const hierarchy = new RoleHierarchy<MySchema>()
10
- * .define("admin", ["manager", "viewer"])
11
- * .define("manager", ["member"])
12
- * .define("member", ["viewer"]);
13
- *
14
- * hierarchy.resolve("admin");
15
- * // Set { "admin", "manager", "member", "viewer" }
16
- * ```
17
- */
18
- export declare class RoleHierarchy<S extends SchemaDefinition> {
19
- private parents;
20
- private cache;
21
- /**
22
- * Define that `role` inherits permissions from `inheritsFrom` roles.
23
- * Clears the resolution cache.
24
- */
25
- define(role: InferRole<S>, inheritsFrom: InferRole<S>[]): this;
26
- /**
27
- * Resolve the full set of roles a given role expands to,
28
- * including all inherited roles (transitive).
29
- */
30
- resolve(role: InferRole<S>): Set<string>;
31
- /**
32
- * Resolve multiple roles at once, returning the merged set.
33
- */
34
- resolveAll(roles: Iterable<InferRole<S>>): Set<string>;
35
- /**
36
- * Get all defined roles that have inheritance rules.
37
- */
38
- definedRoles(): string[];
39
- private walk;
40
- private detectCycle;
41
- }
42
- //# sourceMappingURL=role-hierarchy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-hierarchy.d.ts","sourceRoot":"","sources":["../src/role-hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAa,CAAC,CAAC,SAAS,gBAAgB;IACnD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAAkC;IAE/C;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAO9D;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAWxC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;IAUtD;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,WAAW;CAepB"}
@@ -1,87 +0,0 @@
1
- /**
2
- * Defines a role inheritance hierarchy.
3
- *
4
- * When a role inherits from another, it gains all permissions of its parent roles.
5
- * Cycles are detected and rejected at definition time.
6
- *
7
- * ```ts
8
- * const hierarchy = new RoleHierarchy<MySchema>()
9
- * .define("admin", ["manager", "viewer"])
10
- * .define("manager", ["member"])
11
- * .define("member", ["viewer"]);
12
- *
13
- * hierarchy.resolve("admin");
14
- * // Set { "admin", "manager", "member", "viewer" }
15
- * ```
16
- */
17
- export class RoleHierarchy {
18
- parents = new Map();
19
- cache = new Map();
20
- /**
21
- * Define that `role` inherits permissions from `inheritsFrom` roles.
22
- * Clears the resolution cache.
23
- */
24
- define(role, inheritsFrom) {
25
- this.parents.set(role, inheritsFrom);
26
- this.cache.clear();
27
- this.detectCycle(role, new Set());
28
- return this;
29
- }
30
- /**
31
- * Resolve the full set of roles a given role expands to,
32
- * including all inherited roles (transitive).
33
- */
34
- resolve(role) {
35
- const roleStr = role;
36
- const cached = this.cache.get(roleStr);
37
- if (cached)
38
- return cached;
39
- const result = new Set();
40
- this.walk(roleStr, result);
41
- this.cache.set(roleStr, result);
42
- return result;
43
- }
44
- /**
45
- * Resolve multiple roles at once, returning the merged set.
46
- */
47
- resolveAll(roles) {
48
- const result = new Set();
49
- for (const role of roles) {
50
- for (const r of this.resolve(role)) {
51
- result.add(r);
52
- }
53
- }
54
- return result;
55
- }
56
- /**
57
- * Get all defined roles that have inheritance rules.
58
- */
59
- definedRoles() {
60
- return [...this.parents.keys()];
61
- }
62
- walk(role, visited) {
63
- if (visited.has(role))
64
- return;
65
- visited.add(role);
66
- const parents = this.parents.get(role);
67
- if (parents) {
68
- for (const parent of parents) {
69
- this.walk(parent, visited);
70
- }
71
- }
72
- }
73
- detectCycle(role, visiting) {
74
- if (visiting.has(role)) {
75
- throw new Error(`Cycle detected in role hierarchy: ${[...visiting, role].join(" → ")}`);
76
- }
77
- visiting.add(role);
78
- const parents = this.parents.get(role);
79
- if (parents) {
80
- for (const parent of parents) {
81
- this.detectCycle(parent, visiting);
82
- }
83
- }
84
- visiting.delete(role);
85
- }
86
- }
87
- //# sourceMappingURL=role-hierarchy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-hierarchy.js","sourceRoot":"","sources":["../src/role-hierarchy.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,aAAa;IAChB,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IACtC,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C;;;OAGG;IACH,MAAM,CAAC,IAAkB,EAAE,YAA4B;QACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,YAAwB,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,IAAc,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,IAAkB;QACxB,MAAM,OAAO,GAAG,IAAc,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,KAA6B;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,OAAoB;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO;QAC9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAY,EAAE,QAAqB;QACrD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,qCAAqC,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CACvE,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -1,52 +0,0 @@
1
- import type { SchemaDefinition, PolicyRule, PolicyEffect, Condition } from "./types.js";
2
- export interface JsonPolicyRule {
3
- id: string;
4
- effect: PolicyEffect;
5
- roles: string[] | "*";
6
- actions: string[] | "*";
7
- resources: string[] | "*";
8
- conditions?: string[];
9
- priority?: number;
10
- description?: string;
11
- }
12
- export interface JsonPolicyDocument {
13
- version: 1;
14
- rules: JsonPolicyRule[];
15
- }
16
- /**
17
- * A registry that maps condition names to condition functions.
18
- * This allows JSON policies to reference conditions by name
19
- * while keeping the actual logic in code.
20
- *
21
- * ```ts
22
- * const conditions = new ConditionRegistry<MySchema>();
23
- * conditions.register("isOwner", ctx => ctx.subject.id === ctx.resourceContext.ownerId);
24
- * conditions.register("isActive", ctx => ctx.resourceContext.status === "active");
25
- * ```
26
- */
27
- export declare class ConditionRegistry<S extends SchemaDefinition> {
28
- private conditions;
29
- register(name: string, condition: Condition<S>): this;
30
- get(name: string): Condition<S> | undefined;
31
- has(name: string): boolean;
32
- names(): string[];
33
- }
34
- /**
35
- * Serialize rules to a JSON-safe document.
36
- * Conditions are stripped unless a reverse lookup map is provided.
37
- */
38
- export declare function exportRules<S extends SchemaDefinition>(rules: ReadonlyArray<PolicyRule<S>>, conditionNames?: Map<Condition<S>, string>): JsonPolicyDocument;
39
- /**
40
- * Serialize rules to a JSON string.
41
- */
42
- export declare function exportRulesToJson<S extends SchemaDefinition>(rules: ReadonlyArray<PolicyRule<S>>, conditionNames?: Map<Condition<S>, string>): string;
43
- /**
44
- * Deserialize a JSON policy document into PolicyRule objects.
45
- * Condition names are resolved via the provided registry.
46
- */
47
- export declare function importRules<S extends SchemaDefinition>(doc: JsonPolicyDocument, registry?: ConditionRegistry<S>): PolicyRule<S>[];
48
- /**
49
- * Parse a JSON string into PolicyRule objects.
50
- */
51
- export declare function importRulesFromJson<S extends SchemaDefinition>(json: string, registry?: ConditionRegistry<S>): PolicyRule<S>[];
52
- //# sourceMappingURL=serialization.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,SAAS,EACV,MAAM,YAAY,CAAC;AAMpB,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,gBAAgB;IACvD,OAAO,CAAC,UAAU,CAAmC;IAErD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAWrD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS;IAI3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,KAAK,IAAI,MAAM,EAAE;CAGlB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,gBAAgB,EACpD,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACnC,cAAc,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GACzC,kBAAkB,CAyBpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,EAC1D,KAAK,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACnC,cAAc,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GACzC,MAAM,CAER;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,gBAAgB,EACpD,GAAG,EAAE,kBAAkB,EACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC9B,UAAU,CAAC,CAAC,CAAC,EAAE,CA6DjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,gBAAgB,EAC5D,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC9B,UAAU,CAAC,CAAC,CAAC,EAAE,CAUjB"}
@@ -1,144 +0,0 @@
1
- /**
2
- * A registry that maps condition names to condition functions.
3
- * This allows JSON policies to reference conditions by name
4
- * while keeping the actual logic in code.
5
- *
6
- * ```ts
7
- * const conditions = new ConditionRegistry<MySchema>();
8
- * conditions.register("isOwner", ctx => ctx.subject.id === ctx.resourceContext.ownerId);
9
- * conditions.register("isActive", ctx => ctx.resourceContext.status === "active");
10
- * ```
11
- */
12
- export class ConditionRegistry {
13
- conditions = new Map();
14
- register(name, condition) {
15
- if (!name || typeof name !== "string") {
16
- throw new Error("Condition name must be a non-empty string");
17
- }
18
- if (typeof condition !== "function") {
19
- throw new Error(`Condition "${name}" must be a function`);
20
- }
21
- this.conditions.set(name, condition);
22
- return this;
23
- }
24
- get(name) {
25
- return this.conditions.get(name);
26
- }
27
- has(name) {
28
- return this.conditions.has(name);
29
- }
30
- names() {
31
- return [...this.conditions.keys()];
32
- }
33
- }
34
- // ---------------------------------------------------------------------------
35
- // Export: PolicyRule[] → JSON
36
- // ---------------------------------------------------------------------------
37
- /**
38
- * Serialize rules to a JSON-safe document.
39
- * Conditions are stripped unless a reverse lookup map is provided.
40
- */
41
- export function exportRules(rules, conditionNames) {
42
- const jsonRules = rules.map((rule) => {
43
- const jr = {
44
- id: rule.id,
45
- effect: rule.effect,
46
- roles: rule.roles,
47
- actions: rule.actions,
48
- resources: rule.resources,
49
- priority: rule.priority,
50
- description: rule.description,
51
- };
52
- if (rule.conditions && conditionNames) {
53
- const names = [];
54
- for (const cond of rule.conditions) {
55
- const name = conditionNames.get(cond);
56
- if (name)
57
- names.push(name);
58
- }
59
- if (names.length > 0)
60
- jr.conditions = names;
61
- }
62
- return jr;
63
- });
64
- return { version: 1, rules: jsonRules };
65
- }
66
- /**
67
- * Serialize rules to a JSON string.
68
- */
69
- export function exportRulesToJson(rules, conditionNames) {
70
- return JSON.stringify(exportRules(rules, conditionNames), null, 2);
71
- }
72
- // ---------------------------------------------------------------------------
73
- // Import: JSON → PolicyRule[]
74
- // ---------------------------------------------------------------------------
75
- /**
76
- * Deserialize a JSON policy document into PolicyRule objects.
77
- * Condition names are resolved via the provided registry.
78
- */
79
- export function importRules(doc, registry) {
80
- if (!doc || typeof doc !== "object") {
81
- throw new Error("Policy document must be a non-null object");
82
- }
83
- if (doc.version !== 1) {
84
- throw new Error(`Unsupported policy document version: ${doc.version}`);
85
- }
86
- if (!Array.isArray(doc.rules)) {
87
- throw new Error("Policy document must have a 'rules' array");
88
- }
89
- return doc.rules.map((jr, index) => {
90
- if (!jr || typeof jr !== "object") {
91
- throw new Error(`Rule at index ${index} must be a non-null object`);
92
- }
93
- if (!jr.id || typeof jr.id !== "string") {
94
- throw new Error(`Rule at index ${index} is missing a valid "id" field.`);
95
- }
96
- if (jr.effect !== "allow" && jr.effect !== "deny") {
97
- throw new Error(`Invalid effect "${jr.effect}" in rule "${jr.id}". Must be "allow" or "deny".`);
98
- }
99
- if (jr.roles !== "*" && !Array.isArray(jr.roles)) {
100
- throw new Error(`Rule "${jr.id}": roles must be "*" or an array of strings`);
101
- }
102
- if (jr.actions !== "*" && !Array.isArray(jr.actions)) {
103
- throw new Error(`Rule "${jr.id}": actions must be "*" or an array of strings`);
104
- }
105
- if (jr.resources !== "*" && !Array.isArray(jr.resources)) {
106
- throw new Error(`Rule "${jr.id}": resources must be "*" or an array of strings`);
107
- }
108
- const conditions = [];
109
- if (jr.conditions && registry) {
110
- for (const name of jr.conditions) {
111
- const cond = registry.get(name);
112
- if (!cond) {
113
- throw new Error(`Unknown condition "${name}" in rule "${jr.id}". ` +
114
- `Registered conditions: ${registry.names().join(", ") || "(none)"}`);
115
- }
116
- conditions.push(cond);
117
- }
118
- }
119
- return {
120
- id: jr.id,
121
- effect: jr.effect,
122
- roles: jr.roles,
123
- actions: jr.actions,
124
- resources: jr.resources,
125
- conditions: conditions.length > 0 ? conditions : undefined,
126
- priority: jr.priority,
127
- description: jr.description,
128
- };
129
- });
130
- }
131
- /**
132
- * Parse a JSON string into PolicyRule objects.
133
- */
134
- export function importRulesFromJson(json, registry) {
135
- let doc;
136
- try {
137
- doc = JSON.parse(json);
138
- }
139
- catch (err) {
140
- throw new Error(`Failed to parse policy JSON: ${err instanceof Error ? err.message : String(err)}`);
141
- }
142
- return importRules(doc, registry);
143
- }
144
- //# sourceMappingURL=serialization.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQ7E,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,gBAAgB;IACvD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,4DAA4D;IAC5D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAC7C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyDD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;aAyHd,OAAO,CAAC,IAAI,CAAC;YAQd,OAAO,CAAC,IAAI,CAAC;;EAQxB"}
package/dist/types.d.ts DELETED
@@ -1,137 +0,0 @@
1
- /**
2
- * Core type definitions for the authorization engine.
3
- *
4
- * The type system is designed so that defining a schema once
5
- * propagates full autocomplete through every API surface:
6
- * policies, checks, audits, and middleware.
7
- */
8
- export type ActionString = `${string}:${string}`;
9
- export interface SchemaDefinition {
10
- roles: string;
11
- resources: string;
12
- actions: ActionString;
13
- tenantId?: string;
14
- }
15
- /**
16
- * Infer concrete union types from a schema definition.
17
- * Used internally to thread type narrowing everywhere.
18
- */
19
- export type InferRole<S extends SchemaDefinition> = S["roles"];
20
- export type InferResource<S extends SchemaDefinition> = S["resources"];
21
- export type InferAction<S extends SchemaDefinition> = S["actions"];
22
- export type InferTenantId<S extends SchemaDefinition> = S["tenantId"] extends string ? S["tenantId"] : string;
23
- export interface RoleAssignment<S extends SchemaDefinition> {
24
- role: InferRole<S>;
25
- tenantId?: InferTenantId<S>;
26
- }
27
- export interface Subject<S extends SchemaDefinition> {
28
- id: string;
29
- roles: RoleAssignment<S>[];
30
- attributes?: Record<string, unknown>;
31
- }
32
- export interface ResourceContext {
33
- id?: string;
34
- tenantId?: string;
35
- [key: string]: unknown;
36
- }
37
- export interface EvaluationContext<S extends SchemaDefinition> {
38
- subject: Subject<S>;
39
- action: InferAction<S>;
40
- resource: InferResource<S>;
41
- resourceContext: ResourceContext;
42
- tenantId?: string;
43
- environment?: Record<string, unknown>;
44
- }
45
- export type Condition<S extends SchemaDefinition> = (ctx: EvaluationContext<S>) => boolean | Promise<boolean>;
46
- export type PolicyEffect = "allow" | "deny";
47
- export interface PolicyRule<S extends SchemaDefinition> {
48
- readonly id: string;
49
- readonly effect: PolicyEffect;
50
- readonly roles: InferRole<S>[] | "*";
51
- readonly actions: InferAction<S>[] | "*";
52
- readonly resources: InferResource<S>[] | "*";
53
- readonly conditions?: Condition<S>[];
54
- /**
55
- * Higher priority wins. Deny at equal priority wins over allow.
56
- * Default: 0
57
- */
58
- readonly priority?: number;
59
- readonly description?: string;
60
- }
61
- export interface Decision<S extends SchemaDefinition> {
62
- allowed: boolean;
63
- effect: PolicyEffect | "default-deny";
64
- matchedRule: PolicyRule<S> | null;
65
- subject: Subject<S>;
66
- action: InferAction<S>;
67
- resource: InferResource<S>;
68
- resourceContext: ResourceContext;
69
- tenantId?: string;
70
- timestamp: number;
71
- durationMs: number;
72
- reason: string;
73
- }
74
- export interface AuditEntry {
75
- allowed: boolean;
76
- effect: string;
77
- matchedRuleId: string | null;
78
- matchedRuleDescription: string | null;
79
- subjectId: string;
80
- action: string;
81
- resource: string;
82
- tenantId?: string;
83
- timestamp: number;
84
- durationMs: number;
85
- reason: string;
86
- }
87
- /**
88
- * Convert a Decision to a serialization-safe AuditEntry
89
- * (strips functions, large objects, and condition references).
90
- */
91
- export declare function toAuditEntry<S extends SchemaDefinition>(decision: Decision<S>): AuditEntry;
92
- export interface ConditionResult {
93
- index: number;
94
- passed: boolean;
95
- error?: string;
96
- }
97
- export interface RuleEvaluation<S extends SchemaDefinition> {
98
- rule: PolicyRule<S>;
99
- roleMatched: boolean;
100
- actionMatched: boolean;
101
- resourceMatched: boolean;
102
- conditionResults: ConditionResult[];
103
- matched: boolean;
104
- }
105
- export interface ExplainResult<S extends SchemaDefinition> {
106
- allowed: boolean;
107
- effect: PolicyEffect | "default-deny";
108
- reason: string;
109
- evaluatedRules: RuleEvaluation<S>[];
110
- durationMs: number;
111
- }
112
- export type DecisionListener<S extends SchemaDefinition> = (decision: Decision<S>) => void | Promise<void>;
113
- export interface ConditionError {
114
- ruleId: string;
115
- conditionIndex: number;
116
- error: unknown;
117
- }
118
- export type ConditionErrorHandler = (err: ConditionError) => void;
119
- export interface EngineOptions<S extends SchemaDefinition> {
120
- schema: S;
121
- defaultEffect?: PolicyEffect;
122
- onDecision?: DecisionListener<S>;
123
- onConditionError?: ConditionErrorHandler;
124
- /**
125
- * When true, async conditions are awaited.
126
- * When false (default), only synchronous conditions are supported
127
- * and evaluate is guaranteed synchronous.
128
- */
129
- asyncConditions?: boolean;
130
- /**
131
- * When true, evaluate() throws if tenantId is omitted and the subject
132
- * has any tenant-scoped role assignments. Prevents accidental
133
- * cross-tenant privilege escalation.
134
- */
135
- strictTenancy?: boolean;
136
- }
137
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * Core type definitions for the authorization engine.
3
- *
4
- * The type system is designed so that defining a schema once
5
- * propagates full autocomplete through every API surface:
6
- * policies, checks, audits, and middleware.
7
- */
8
- /**
9
- * Convert a Decision to a serialization-safe AuditEntry
10
- * (strips functions, large objects, and condition references).
11
- */
12
- export function toAuditEntry(decision) {
13
- return {
14
- allowed: decision.allowed,
15
- effect: decision.effect,
16
- matchedRuleId: decision.matchedRule?.id ?? null,
17
- matchedRuleDescription: decision.matchedRule?.description ?? null,
18
- subjectId: decision.subject.id,
19
- action: decision.action,
20
- resource: decision.resource,
21
- tenantId: decision.tenantId,
22
- timestamp: decision.timestamp,
23
- durationMs: decision.durationMs,
24
- reason: decision.reason,
25
- };
26
- }
27
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiIH;;;GAGG;AACH,MAAM,UAAU,YAAY,CAA6B,QAAqB;IAC5E,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI;QAC/C,sBAAsB,EAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,IAAI,IAAI;QACjE,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;QAC9B,MAAM,EAAE,QAAQ,CAAC,MAAgB;QACjC,QAAQ,EAAE,QAAQ,CAAC,QAAkB;QACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC"}