@authup/access 1.0.0-beta.53 → 1.0.0-beta.54
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/dist/index.d.mts +150 -24
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +309 -89
- package/dist/index.mjs.map +1 -1
- package/dist/permission/evaluator/module.d.ts +12 -1
- package/dist/permission/evaluator/module.d.ts.map +1 -1
- package/dist/permission/evaluator/types.d.ts +48 -0
- package/dist/permission/evaluator/types.d.ts.map +1 -1
- package/dist/permission/helpers/aggregate.d.ts +1 -1
- package/dist/permission/realm-scope/constants.d.ts +1 -1
- package/dist/permission/realm-scope/constants.d.ts.map +1 -1
- package/dist/permission/types.d.ts +7 -7
- package/dist/permission/types.d.ts.map +1 -1
- package/dist/policy/built-in/attribute-names/evaluator.d.ts +1 -0
- package/dist/policy/built-in/attribute-names/evaluator.d.ts.map +1 -1
- package/dist/policy/built-in/attributes/evaluator.d.ts +5 -0
- package/dist/policy/built-in/attributes/evaluator.d.ts.map +1 -1
- package/dist/policy/built-in/attributes/types.d.ts +2 -2
- package/dist/policy/built-in/attributes/types.d.ts.map +1 -1
- package/dist/policy/built-in/composite/evaluator.d.ts.map +1 -1
- package/dist/policy/built-in/composite/types.d.ts +1 -1
- package/dist/policy/built-in/composite/types.d.ts.map +1 -1
- package/dist/policy/built-in/constants.d.ts +0 -1
- package/dist/policy/built-in/constants.d.ts.map +1 -1
- package/dist/policy/built-in/identity/evaluator.d.ts +1 -0
- package/dist/policy/built-in/identity/evaluator.d.ts.map +1 -1
- package/dist/policy/built-in/identity/types.d.ts +1 -1
- package/dist/policy/built-in/permission-binding/module.d.ts +1 -0
- package/dist/policy/built-in/permission-binding/module.d.ts.map +1 -1
- package/dist/policy/built-in/realm-match/evaluator.d.ts +14 -0
- package/dist/policy/built-in/realm-match/evaluator.d.ts.map +1 -1
- package/dist/policy/built-in/realm-match/types.d.ts +6 -6
- package/dist/policy/built-in/realm-match/types.d.ts.map +1 -1
- package/dist/policy/built-in/time/types.d.ts +3 -3
- package/dist/policy/built-in/time/types.d.ts.map +1 -1
- package/dist/policy/built-in/types.d.ts +2 -0
- package/dist/policy/built-in/types.d.ts.map +1 -1
- package/dist/policy/engine/module.d.ts.map +1 -1
- package/dist/policy/evaluation/context/define.d.ts.map +1 -1
- package/dist/policy/evaluation/context/types.d.ts +7 -0
- package/dist/policy/evaluation/context/types.d.ts.map +1 -1
- package/dist/policy/evaluation/types.d.ts +42 -0
- package/dist/policy/evaluation/types.d.ts.map +1 -1
- package/package.json +6 -4
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { AuthupError, AuthupErrorOptions } from "@authup/errors";
|
|
2
2
|
import { DecisionStrategy } from "@authup/kit";
|
|
3
|
+
import { ICondition } from "@rapiq/core";
|
|
3
4
|
import { Container, Issue, IssueGroup, IssueItem } from "validup";
|
|
4
|
-
import {
|
|
5
|
+
import { MongoFiltersParser, MongoFiltersParserInput } from "@rapiq/parser-mongo";
|
|
5
6
|
//#region src/policy/data.d.ts
|
|
6
7
|
interface IPolicyData {
|
|
7
8
|
set(key: string, value: unknown): void;
|
|
@@ -30,6 +31,13 @@ type PolicyEvaluationContext = {
|
|
|
30
31
|
readonly exclude: string[];
|
|
31
32
|
readonly include: string[];
|
|
32
33
|
readonly data: PolicyData;
|
|
34
|
+
/**
|
|
35
|
+
* Attach the condition form (`PolicyEvaluationResult.condition`) to pending
|
|
36
|
+
* subtrees via `IPolicyEvaluator.toCondition`. Off by default — evaluation-only
|
|
37
|
+
* callers (evaluate / preEvaluate hot paths) must not pay the lowering cost;
|
|
38
|
+
* query-build callers opt in.
|
|
39
|
+
*/
|
|
40
|
+
readonly withConditions: boolean;
|
|
33
41
|
};
|
|
34
42
|
type PolicyEvaluationContextInput = Partial<PolicyEvaluationContext>;
|
|
35
43
|
//#endregion
|
|
@@ -40,9 +48,50 @@ declare function definePolicyEvaluationContext(input?: PolicyEvaluationContextIn
|
|
|
40
48
|
type PolicyEvaluators = Record<string, IPolicyEvaluator>;
|
|
41
49
|
type PolicyEvaluationResult = {
|
|
42
50
|
success: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* The policy could not be settled yet — a data key it requires is absent from the
|
|
53
|
+
* evaluation bag (see {@link IPolicyEvaluator.requires}). Pending always rides on
|
|
54
|
+
* `success: false` (fail-closed: a consumer that ignores the flag behaves like a
|
|
55
|
+
* deny); only pre-gate style consumers treat pending as a pass.
|
|
56
|
+
*
|
|
57
|
+
* Unknown stays unknown: `invert` is never applied to a pending result.
|
|
58
|
+
*/
|
|
59
|
+
pending?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* EXACT condition form of the pending subtree (see
|
|
62
|
+
* {@link IPolicyEvaluator.toCondition}): a row satisfies the condition iff the
|
|
63
|
+
* pending subtree settles true on that row's attributes, given the current bag.
|
|
64
|
+
* Attached only on pending results, only when the evaluation context requested it
|
|
65
|
+
* (`withConditions`), and only when the ENTIRE pending subtree is expressible —
|
|
66
|
+
* a partially expressible tree carries no condition (fail-safe: the consumer
|
|
67
|
+
* falls back to a per-row post-check).
|
|
68
|
+
*/
|
|
69
|
+
condition?: ICondition;
|
|
43
70
|
issues?: Issue[];
|
|
44
71
|
};
|
|
45
72
|
interface IPolicyEvaluator {
|
|
73
|
+
/**
|
|
74
|
+
* PolicyData keys this policy needs before it can settle (e.g. `identity`,
|
|
75
|
+
* `attributes`). When any returned key is absent from the evaluation bag, the
|
|
76
|
+
* engine returns a pending result instead of invoking {@link evaluate}.
|
|
77
|
+
*
|
|
78
|
+
* Receives the raw (unvalidated) policy configuration, since data needs may be
|
|
79
|
+
* config-dependent (e.g. realm-match scope vs. attribute mode). Omit the method
|
|
80
|
+
* (or return an empty array) for policies evaluable with ambient data only.
|
|
81
|
+
*/
|
|
82
|
+
requires?(value: Record<string, any>): string[];
|
|
83
|
+
/**
|
|
84
|
+
* Express the policy as a condition over row attributes (rapiq `ICondition`)
|
|
85
|
+
* instead of waiting for the row — the WHERE-pushdown capability. The result is
|
|
86
|
+
* a partial evaluation against the knowns in `context.data` (e.g. the actor's
|
|
87
|
+
* realm is baked into a realm-match condition), and must be EXACT: for every
|
|
88
|
+
* row, `condition(row)` === "this policy settles true with attributes = row".
|
|
89
|
+
*
|
|
90
|
+
* Return `null` when this configuration is not expressible (the policy then
|
|
91
|
+
* stays a per-row post-check — always sound). Omit the method for policies that
|
|
92
|
+
* never lower (identity, date/time, attributeNames).
|
|
93
|
+
*/
|
|
94
|
+
toCondition?(value: Record<string, any>, context: PolicyEvaluationContext): Promise<ICondition | null>;
|
|
46
95
|
/**
|
|
47
96
|
* Execute the policy with specific data and a given context.
|
|
48
97
|
*/
|
|
@@ -146,7 +195,7 @@ declare class AttributeNamesPolicyValidator extends Container<AttributeNamesPoli
|
|
|
146
195
|
}
|
|
147
196
|
//#endregion
|
|
148
197
|
//#region src/policy/built-in/attributes/types.d.ts
|
|
149
|
-
type AttributesPolicyQuery<T> =
|
|
198
|
+
type AttributesPolicyQuery<T extends Record<string, any> = Record<string, any>> = MongoFiltersParserInput<T>;
|
|
150
199
|
interface AttributesPolicy<T extends Record<string, any> = Record<string, any>> extends BasePolicy {
|
|
151
200
|
query: AttributesPolicyQuery<T>;
|
|
152
201
|
}
|
|
@@ -162,7 +211,10 @@ declare class AttributesPolicyValidator<T extends Record<string, any> = Record<s
|
|
|
162
211
|
//#region src/policy/built-in/attributes/evaluator.d.ts
|
|
163
212
|
declare class AttributesPolicyEvaluator<T extends Record<string, any> = Record<string, any>> implements IPolicyEvaluator {
|
|
164
213
|
protected validator: AttributesPolicyValidator<T>;
|
|
214
|
+
protected parser: MongoFiltersParser;
|
|
165
215
|
constructor();
|
|
216
|
+
requires(): string[];
|
|
217
|
+
toCondition(value: Record<string, any>): Promise<ICondition | null>;
|
|
166
218
|
accessData(ctx: PolicyEvaluationContext): Promise<T | null>;
|
|
167
219
|
evaluate(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<PolicyEvaluationResult>;
|
|
168
220
|
protected fixQuery(query: unknown | unknown[]): void;
|
|
@@ -173,6 +225,7 @@ declare class AttributeNamesPolicyEvaluator implements IPolicyEvaluator {
|
|
|
173
225
|
protected validator: AttributeNamesPolicyValidator;
|
|
174
226
|
protected attributesEvaluator: AttributesPolicyEvaluator;
|
|
175
227
|
constructor();
|
|
228
|
+
requires(): string[];
|
|
176
229
|
evaluate(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<PolicyEvaluationResult>;
|
|
177
230
|
}
|
|
178
231
|
//#endregion
|
|
@@ -181,7 +234,7 @@ interface CompositePolicy extends BasePolicy {
|
|
|
181
234
|
/**
|
|
182
235
|
* How to decide if a policy evaluates to true.
|
|
183
236
|
*/
|
|
184
|
-
|
|
237
|
+
decisionStrategy?: `${DecisionStrategy}`;
|
|
185
238
|
/**
|
|
186
239
|
* Child policies.
|
|
187
240
|
*/
|
|
@@ -230,7 +283,7 @@ interface IdentityPolicy extends BasePolicy {
|
|
|
230
283
|
}
|
|
231
284
|
type IdentityPolicyData = {
|
|
232
285
|
/**
|
|
233
|
-
* user, client
|
|
286
|
+
* user, client
|
|
234
287
|
*/
|
|
235
288
|
type: string;
|
|
236
289
|
/**
|
|
@@ -266,6 +319,7 @@ declare class IdentityPolicyEvaluator implements IPolicyEvaluator {
|
|
|
266
319
|
protected validator: IdentityPolicyValidator;
|
|
267
320
|
protected dataValidator: PolicyIdentityDataValidator;
|
|
268
321
|
constructor();
|
|
322
|
+
requires(): string[];
|
|
269
323
|
accessData(ctx: PolicyEvaluationContext): Promise<IdentityPolicyData | null>;
|
|
270
324
|
evaluate(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<PolicyEvaluationResult>;
|
|
271
325
|
}
|
|
@@ -282,6 +336,7 @@ declare class PermissionBindingPolicyValidator extends Container<PermissionBindi
|
|
|
282
336
|
declare class PermissionBindingPolicyEvaluator implements IPolicyEvaluator {
|
|
283
337
|
protected validator: PermissionBindingPolicyValidator;
|
|
284
338
|
constructor();
|
|
339
|
+
requires(): string[];
|
|
285
340
|
evaluate(value: Record<string, any>): Promise<PolicyEvaluationResult>;
|
|
286
341
|
}
|
|
287
342
|
//#endregion
|
|
@@ -298,7 +353,7 @@ declare enum RealmScope {
|
|
|
298
353
|
NONE = "none",
|
|
299
354
|
/** Own realm only — resource realm must equal the actor's realm. */
|
|
300
355
|
OWN = "own",
|
|
301
|
-
/** Own realm or null/global resources (
|
|
356
|
+
/** Own realm or null/global resources (realmId === null). */
|
|
302
357
|
OWN_OR_NULL = "ownOrNull",
|
|
303
358
|
/** Any realm, including null/global. */
|
|
304
359
|
ANY = "any"
|
|
@@ -334,26 +389,26 @@ interface RealmMatchPolicy extends BasePolicy {
|
|
|
334
389
|
/**
|
|
335
390
|
* Determines how realm-id/name matches are handled.
|
|
336
391
|
*/
|
|
337
|
-
|
|
392
|
+
decisionStrategy?: `${DecisionStrategy}`;
|
|
338
393
|
/**
|
|
339
394
|
* Specifies the name(s) of the realm-id/name attribute(s) used for matching.
|
|
340
395
|
* Can be a single attribute name or an array of attribute names.
|
|
341
396
|
*/
|
|
342
|
-
|
|
397
|
+
attributeName?: string | string[];
|
|
343
398
|
/**
|
|
344
399
|
* Only match if the attribute is strict equal to the name.
|
|
345
400
|
*/
|
|
346
|
-
|
|
401
|
+
attributeNameStrict?: boolean;
|
|
347
402
|
/**
|
|
348
403
|
* Determines if resources with null realm-id/name value should match all identity realms.
|
|
349
404
|
* If true, any identity realm can access resources with null realm-id/name values.
|
|
350
405
|
*/
|
|
351
|
-
|
|
406
|
+
attributeNullMatchAll?: boolean;
|
|
352
407
|
/**
|
|
353
408
|
* Coarse, actor-relative realm reach (none/own/ownOrNull/any). When set, the evaluator
|
|
354
409
|
* runs in SCOPE MODE: it matches the resource realm read from the REALM_MATCH data key
|
|
355
|
-
* against the identity realm via `realmScopeMatches`, and ignores `
|
|
356
|
-
* `
|
|
410
|
+
* against the identity realm via `realmScopeMatches`, and ignores `attributeName` /
|
|
411
|
+
* `attributeNullMatchAll`. With no REALM_MATCH key present it neutral-passes.
|
|
357
412
|
*/
|
|
358
413
|
scope?: `${RealmScope}`;
|
|
359
414
|
}
|
|
@@ -369,6 +424,19 @@ declare class RealmMatchPolicyEvaluator implements IPolicyEvaluator {
|
|
|
369
424
|
protected identityEvaluator: IdentityPolicyEvaluator;
|
|
370
425
|
protected attributesEvaluator: AttributesPolicyEvaluator;
|
|
371
426
|
constructor();
|
|
427
|
+
requires(value: Record<string, any>): string[];
|
|
428
|
+
/**
|
|
429
|
+
* Condition form over the row's realm column, with the actor realm baked in
|
|
430
|
+
* (mirrors `realmScopeMatches` / the attribute-mode match). Exactness holds for
|
|
431
|
+
* row-shaped data where the referenced field exists (DB rows) — the object-bag
|
|
432
|
+
* "key absent → neutral-pass" case has no SQL counterpart. Lowerable configs:
|
|
433
|
+
* scope mode (field = single-string `attributeName`, default `realmId` — scope-mode
|
|
434
|
+
* EVALUATION ignores `attributeName`, lowering reuses it as the column override),
|
|
435
|
+
* and strict attribute mode with a single explicit `attributeName`. Everything
|
|
436
|
+
* else (multi-key / default-key CONSENSUS, non-strict key expansion) is
|
|
437
|
+
* row-shape-dependent and stays a post-check.
|
|
438
|
+
*/
|
|
439
|
+
toCondition(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<ICondition | null>;
|
|
372
440
|
evaluate(value: Record<string, any>, ctx: PolicyEvaluationContext): Promise<PolicyEvaluationResult>;
|
|
373
441
|
}
|
|
374
442
|
//#endregion
|
|
@@ -397,15 +465,15 @@ interface TimePolicy extends BasePolicy {
|
|
|
397
465
|
/**
|
|
398
466
|
* 0 (Sunday) - 6 (Saturday)
|
|
399
467
|
*/
|
|
400
|
-
|
|
468
|
+
dayOfWeek?: number;
|
|
401
469
|
/**
|
|
402
470
|
* 1 - 31
|
|
403
471
|
*/
|
|
404
|
-
|
|
472
|
+
dayOfMonth?: number;
|
|
405
473
|
/**
|
|
406
474
|
* 1 - 365
|
|
407
475
|
*/
|
|
408
|
-
|
|
476
|
+
dayOfYear?: number;
|
|
409
477
|
}
|
|
410
478
|
//#endregion
|
|
411
479
|
//#region src/policy/built-in/time/validator.d.ts
|
|
@@ -466,7 +534,6 @@ declare const SystemPolicyName: {
|
|
|
466
534
|
readonly PERMISSION_BINDING: "system.permission-binding";
|
|
467
535
|
readonly REALM_MATCH: "system.realm-match";
|
|
468
536
|
readonly CLIENT_NAMES_SELF_MANAGE: "system.client-names-self-manage";
|
|
469
|
-
readonly ROBOT_NAMES_SELF_MANAGE: "system.robot-names-self-manage";
|
|
470
537
|
readonly USER_NAMES_SELF_MANAGE: "system.user-names-self-manage";
|
|
471
538
|
};
|
|
472
539
|
//#endregion
|
|
@@ -479,6 +546,7 @@ type BuiltInPolicyTypeMapRaw<T extends Record<string, any> = Record<string, any>
|
|
|
479
546
|
[BuiltInPolicyType.TIME]: TimePolicy;
|
|
480
547
|
[BuiltInPolicyType.IDENTITY]: IdentityPolicy;
|
|
481
548
|
[BuiltInPolicyType.PERMISSION_BINDING]: PermissionBindingPolicy;
|
|
549
|
+
[BuiltInPolicyType.REALM_MATCH]: RealmMatchPolicy;
|
|
482
550
|
};
|
|
483
551
|
type BuiltInPolicyTypeMap<T extends Record<string, any> = Record<string, any>> = { [K in keyof BuiltInPolicyTypeMapRaw<T> as `${K}`]: BuiltInPolicyTypeMapRaw<T>[K]; };
|
|
484
552
|
type BuiltInPolicies<T extends Record<string, any> = Record<string, any>> = { [K in keyof BuiltInPolicyTypeMap<T>]: BuiltInPolicyTypeMap<T>[K] & {
|
|
@@ -542,9 +610,9 @@ declare function isPermissionError(input: unknown): input is PermissionError;
|
|
|
542
610
|
//#region src/permission/types.d.ts
|
|
543
611
|
type BasePermission = {
|
|
544
612
|
name: string;
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
613
|
+
clientId?: string | null;
|
|
614
|
+
realmId?: string | null;
|
|
615
|
+
decisionStrategy?: `${DecisionStrategy}` | null;
|
|
548
616
|
};
|
|
549
617
|
/**
|
|
550
618
|
* A raw permission grant: one permission with its policies and realm reach, as loaded from a
|
|
@@ -559,16 +627,16 @@ type PermissionPolicyBinding = {
|
|
|
559
627
|
* most restrictive `own` (fail-closed). NOT part of the binding identity key
|
|
560
628
|
* (see isPermissionPolicyBindingEqual).
|
|
561
629
|
*/
|
|
562
|
-
|
|
630
|
+
realmScope?: `${RealmScope}`;
|
|
563
631
|
};
|
|
564
632
|
/**
|
|
565
633
|
* One disjunction term of an aggregated binding: a single grant's realm reach paired with its
|
|
566
|
-
* own (single) policy. A disjunction-aware consumer ORs `realmScopeMatches(
|
|
634
|
+
* own (single) policy. A disjunction-aware consumer ORs `realmScopeMatches(realmScope) ∧ policy`
|
|
567
635
|
* across the grants of a permission.
|
|
568
636
|
*/
|
|
569
637
|
type PermissionGrant = {
|
|
570
638
|
/** Relative realm reach (none/own/ownOrNull/any), normalized — fail-closed default `own`. */
|
|
571
|
-
|
|
639
|
+
realmScope: `${RealmScope}`;
|
|
572
640
|
/**
|
|
573
641
|
* The grant's policy: the raw junction policy (its `id` preserved, for propagation) for a
|
|
574
642
|
* single-policy grant, a composite for a multi-policy (Layer-1) binding, or `undefined`
|
|
@@ -579,7 +647,7 @@ type PermissionGrant = {
|
|
|
579
647
|
/**
|
|
580
648
|
* A permission together with the actor's disjunction of grants for it. Output of
|
|
581
649
|
* `aggregatePermissionPolicyBindings` — the honest, lossless replacement for the collapsed
|
|
582
|
-
* `PermissionPolicyBinding` (no top-level
|
|
650
|
+
* `PermissionPolicyBinding` (no top-level realmScope/policies; the access decision is the
|
|
583
651
|
* OR over `grants`).
|
|
584
652
|
*/
|
|
585
653
|
type PermissionPolicyBindingAggregated = {
|
|
@@ -590,7 +658,7 @@ type PermissionPolicyBindingAggregated = {
|
|
|
590
658
|
//#region src/permission/helpers/aggregate.d.ts
|
|
591
659
|
/**
|
|
592
660
|
* Group raw permission-policy bindings by permission key into the actor's disjunction of
|
|
593
|
-
* `(
|
|
661
|
+
* `(realmScope, policy)` grants per permission — with NO lossy collapse. Every consumer
|
|
594
662
|
* (the binding evaluator, isSuperset, junction propagation, the memory provider) evaluates the
|
|
595
663
|
* grant disjunction directly, so each grant's realm reach stays paired with the policy that
|
|
596
664
|
* gates it.
|
|
@@ -640,6 +708,7 @@ interface IPermissionEvaluator {
|
|
|
640
708
|
evaluateOneOf(ctx: PermissionEvaluationContext): Promise<void>;
|
|
641
709
|
preEvaluate(ctx: PermissionEvaluationContext): Promise<void>;
|
|
642
710
|
preEvaluateOneOf(ctx: PermissionEvaluationContext): Promise<void>;
|
|
711
|
+
compile(ctx: PermissionCompileContext): Promise<PermissionCompileResult>;
|
|
643
712
|
}
|
|
644
713
|
type PermissionEvaluatorOptions = {
|
|
645
714
|
provider: IPermissionProvider;
|
|
@@ -651,6 +720,16 @@ type PermissionEvaluationOptions = {
|
|
|
651
720
|
decisionStrategy?: `${DecisionStrategy}`;
|
|
652
721
|
policiesIncluded?: string[];
|
|
653
722
|
policiesExcluded?: string[];
|
|
723
|
+
/**
|
|
724
|
+
* How a grant whose policy evaluation is PENDING (a required data key is absent —
|
|
725
|
+
* see `PolicyEvaluationResult.pending`) is treated:
|
|
726
|
+
*
|
|
727
|
+
* - `deny` (default): pending counts as failure — full `evaluate()` semantics,
|
|
728
|
+
* matching the historical missing-data deny.
|
|
729
|
+
* - `permit`: pending counts as pass — the data-availability-derived pre-gate
|
|
730
|
+
* (`preEvaluate()`): only a tree that settles false with the current bag denies.
|
|
731
|
+
*/
|
|
732
|
+
pendingPolicies?: 'deny' | 'permit';
|
|
654
733
|
};
|
|
655
734
|
type PermissionEvaluationContext = {
|
|
656
735
|
name: string | string[];
|
|
@@ -659,6 +738,42 @@ type PermissionEvaluationContext = {
|
|
|
659
738
|
data?: PolicyData;
|
|
660
739
|
options?: PermissionEvaluationOptions;
|
|
661
740
|
};
|
|
741
|
+
type PermissionCompileContext = {
|
|
742
|
+
/**
|
|
743
|
+
* Permission name(s). Several names compile as a disjunction — the row is
|
|
744
|
+
* readable when ANY of them passes (`evaluateOneOf` semantics).
|
|
745
|
+
*/
|
|
746
|
+
name: string | string[];
|
|
747
|
+
realmId?: string | null;
|
|
748
|
+
clientId?: string | null;
|
|
749
|
+
/**
|
|
750
|
+
* The knowns bag (typically the actor identity). Row-dependent keys
|
|
751
|
+
* (`attributes`, `realmMatch`) are deliberately absent — they are what the
|
|
752
|
+
* compiled condition ranges over.
|
|
753
|
+
*/
|
|
754
|
+
data?: PolicyData;
|
|
755
|
+
};
|
|
756
|
+
/**
|
|
757
|
+
* Outcome of compiling a permission's policy trees against the knowns bag
|
|
758
|
+
* (issue #3286 phase 3) — the query-build counterpart of `evaluate()`:
|
|
759
|
+
*
|
|
760
|
+
* - `allow` — settled true for every row; no restriction needed.
|
|
761
|
+
* - `deny` — settled false for every row; no row can pass.
|
|
762
|
+
* - `conditional` — the EXACT residual as a rapiq condition over row attributes:
|
|
763
|
+
* push it into the row query (WHERE) and skip per-row post-evaluation.
|
|
764
|
+
* - `post` — some pending policy is not expressible as a condition; fall back to
|
|
765
|
+
* loading rows and evaluating per row (always sound).
|
|
766
|
+
*/
|
|
767
|
+
type PermissionCompileResult = {
|
|
768
|
+
verdict: 'allow';
|
|
769
|
+
} | {
|
|
770
|
+
verdict: 'deny';
|
|
771
|
+
} | {
|
|
772
|
+
verdict: 'conditional';
|
|
773
|
+
condition: ICondition;
|
|
774
|
+
} | {
|
|
775
|
+
verdict: 'post';
|
|
776
|
+
};
|
|
662
777
|
//#endregion
|
|
663
778
|
//#region src/permission/evaluator/module.d.ts
|
|
664
779
|
declare class PermissionEvaluator implements IPermissionEvaluator {
|
|
@@ -675,7 +790,18 @@ declare class PermissionEvaluator implements IPermissionEvaluator {
|
|
|
675
790
|
evaluateOneOf(ctx: PermissionEvaluationContext): Promise<void>;
|
|
676
791
|
preEvaluate(ctx: PermissionEvaluationContext): Promise<void>;
|
|
677
792
|
preEvaluateOneOf(ctx: PermissionEvaluationContext): Promise<void>;
|
|
793
|
+
/**
|
|
794
|
+
* Compile the permission's policy trees against the knowns bag into a
|
|
795
|
+
* {@link PermissionCompileResult} — the query-build counterpart of
|
|
796
|
+
* {@link evaluate} (issue #3286 phase 3). Runs the SAME evaluation walk with
|
|
797
|
+
* `withConditions` enabled: policies that settle with the knowns settle here,
|
|
798
|
+
* pending subtrees contribute their exact condition form. Multiple names are
|
|
799
|
+
* a disjunction (any-of), so a single non-expressible name degrades the whole
|
|
800
|
+
* compilation to `post` — pushing only some disjuncts would wrongly exclude
|
|
801
|
+
* rows another name would admit.
|
|
802
|
+
*/
|
|
803
|
+
compile(ctx: PermissionCompileContext): Promise<PermissionCompileResult>;
|
|
678
804
|
}
|
|
679
805
|
//#endregion
|
|
680
|
-
export { AttributeNamesPolicy, AttributeNamesPolicyEvaluator, AttributeNamesPolicyValidator, AttributesPolicy, AttributesPolicyEvaluator, AttributesPolicyQuery, AttributesPolicyValidator, BasePermission, BasePolicy, BuiltInPolicies, BuiltInPolicyType, BuiltInPolicyTypeMap, CompositePolicy, CompositePolicyEvaluator, CompositePolicyValidator, DatePolicy, DatePolicyEvaluator, DatePolicyValidator, IPermissionEvaluator, IPermissionProvider, IPolicyData, IPolicyEngine, IPolicyEvaluator, IdentityPolicy, IdentityPolicyData, IdentityPolicyEvaluator, IdentityPolicyValidator, PERMISSION_ERROR_INSTANCE, POLICY_ERROR_INSTANCE, PermissionBindingPolicy, PermissionBindingPolicyEvaluator, PermissionBindingPolicyValidator, PermissionError, PermissionEvaluationContext, PermissionEvaluationOptions, PermissionEvaluator, PermissionEvaluatorOptions, PermissionGetOptions, PermissionGrant, PermissionMemoryProvider, PermissionPolicyBinding, PermissionPolicyBindingAggregated, PolicyData, PolicyDefaultEvaluators, PolicyEngine, PolicyError, PolicyEvaluationContext, PolicyEvaluationContextInput, PolicyEvaluationResult, PolicyEvaluators, PolicyInput, PolicyIssue, PolicyIssueCode, PolicyIssueGroup, PolicyIssueItem, PolicyIssueSeverity, PolicyWithType, REALM_SCOPE_ORDER, RealmMatchPolicy, RealmMatchPolicyEvaluator, RealmMatchPolicyValidator, RealmScope, SystemPolicyName, TimePolicy, TimePolicyEvaluator, TimePolicyInterval, TimePolicyValidator, aggregatePermissionPolicyBindings, buildPermissionKey, compareRealmScope, defineAttributesPolicy, definePolicyData, definePolicyEvaluationContext, definePolicyIssueGroup, definePolicyIssueItem, definePolicyWithType, grantDominates, isCompositePolicy, isIntervalForDayOfMonth, isIntervalForDayOfWeek, isIntervalForDayOfYear, isPermissionError, isPermissionPolicyBindingEqual, isPolicyError, maxRealmScope, maybeInvertPolicyOutcome, minRealmScope, normalizeRealmScope, realmScopeMatches };
|
|
806
|
+
export { AttributeNamesPolicy, AttributeNamesPolicyEvaluator, AttributeNamesPolicyValidator, AttributesPolicy, AttributesPolicyEvaluator, AttributesPolicyQuery, AttributesPolicyValidator, BasePermission, BasePolicy, BuiltInPolicies, BuiltInPolicyType, BuiltInPolicyTypeMap, CompositePolicy, CompositePolicyEvaluator, CompositePolicyValidator, DatePolicy, DatePolicyEvaluator, DatePolicyValidator, IPermissionEvaluator, IPermissionProvider, IPolicyData, IPolicyEngine, IPolicyEvaluator, IdentityPolicy, IdentityPolicyData, IdentityPolicyEvaluator, IdentityPolicyValidator, PERMISSION_ERROR_INSTANCE, POLICY_ERROR_INSTANCE, PermissionBindingPolicy, PermissionBindingPolicyEvaluator, PermissionBindingPolicyValidator, PermissionCompileContext, PermissionCompileResult, PermissionError, PermissionEvaluationContext, PermissionEvaluationOptions, PermissionEvaluator, PermissionEvaluatorOptions, PermissionGetOptions, PermissionGrant, PermissionMemoryProvider, PermissionPolicyBinding, PermissionPolicyBindingAggregated, PolicyData, PolicyDefaultEvaluators, PolicyEngine, PolicyError, PolicyEvaluationContext, PolicyEvaluationContextInput, PolicyEvaluationResult, PolicyEvaluators, PolicyInput, PolicyIssue, PolicyIssueCode, PolicyIssueGroup, PolicyIssueItem, PolicyIssueSeverity, PolicyWithType, REALM_SCOPE_ORDER, RealmMatchPolicy, RealmMatchPolicyEvaluator, RealmMatchPolicyValidator, RealmScope, SystemPolicyName, TimePolicy, TimePolicyEvaluator, TimePolicyInterval, TimePolicyValidator, aggregatePermissionPolicyBindings, buildPermissionKey, compareRealmScope, defineAttributesPolicy, definePolicyData, definePolicyEvaluationContext, definePolicyIssueGroup, definePolicyIssueItem, definePolicyWithType, grantDominates, isCompositePolicy, isIntervalForDayOfMonth, isIntervalForDayOfWeek, isIntervalForDayOfYear, isPermissionError, isPermissionPolicyBindingEqual, isPolicyError, maxRealmScope, maybeInvertPolicyOutcome, minRealmScope, normalizeRealmScope, realmScopeMatches };
|
|
681
807
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/policy/data.ts","../src/policy/evaluation/context/types.ts","../src/policy/evaluation/context/define.ts","../src/policy/evaluation/types.ts","../src/policy/types.ts","../src/policy/engine/types.ts","../src/policy/engine/module.ts","../src/policy/issue/constants.ts","../src/policy/issue/types.ts","../src/policy/issue/define.ts","../src/policy/error/module.ts","../src/policy/error/check.ts","../src/policy/helpers/invert.ts","../src/policy/built-in/attribute-names/types.ts","../src/policy/built-in/attribute-names/validator.ts","../src/policy/built-in/attributes/types.ts","../src/policy/built-in/attributes/define.ts","../src/policy/built-in/attributes/validator.ts","../src/policy/built-in/attributes/evaluator.ts","../src/policy/built-in/attribute-names/evaluator.ts","../src/policy/built-in/composite/types.ts","../src/policy/built-in/composite/validator.ts","../src/policy/built-in/composite/evaluator.ts","../src/policy/built-in/composite/helper.ts","../src/policy/built-in/date/types.ts","../src/policy/built-in/date/validator.ts","../src/policy/built-in/date/evaluator.ts","../src/policy/built-in/identity/types.ts","../src/policy/built-in/identity/data/validator.ts","../src/policy/built-in/identity/validator.ts","../src/policy/built-in/identity/evaluator.ts","../src/policy/built-in/permission-binding/types.ts","../src/policy/built-in/permission-binding/validator.ts","../src/policy/built-in/permission-binding/module.ts","../src/permission/realm-scope/constants.ts","../src/permission/realm-scope/helpers.ts","../src/policy/built-in/realm-match/types.ts","../src/policy/built-in/realm-match/validator.ts","../src/policy/built-in/realm-match/evaluator.ts","../src/policy/built-in/time/constants.ts","../src/policy/built-in/time/types.ts","../src/policy/built-in/time/validator.ts","../src/policy/built-in/time/evaluator.ts","../src/policy/built-in/time/helpers.ts","../src/policy/built-in/constants.ts","../src/policy/built-in/types.ts","../src/policy/built-in/define.ts","../src/policy/constants.ts","../src/policy/input.ts","../src/permission/error/module.ts","../src/permission/error/check.ts","../src/permission/types.ts","../src/permission/helpers/aggregate.ts","../src/permission/helpers/equal.ts","../src/permission/helpers/grant.ts","../src/permission/helpers/key.ts","../src/permission/provider/types.ts","../src/permission/provider/memory.ts","../src/permission/evaluator/types.ts","../src/permission/evaluator/module.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/policy/data.ts","../src/policy/evaluation/context/types.ts","../src/policy/evaluation/context/define.ts","../src/policy/evaluation/types.ts","../src/policy/types.ts","../src/policy/engine/types.ts","../src/policy/engine/module.ts","../src/policy/issue/constants.ts","../src/policy/issue/types.ts","../src/policy/issue/define.ts","../src/policy/error/module.ts","../src/policy/error/check.ts","../src/policy/helpers/invert.ts","../src/policy/built-in/attribute-names/types.ts","../src/policy/built-in/attribute-names/validator.ts","../src/policy/built-in/attributes/types.ts","../src/policy/built-in/attributes/define.ts","../src/policy/built-in/attributes/validator.ts","../src/policy/built-in/attributes/evaluator.ts","../src/policy/built-in/attribute-names/evaluator.ts","../src/policy/built-in/composite/types.ts","../src/policy/built-in/composite/validator.ts","../src/policy/built-in/composite/evaluator.ts","../src/policy/built-in/composite/helper.ts","../src/policy/built-in/date/types.ts","../src/policy/built-in/date/validator.ts","../src/policy/built-in/date/evaluator.ts","../src/policy/built-in/identity/types.ts","../src/policy/built-in/identity/data/validator.ts","../src/policy/built-in/identity/validator.ts","../src/policy/built-in/identity/evaluator.ts","../src/policy/built-in/permission-binding/types.ts","../src/policy/built-in/permission-binding/validator.ts","../src/policy/built-in/permission-binding/module.ts","../src/permission/realm-scope/constants.ts","../src/permission/realm-scope/helpers.ts","../src/policy/built-in/realm-match/types.ts","../src/policy/built-in/realm-match/validator.ts","../src/policy/built-in/realm-match/evaluator.ts","../src/policy/built-in/time/constants.ts","../src/policy/built-in/time/types.ts","../src/policy/built-in/time/validator.ts","../src/policy/built-in/time/evaluator.ts","../src/policy/built-in/time/helpers.ts","../src/policy/built-in/constants.ts","../src/policy/built-in/types.ts","../src/policy/built-in/define.ts","../src/policy/constants.ts","../src/policy/input.ts","../src/permission/error/module.ts","../src/permission/error/check.ts","../src/permission/types.ts","../src/permission/helpers/aggregate.ts","../src/permission/helpers/equal.ts","../src/permission/helpers/grant.ts","../src/permission/helpers/key.ts","../src/permission/provider/types.ts","../src/permission/provider/memory.ts","../src/permission/evaluator/types.ts","../src/permission/evaluator/module.ts"],"mappings":"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"}
|