@nmnmcc/ability 1.0.1 → 2.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 +112 -69
- package/dist/Authorizer.d.ts +43 -47
- package/dist/Authorizer.d.ts.map +1 -1
- package/dist/Authorizer.js +5 -290
- package/dist/Authorizer.js.map +1 -1
- package/dist/Condition.d.ts +164 -332
- package/dist/Condition.d.ts.map +1 -1
- package/dist/Condition.js +75 -890
- package/dist/Condition.js.map +1 -1
- package/dist/Decision.d.ts +13 -13
- package/dist/Decision.d.ts.map +1 -1
- package/dist/Decision.js.map +1 -1
- package/dist/Domain.d.ts +10 -21
- package/dist/Domain.d.ts.map +1 -1
- package/dist/Domain.js +4 -62
- package/dist/Domain.js.map +1 -1
- package/dist/HttpApi.d.ts +31 -7
- package/dist/HttpApi.d.ts.map +1 -1
- package/dist/HttpApi.js +25 -8
- package/dist/HttpApi.js.map +1 -1
- package/dist/Limits.d.ts +114 -0
- package/dist/Limits.d.ts.map +1 -0
- package/dist/Limits.js +132 -0
- package/dist/Limits.js.map +1 -0
- package/dist/Policy.d.ts +276 -269
- package/dist/Policy.d.ts.map +1 -1
- package/dist/Policy.js +73 -1177
- package/dist/Policy.js.map +1 -1
- package/dist/Resource.d.ts +4 -177
- package/dist/Resource.d.ts.map +1 -1
- package/dist/Resource.js +4 -803
- package/dist/Resource.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.js +4 -5
- package/dist/internal/algebra.js +267 -0
- package/dist/internal/algebra.js.map +1 -0
- package/dist/internal/analysis.js +245 -0
- package/dist/internal/analysis.js.map +1 -0
- package/dist/internal/authorizer.d.ts +30 -0
- package/dist/internal/authorizer.d.ts.map +1 -0
- package/dist/internal/authorizer.js +221 -0
- package/dist/internal/authorizer.js.map +1 -0
- package/dist/internal/bind.js +311 -0
- package/dist/internal/bind.js.map +1 -0
- package/dist/internal/catalog.d.ts +56 -0
- package/dist/internal/catalog.d.ts.map +1 -0
- package/dist/internal/catalog.js +292 -0
- package/dist/internal/catalog.js.map +1 -0
- package/dist/internal/decide.js +166 -0
- package/dist/internal/decide.js.map +1 -0
- package/dist/internal/domain.js +32 -0
- package/dist/internal/domain.js.map +1 -0
- package/dist/internal/json.js +134 -0
- package/dist/internal/json.js.map +1 -0
- package/dist/internal/limits.d.ts +14 -0
- package/dist/internal/limits.d.ts.map +1 -0
- package/dist/internal/limits.js +43 -0
- package/dist/internal/limits.js.map +1 -0
- package/dist/internal/nodes.d.ts +121 -0
- package/dist/internal/nodes.d.ts.map +1 -0
- package/dist/internal/nodes.js +277 -0
- package/dist/internal/nodes.js.map +1 -0
- package/dist/internal/patterns.js +110 -0
- package/dist/internal/patterns.js.map +1 -0
- package/dist/internal/policy-json.js +265 -0
- package/dist/internal/policy-json.js.map +1 -0
- package/dist/internal/policy-nodes.d.ts +61 -0
- package/dist/internal/policy-nodes.d.ts.map +1 -0
- package/dist/internal/policy-nodes.js +146 -0
- package/dist/internal/policy-nodes.js.map +1 -0
- package/dist/internal/policy.d.ts +42 -0
- package/dist/internal/policy.d.ts.map +1 -0
- package/dist/internal/policy.js +124 -0
- package/dist/internal/policy.js.map +1 -0
- package/dist/internal/read.js +39 -0
- package/dist/internal/read.js.map +1 -0
- package/dist/internal/resource.js +115 -0
- package/dist/internal/resource.js.map +1 -0
- package/dist/internal/rule.d.ts +26 -0
- package/dist/internal/rule.d.ts.map +1 -0
- package/dist/internal/rule.js +103 -0
- package/dist/internal/rule.js.map +1 -0
- package/dist/internal/search.d.ts +22 -0
- package/dist/internal/search.d.ts.map +1 -0
- package/dist/internal/search.js +274 -0
- package/dist/internal/search.js.map +1 -0
- package/dist/internal/suggest.js +46 -0
- package/dist/internal/suggest.js.map +1 -0
- package/package.json +3 -4
- package/src/Authorizer.ts +67 -583
- package/src/Condition.ts +339 -2095
- package/src/Decision.ts +6 -5
- package/src/Domain.ts +12 -69
- package/src/HttpApi.ts +72 -10
- package/src/Limits.ts +132 -0
- package/src/Policy.ts +391 -2772
- package/src/Resource.ts +7 -1548
- package/src/index.ts +3 -9
- package/src/internal/algebra.ts +482 -0
- package/src/internal/analysis.ts +478 -0
- package/src/internal/authorizer.ts +418 -0
- package/src/internal/bind.ts +648 -0
- package/src/internal/catalog.ts +534 -0
- package/src/internal/decide.ts +402 -0
- package/src/internal/domain.ts +66 -0
- package/src/internal/json.ts +260 -0
- package/src/internal/limits.ts +78 -0
- package/src/internal/nodes.ts +404 -0
- package/src/internal/patterns.ts +211 -0
- package/src/internal/policy-json.ts +487 -0
- package/src/internal/policy-nodes.ts +207 -0
- package/src/internal/policy.ts +264 -0
- package/src/internal/read.ts +55 -0
- package/src/internal/resource.ts +180 -0
- package/src/internal/rule.ts +196 -0
- package/src/internal/search.ts +541 -0
- package/src/internal/suggest.ts +104 -0
- package/dist/Principal.d.ts +0 -35
- package/dist/Principal.d.ts.map +0 -1
- package/dist/Principal.js +0 -37
- package/dist/Principal.js.map +0 -1
- package/dist/Rule.d.ts +0 -275
- package/dist/Rule.d.ts.map +0 -1
- package/dist/Rule.js +0 -257
- package/dist/Rule.js.map +0 -1
- package/src/Principal.ts +0 -41
- package/src/Rule.ts +0 -683
package/dist/Policy.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Builder, Condition, Encoded, Example, FieldSelector, Reads,
|
|
3
|
-
import { ActionOf, Any as Any$
|
|
4
|
-
import { Any as Any$
|
|
1
|
+
import { Kind } from "./Resource.js";
|
|
2
|
+
import { Any as Any$1, Builder as Builder$1, Condition, Encoded, ErrorOf, Example, FieldName, FieldSelector, OpaqueOf as OpaqueOf$1, Provided, Reads, ReadsOf, ServicesOf } from "./Condition.js";
|
|
3
|
+
import { ActionOf, Any as Any$2, AnyAction, AnyValue, CommonAction, DataOf, Kind as Kind$1, Meta, Principal, Resources, ValueOf } from "./Domain.js";
|
|
4
|
+
import { All, Any as Any$3, Ceiling, FirstOf, Node as Node$1, Rules } from "./internal/policy-nodes.js";
|
|
5
|
+
import { PolicyData, PolicyError as PolicyError$1 } from "./internal/policy.js";
|
|
5
6
|
import { Decision } from "./Decision.js";
|
|
6
7
|
import * as Context from "effect/Context";
|
|
7
8
|
import * as Effect from "effect/Effect";
|
|
@@ -9,7 +10,7 @@ import * as Schema from "effect/Schema";
|
|
|
9
10
|
import * as Data from "effect/Data";
|
|
10
11
|
import * as Pipeable from "effect/Pipeable";
|
|
11
12
|
declare namespace Policy_d_exports {
|
|
12
|
-
export { Algorithm, AllNode, Any,
|
|
13
|
+
export { ActionFor, ActionForTargets, Algorithm, AllNode, Any, AnyNode, AnyRequest, AnyRule, Builder, CeilingNode, ConditionFor, Coverage, DataFor, DomainOf, EncodedNode, EncodedRule, Explanation, FieldFor, FieldlessRequest, FieldlessTarget, FirstOfNode, KindOf, KindRequest, KindTarget, Node, OpaqueOf, Options, Policy, PolicyError, Request, ResidualReads, Rule, RuleOptions, RuleShape, RuleTarget, RulesNode, Scope, Step, Target, TargetOf, ValueFor, all, any, builder, ceiling, coverage, decide, decideSync, define, explain, firstOf, permittedFields, provideContext, residual, rule, schema };
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
16
|
* @stability stable
|
|
@@ -18,102 +19,56 @@ declare namespace Policy_d_exports {
|
|
|
18
19
|
*/
|
|
19
20
|
export type Algorithm = "denyOverrides" | "permitOverrides" | "firstApplicable" | "lastApplicable";
|
|
20
21
|
/**
|
|
22
|
+
* A list of rules with a combining algorithm.
|
|
23
|
+
*
|
|
21
24
|
* @stability stable
|
|
22
25
|
* @category models
|
|
23
26
|
* @since 0.3.0
|
|
24
27
|
*/
|
|
25
|
-
export
|
|
26
|
-
readonly _tag: "Rules";
|
|
27
|
-
readonly algorithm: Algorithm;
|
|
28
|
-
readonly rules: ReadonlyArray<Any$2>;
|
|
29
|
-
}
|
|
28
|
+
export type RulesNode = Rules;
|
|
30
29
|
/**
|
|
31
30
|
* @stability stable
|
|
32
31
|
* @category models
|
|
33
32
|
* @since 0.3.0
|
|
34
33
|
*/
|
|
35
|
-
export
|
|
36
|
-
readonly _tag: "All";
|
|
37
|
-
readonly policies: ReadonlyArray<Node>;
|
|
38
|
-
}
|
|
34
|
+
export type AllNode = All;
|
|
39
35
|
/**
|
|
40
36
|
* @stability stable
|
|
41
37
|
* @category models
|
|
42
38
|
* @since 0.3.0
|
|
43
39
|
*/
|
|
44
|
-
export
|
|
45
|
-
readonly _tag: "Any";
|
|
46
|
-
readonly policies: ReadonlyArray<Node>;
|
|
47
|
-
}
|
|
40
|
+
export type AnyNode = Any$3;
|
|
48
41
|
/**
|
|
49
42
|
* @stability stable
|
|
50
43
|
* @category models
|
|
51
44
|
* @since 0.3.0
|
|
52
45
|
*/
|
|
53
|
-
export
|
|
54
|
-
readonly _tag: "FirstOf";
|
|
55
|
-
readonly policies: ReadonlyArray<Node>;
|
|
56
|
-
}
|
|
46
|
+
export type FirstOfNode = FirstOf;
|
|
57
47
|
/**
|
|
58
48
|
* @stability stable
|
|
59
49
|
* @category models
|
|
60
50
|
* @since 0.3.0
|
|
61
51
|
*/
|
|
62
|
-
export
|
|
63
|
-
readonly _tag: "Ceiling";
|
|
64
|
-
readonly cap: Node;
|
|
65
|
-
readonly policy: Node;
|
|
66
|
-
}
|
|
52
|
+
export type CeilingNode = Ceiling;
|
|
67
53
|
/**
|
|
68
|
-
* The nodes of a policy tree.
|
|
54
|
+
* The nodes of a policy tree, without types. Each node is a class, and only
|
|
55
|
+
* the functions of this module and the Schema make one.
|
|
69
56
|
*
|
|
70
57
|
* @stability stable
|
|
71
58
|
* @category models
|
|
72
59
|
* @since 0.3.0
|
|
73
60
|
*/
|
|
74
|
-
export type Node =
|
|
61
|
+
export type Node = Node$1;
|
|
75
62
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* go into a policy with other types.
|
|
80
|
-
*
|
|
81
|
-
* @stability stable
|
|
82
|
-
* @category models
|
|
83
|
-
* @since 1.0.0
|
|
84
|
-
*/
|
|
85
|
-
export type TypedNode<E = never, R = never, O = never, D = any> = ({
|
|
86
|
-
readonly _tag: "Rules";
|
|
87
|
-
readonly algorithm: Algorithm;
|
|
88
|
-
readonly rules: ReadonlyArray<Rule<E, R, O, D, never>>;
|
|
89
|
-
} | {
|
|
90
|
-
readonly _tag: "All" | "Any" | "FirstOf";
|
|
91
|
-
readonly policies: ReadonlyArray<TypedNode<E, R, O, D>>;
|
|
92
|
-
} | {
|
|
93
|
-
readonly _tag: "Ceiling";
|
|
94
|
-
readonly cap: TypedNode<E, R, O, D>;
|
|
95
|
-
readonly policy: TypedNode<E, R, O, D>;
|
|
96
|
-
}) & {
|
|
97
|
-
readonly "~Node": Variance<E, R, O>;
|
|
98
|
-
};
|
|
99
|
-
/**
|
|
100
|
-
* A policy for the domain `D`. `E`, `R` and `O` come from the conditions of
|
|
101
|
-
* its rules. See `Condition.Condition`.
|
|
63
|
+
* A policy for the domain `D`. `X` is `Condition.Opaque` when a rule of the
|
|
64
|
+
* policy has a predicate, and `never` when the policy is plain data. A plain
|
|
65
|
+
* policy can become JSON, and `decideSync` takes it.
|
|
102
66
|
*
|
|
103
67
|
* @stability stable
|
|
104
68
|
* @category models
|
|
105
69
|
* @since 0.3.0
|
|
106
70
|
*/
|
|
107
|
-
export
|
|
108
|
-
readonly domain: D;
|
|
109
|
-
readonly node: TypedNode<E, R, O, D>;
|
|
110
|
-
readonly "~Policy": Variance<E, R, O>;
|
|
111
|
-
/**
|
|
112
|
-
* Only in the types. A policy reads the values and the principal of its
|
|
113
|
-
* domain, so a policy of one domain is not a policy of a wider domain.
|
|
114
|
-
*/
|
|
115
|
-
readonly "~Domain": (domain: D) => D;
|
|
116
|
-
}
|
|
71
|
+
export type Policy<D extends Any$2, X = never> = PolicyData<D, X>;
|
|
117
72
|
/**
|
|
118
73
|
* Any policy.
|
|
119
74
|
*
|
|
@@ -121,7 +76,7 @@ export interface Policy<D extends Any$1, E = never, R = never, O = never> extend
|
|
|
121
76
|
* @category models
|
|
122
77
|
* @since 0.3.0
|
|
123
78
|
*/
|
|
124
|
-
export type Any = Policy<any, any
|
|
79
|
+
export type Any = Policy<any, any>;
|
|
125
80
|
/**
|
|
126
81
|
* The domain of a policy.
|
|
127
82
|
*
|
|
@@ -129,37 +84,17 @@ export type Any = Policy<any, any, any, any>;
|
|
|
129
84
|
* @category utility types
|
|
130
85
|
* @since 0.3.0
|
|
131
86
|
*/
|
|
132
|
-
export type DomainOf<P> = P extends Policy<infer D, any
|
|
87
|
+
export type DomainOf<P> = P extends Policy<infer D, any> ? D : never;
|
|
133
88
|
/**
|
|
134
|
-
* The
|
|
135
|
-
*
|
|
136
|
-
* @stability stable
|
|
137
|
-
* @category utility types
|
|
138
|
-
* @since 0.3.0
|
|
139
|
-
*/
|
|
140
|
-
export type Error<P> = P extends {
|
|
141
|
-
readonly "~Policy"?: Variance<infer E, infer _R, infer _O>;
|
|
142
|
-
} ? E : never;
|
|
143
|
-
/**
|
|
144
|
-
* The service type of a policy.
|
|
145
|
-
*
|
|
146
|
-
* @stability stable
|
|
147
|
-
* @category utility types
|
|
148
|
-
* @since 0.3.0
|
|
149
|
-
*/
|
|
150
|
-
export type Services<P> = P extends {
|
|
151
|
-
readonly "~Policy"?: Variance<infer _E, infer R, infer _O>;
|
|
152
|
-
} ? R : never;
|
|
153
|
-
/**
|
|
154
|
-
* `Condition.Opaque` when a policy has a predicate.
|
|
89
|
+
* The mark of a policy or a rule: `Condition.Opaque` when it has a predicate.
|
|
155
90
|
*
|
|
156
91
|
* @stability stable
|
|
157
92
|
* @category utility types
|
|
158
93
|
* @since 0.3.0
|
|
159
94
|
*/
|
|
160
95
|
export type OpaqueOf<P> = P extends {
|
|
161
|
-
readonly "~
|
|
162
|
-
} ?
|
|
96
|
+
readonly "~Opaque": () => infer X;
|
|
97
|
+
} ? X : never;
|
|
163
98
|
/**
|
|
164
99
|
* One act on one resource value, for each kind of the domain. The action must
|
|
165
100
|
* be an action of the kind, and the field must be a field of the kind.
|
|
@@ -168,13 +103,13 @@ export type OpaqueOf<P> = P extends {
|
|
|
168
103
|
* @category models
|
|
169
104
|
* @since 0.3.0
|
|
170
105
|
*/
|
|
171
|
-
export type Target<D> = { [K in Kind<D>]: {
|
|
106
|
+
export type Target<D> = { [K in Kind$1<D>]: {
|
|
172
107
|
readonly action: ActionOf<D, K>;
|
|
173
108
|
readonly resource: ValueOf<D, K>;
|
|
174
109
|
readonly field?: FieldSelector<DataOf<D, K>>;
|
|
175
110
|
/** A target has a resource value or a kind, never both. */
|
|
176
111
|
readonly kind?: never;
|
|
177
|
-
}; }[Kind<D>];
|
|
112
|
+
}; }[Kind$1<D>];
|
|
178
113
|
/**
|
|
179
114
|
* A {@link Target} with no field. Each kind keeps its own actions.
|
|
180
115
|
*
|
|
@@ -182,11 +117,11 @@ export type Target<D> = { [K in Kind<D>]: {
|
|
|
182
117
|
* @category models
|
|
183
118
|
* @since 0.3.0
|
|
184
119
|
*/
|
|
185
|
-
export type FieldlessTarget<D> = { [K in Kind<D>]: {
|
|
120
|
+
export type FieldlessTarget<D> = { [K in Kind$1<D>]: {
|
|
186
121
|
readonly action: ActionOf<D, K>;
|
|
187
122
|
readonly resource: ValueOf<D, K>;
|
|
188
123
|
readonly kind?: never;
|
|
189
|
-
}; }[Kind<D>];
|
|
124
|
+
}; }[Kind$1<D>];
|
|
190
125
|
/**
|
|
191
126
|
* A scope: a part of a kind, as a condition on its values. It gets a builder
|
|
192
127
|
* with the types of the kind and of the principal, like the condition of a
|
|
@@ -196,7 +131,7 @@ export type FieldlessTarget<D> = { [K in Kind<D>]: {
|
|
|
196
131
|
* @category models
|
|
197
132
|
* @since 1.0.0
|
|
198
133
|
*/
|
|
199
|
-
export type Scope<D, K extends string> = (builder: Builder<DataOf<D, K>, ValueOf<D, K>, Principal<D>>) => Condition<
|
|
134
|
+
export type Scope<D, K extends string> = (builder: Builder$1<DataOf<D, K>, ValueOf<D, K>, Principal<D>>) => Condition<Reads<ValueOf<D, K>, Principal<D>>>;
|
|
200
135
|
/**
|
|
201
136
|
* One act on one kind of resource, with no value. With `within`, the target is
|
|
202
137
|
* only the values of the kind in the scope. Without it, the target is every
|
|
@@ -206,7 +141,7 @@ export type Scope<D, K extends string> = (builder: Builder<DataOf<D, K>, ValueOf
|
|
|
206
141
|
* @category models
|
|
207
142
|
* @since 0.3.0
|
|
208
143
|
*/
|
|
209
|
-
export type KindTarget<D> = { [K in Kind<D>]: {
|
|
144
|
+
export type KindTarget<D> = { [K in Kind$1<D>]: {
|
|
210
145
|
readonly action: ActionOf<D, K>;
|
|
211
146
|
readonly kind: K;
|
|
212
147
|
readonly field?: FieldSelector<DataOf<D, K>>;
|
|
@@ -214,7 +149,7 @@ export type KindTarget<D> = { [K in Kind<D>]: {
|
|
|
214
149
|
readonly within?: Scope<D, K>;
|
|
215
150
|
/** A target has a resource value or a kind, never both. */
|
|
216
151
|
readonly resource?: never;
|
|
217
|
-
}; }[Kind<D>];
|
|
152
|
+
}; }[Kind$1<D>];
|
|
218
153
|
/**
|
|
219
154
|
* A request: a principal, an action, and a resource value.
|
|
220
155
|
*
|
|
@@ -268,7 +203,7 @@ export interface AnyRequest {
|
|
|
268
203
|
*/
|
|
269
204
|
export interface Step {
|
|
270
205
|
readonly path: ReadonlyArray<number>;
|
|
271
|
-
readonly rule:
|
|
206
|
+
readonly rule: AnyRule;
|
|
272
207
|
readonly applies: boolean;
|
|
273
208
|
}
|
|
274
209
|
/**
|
|
@@ -283,6 +218,191 @@ export interface Explanation {
|
|
|
283
218
|
readonly decision: Decision;
|
|
284
219
|
readonly steps: ReadonlyArray<Step>;
|
|
285
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* A rule for the domain `D`. `I` is what the tests of its condition read, and
|
|
223
|
+
* `X` is its mark: see `Condition.Condition`. A predicate reads the values and
|
|
224
|
+
* the principal of its domain, so a rule may go only into a policy of its own
|
|
225
|
+
* domain. A rule from {@link rule} has the domain `any`.
|
|
226
|
+
*
|
|
227
|
+
* @stability stable
|
|
228
|
+
* @category models
|
|
229
|
+
* @since 0.3.0
|
|
230
|
+
*/
|
|
231
|
+
export interface Rule<D = any, I = unknown, X = never> extends RuleShape<I, X>, Pipeable.Pipeable {
|
|
232
|
+
readonly "~Opaque": () => X;
|
|
233
|
+
readonly "~Domain": (domain: D) => D;
|
|
234
|
+
[Symbol.iterator](): Generator<Rule<D, I, X>, Rule<D, I, X>, unknown>;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* The data of a rule.
|
|
238
|
+
*
|
|
239
|
+
* @stability stable
|
|
240
|
+
* @category models
|
|
241
|
+
* @since 1.0.0
|
|
242
|
+
*/
|
|
243
|
+
export interface RuleShape<I = unknown, X = never> {
|
|
244
|
+
readonly _tag: "Allow" | "Deny";
|
|
245
|
+
readonly actions: ReadonlyArray<string>;
|
|
246
|
+
readonly resources: ReadonlyArray<string>;
|
|
247
|
+
readonly when?: Condition<I, X>;
|
|
248
|
+
readonly fields?: ReadonlyArray<string>;
|
|
249
|
+
readonly reason?: string;
|
|
250
|
+
readonly id?: string;
|
|
251
|
+
readonly meta?: unknown;
|
|
252
|
+
/**
|
|
253
|
+
* The domain of the builder that made the rule. Two domains may have the
|
|
254
|
+
* same types but other paths, so the types can not tell them apart. It is
|
|
255
|
+
* not in the JSON form of a rule.
|
|
256
|
+
*/
|
|
257
|
+
readonly domain?: Any$2;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Any rule.
|
|
261
|
+
*
|
|
262
|
+
* @stability stable
|
|
263
|
+
* @category models
|
|
264
|
+
* @since 0.3.0
|
|
265
|
+
*/
|
|
266
|
+
export type AnyRule = Rule<any, never, any>;
|
|
267
|
+
/**
|
|
268
|
+
* A resource in a rule: a kind name, a resource of the domain, or `"*"`.
|
|
269
|
+
*
|
|
270
|
+
* @stability stable
|
|
271
|
+
* @category models
|
|
272
|
+
* @since 0.3.0
|
|
273
|
+
*/
|
|
274
|
+
export type RuleTarget<D> = Kind$1<D> | Resources<D> | "*";
|
|
275
|
+
/**
|
|
276
|
+
* The kind name of a target.
|
|
277
|
+
*
|
|
278
|
+
* @stability stable
|
|
279
|
+
* @category utility types
|
|
280
|
+
* @since 0.3.0
|
|
281
|
+
*/
|
|
282
|
+
export type KindOf<T> = T extends string ? T : Kind<T>;
|
|
283
|
+
/**
|
|
284
|
+
* The actions that a rule may use for the kinds `K`.
|
|
285
|
+
*
|
|
286
|
+
* @stability stable
|
|
287
|
+
* @category utility types
|
|
288
|
+
* @since 0.3.0
|
|
289
|
+
*/
|
|
290
|
+
export type ActionFor<D, K> = "*" | ("*" extends K ? AnyAction<D> : ActionOf<D, Extract<K, string>>);
|
|
291
|
+
/**
|
|
292
|
+
* The targets in the resource argument of a rule: the one target, or the
|
|
293
|
+
* targets of a list.
|
|
294
|
+
*
|
|
295
|
+
* @stability stable
|
|
296
|
+
* @category utility types
|
|
297
|
+
* @since 1.0.0
|
|
298
|
+
*/
|
|
299
|
+
export type TargetOf<Res> = Res extends ReadonlyArray<infer X> ? X : Res;
|
|
300
|
+
/**
|
|
301
|
+
* The actions that a rule may use for its resource argument. A list of
|
|
302
|
+
* resources may use an action of any of them. One target with a union type
|
|
303
|
+
* may use only an action of every kind in the union, because its value may be
|
|
304
|
+
* any one of them. When the argument may be a list or one target, the rule
|
|
305
|
+
* may use only an action that each of these shapes allows.
|
|
306
|
+
*
|
|
307
|
+
* @stability stable
|
|
308
|
+
* @category utility types
|
|
309
|
+
* @since 1.0.0
|
|
310
|
+
*/
|
|
311
|
+
export type ActionForTargets<D, Res> = (Res extends ReadonlyArray<infer X> ? (action: ActionFor<D, KindOf<X>>) => void : (action: ActionForTarget<D, Res>) => void) extends ((action: infer A) => void) ? A : never;
|
|
312
|
+
/** The actions for one target that is not a list. */
|
|
313
|
+
type ActionForTarget<D, Res> = "*" | ("*" extends KindOf<Res> ? AnyAction<D> : CommonAction<D, Extract<KindOf<Res>, string>>);
|
|
314
|
+
/**
|
|
315
|
+
* The data type of the kinds `K`. For `"*"` it has no fields.
|
|
316
|
+
*
|
|
317
|
+
* @stability stable
|
|
318
|
+
* @category utility types
|
|
319
|
+
* @since 0.3.0
|
|
320
|
+
*/
|
|
321
|
+
export type DataFor<D, K> = "*" extends K ? {} : DataOf<D, Extract<K, string>>;
|
|
322
|
+
/**
|
|
323
|
+
* The value type of the kinds `K`.
|
|
324
|
+
*
|
|
325
|
+
* @stability stable
|
|
326
|
+
* @category utility types
|
|
327
|
+
* @since 0.3.0
|
|
328
|
+
*/
|
|
329
|
+
export type ValueFor<D, K> = "*" extends K ? AnyValue<D> : ValueOf<D, Extract<K, string>>;
|
|
330
|
+
/**
|
|
331
|
+
* A field name or a field pattern of the kinds `K`.
|
|
332
|
+
*
|
|
333
|
+
* @stability stable
|
|
334
|
+
* @category models
|
|
335
|
+
* @since 0.3.0
|
|
336
|
+
*/
|
|
337
|
+
export type FieldFor<D, K> = FieldName<DataFor<D, K>> | `${string}*${string}`;
|
|
338
|
+
/**
|
|
339
|
+
* A condition that a rule for the kinds `K` may have. Its predicates may read
|
|
340
|
+
* only the values of these kinds and the principal of the domain.
|
|
341
|
+
*
|
|
342
|
+
* @stability stable
|
|
343
|
+
* @category models
|
|
344
|
+
* @since 1.0.0
|
|
345
|
+
*/
|
|
346
|
+
export type ConditionFor<D, K> = Condition<Reads<ValueFor<D, K>, Principal<D>>, any>;
|
|
347
|
+
/**
|
|
348
|
+
* The options of a rule.
|
|
349
|
+
*
|
|
350
|
+
* @stability stable
|
|
351
|
+
* @category models
|
|
352
|
+
* @since 0.3.0
|
|
353
|
+
*/
|
|
354
|
+
export interface RuleOptions<D, K, C extends Any$1> {
|
|
355
|
+
/** The condition. It gets a builder with the types of the resource. */
|
|
356
|
+
readonly when?: (builder: Builder$1<DataFor<D, K>, ValueFor<D, K>, Principal<D>>) => C;
|
|
357
|
+
readonly fields?: ReadonlyArray<FieldFor<D, K>>;
|
|
358
|
+
readonly reason?: string;
|
|
359
|
+
readonly id?: string;
|
|
360
|
+
readonly meta?: Meta<D>;
|
|
361
|
+
}
|
|
362
|
+
type SingleOrArray<A> = A | ReadonlyArray<A>;
|
|
363
|
+
/**
|
|
364
|
+
* Makes rules with the types of a domain.
|
|
365
|
+
*
|
|
366
|
+
* @stability stable
|
|
367
|
+
* @category models
|
|
368
|
+
* @since 0.3.0
|
|
369
|
+
*/
|
|
370
|
+
export interface Builder<D> {
|
|
371
|
+
readonly allow: <const Res extends SingleOrArray<RuleTarget<D>>, const A extends ActionForTargets<D, Res>, const C extends ConditionFor<D, KindOf<TargetOf<Res>>> = Condition>(action: SingleOrArray<A>, resource: Res, options?: RuleOptions<D, KindOf<TargetOf<Res>>, C>) => Rule<D, ReadsOf<C>, OpaqueOf$1<C>>;
|
|
372
|
+
readonly deny: <const Res extends SingleOrArray<RuleTarget<D>>, const A extends ActionForTargets<D, Res>, const C extends ConditionFor<D, KindOf<TargetOf<Res>>> = Condition>(action: SingleOrArray<A>, resource: Res, options?: RuleOptions<D, KindOf<TargetOf<Res>>, C>) => Rule<D, ReadsOf<C>, OpaqueOf$1<C>>;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Makes rules with the types of a domain. `Policy.define` gives one to its
|
|
376
|
+
* generator. Use this one to make rules outside of a generator.
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* ```ts
|
|
380
|
+
* const _ = Policy.builder(App)
|
|
381
|
+
* const rule = _.allow("read", Document, {
|
|
382
|
+
* when: ($) => $.eq("ownerId", $.principal("id")),
|
|
383
|
+
* })
|
|
384
|
+
* ```
|
|
385
|
+
*
|
|
386
|
+
* @stability stable
|
|
387
|
+
* @category constructors
|
|
388
|
+
* @since 2.0.0
|
|
389
|
+
*/
|
|
390
|
+
export declare const builder: <D extends Any$2>(domain: D) => Builder<D>;
|
|
391
|
+
/**
|
|
392
|
+
* Makes a rule from its data, with no types. It does not check the data
|
|
393
|
+
* against a domain: a policy does that when the rule goes into it. Use
|
|
394
|
+
* {@link builder} for rules with types, or {@link schema} for rules from JSON.
|
|
395
|
+
*
|
|
396
|
+
* The condition may not have a predicate. A policy checks the fields of a
|
|
397
|
+
* condition against the resources of its rule, but it can not check what
|
|
398
|
+
* the code of a predicate reads. A rule from the builder keeps that in its
|
|
399
|
+
* types; this one could give a predicate of one kind to another kind.
|
|
400
|
+
*
|
|
401
|
+
* @stability stable
|
|
402
|
+
* @category constructors
|
|
403
|
+
* @since 2.0.0
|
|
404
|
+
*/
|
|
405
|
+
export declare const rule: <I = unknown>(data: RuleShape<I, never>) => Rule<any, NoInfer<I>>;
|
|
286
406
|
/**
|
|
287
407
|
* The options of a list of rules.
|
|
288
408
|
*
|
|
@@ -295,13 +415,26 @@ export interface Options {
|
|
|
295
415
|
readonly algorithm?: Algorithm;
|
|
296
416
|
}
|
|
297
417
|
/**
|
|
298
|
-
*
|
|
418
|
+
* The error when a rule does not fit its domain: it names a kind, an action,
|
|
419
|
+
* a field or a field of the principal that the domain does not have, or it
|
|
420
|
+
* tests a field with a value that the field can not hold. It has one issue
|
|
421
|
+
* for each problem, with its path, and a suggestion when a name has a mistake.
|
|
299
422
|
*
|
|
300
423
|
* @stability stable
|
|
301
|
-
* @category
|
|
302
|
-
* @since 0.
|
|
424
|
+
* @category errors
|
|
425
|
+
* @since 2.0.0
|
|
426
|
+
*/
|
|
427
|
+
export declare const PolicyError: typeof PolicyError$1;
|
|
428
|
+
/**
|
|
429
|
+
* @stability stable
|
|
430
|
+
* @category errors
|
|
431
|
+
* @since 2.0.0
|
|
303
432
|
*/
|
|
304
|
-
export
|
|
433
|
+
export type PolicyError = PolicyError$1;
|
|
434
|
+
/** The mark of a union of rules: `Condition.Opaque` when one has a predicate. */
|
|
435
|
+
type RulesOpaque<Rules> = Rules extends {
|
|
436
|
+
readonly "~Opaque": () => infer X;
|
|
437
|
+
} ? X : never;
|
|
305
438
|
/**
|
|
306
439
|
* Makes a policy from a generator function that gives rules. It is pure and it
|
|
307
440
|
* gives its result at once.
|
|
@@ -320,16 +453,8 @@ export declare const rules: <D extends Any$1, Rules extends Rule<any, any, any,
|
|
|
320
453
|
* @category constructors
|
|
321
454
|
* @since 0.3.0
|
|
322
455
|
*/
|
|
323
|
-
export declare const define: <D extends Any$
|
|
324
|
-
|
|
325
|
-
* A policy with no rules. It is not applicable to any request.
|
|
326
|
-
*
|
|
327
|
-
* @stability stable
|
|
328
|
-
* @category constructors
|
|
329
|
-
* @since 0.3.0
|
|
330
|
-
*/
|
|
331
|
-
export declare const empty: <D extends Any$1>(domain: D) => Policy<D>;
|
|
332
|
-
type Combined<D extends Any$1, Ps extends ReadonlyArray<Any>> = Policy<D, Error<Ps[number]>, Services<Ps[number]>, OpaqueOf<Ps[number]>>;
|
|
456
|
+
export declare const define: <D extends Any$2>(domain: D, options?: Options) => <Rules extends Rule<D, never, any>, A>(body: (builder: Builder<D>) => Generator<Rules, A, unknown>) => Policy<D, RulesOpaque<Rules>>;
|
|
457
|
+
type Combined<D extends Any$2, Ps extends ReadonlyArray<Any>> = Policy<D, OpaqueOf<Ps[number]>>;
|
|
333
458
|
/**
|
|
334
459
|
* Every policy must allow, and one deny is enough to deny. With some policies
|
|
335
460
|
* not applicable and none that deny, the result is not applicable.
|
|
@@ -338,7 +463,7 @@ type Combined<D extends Any$1, Ps extends ReadonlyArray<Any>> = Policy<D, Error<
|
|
|
338
463
|
* @category combinators
|
|
339
464
|
* @since 0.3.0
|
|
340
465
|
*/
|
|
341
|
-
export declare const all: <const Ps extends readonly [
|
|
466
|
+
export declare const all: <const Ps extends readonly [Any, ...Array<Any>]>(policies: Ps) => Combined<DomainOf<Ps[0]>, Ps>;
|
|
342
467
|
/**
|
|
343
468
|
* One allow is enough. Without an allow, one deny gives a deny.
|
|
344
469
|
*
|
|
@@ -346,7 +471,7 @@ export declare const all: <const Ps extends readonly [Policy<any, any, any, any>
|
|
|
346
471
|
* @category combinators
|
|
347
472
|
* @since 0.3.0
|
|
348
473
|
*/
|
|
349
|
-
export declare const any: <const Ps extends readonly [
|
|
474
|
+
export declare const any: <const Ps extends readonly [Any, ...Array<Any>]>(policies: Ps) => Combined<DomainOf<Ps[0]>, Ps>;
|
|
350
475
|
/**
|
|
351
476
|
* The first policy that allows or denies gives the answer.
|
|
352
477
|
*
|
|
@@ -354,7 +479,7 @@ export declare const any: <const Ps extends readonly [Policy<any, any, any, any>
|
|
|
354
479
|
* @category combinators
|
|
355
480
|
* @since 0.3.0
|
|
356
481
|
*/
|
|
357
|
-
export declare const firstOf: <const Ps extends readonly [
|
|
482
|
+
export declare const firstOf: <const Ps extends readonly [Any, ...Array<Any>]>(policies: Ps) => Combined<DomainOf<Ps[0]>, Ps>;
|
|
358
483
|
/**
|
|
359
484
|
* Puts a limit on a policy. A deny from `cap` always wins. An allow from `cap`
|
|
360
485
|
* does nothing.
|
|
@@ -364,8 +489,8 @@ export declare const firstOf: <const Ps extends readonly [Policy<any, any, any,
|
|
|
364
489
|
* @since 0.3.0
|
|
365
490
|
*/
|
|
366
491
|
export declare const ceiling: {
|
|
367
|
-
<D extends Any$
|
|
368
|
-
<D extends Any$
|
|
492
|
+
<D extends Any$2, X2>(cap: Policy<D, X2>): <X>(policy: Policy<D, X>) => Policy<D, X | X2>;
|
|
493
|
+
<D extends Any$2, X, X2>(policy: Policy<D, X>, cap: Policy<D, X2>): Policy<D, X | X2>;
|
|
369
494
|
};
|
|
370
495
|
/**
|
|
371
496
|
* Gives the services in `context` to every predicate of a policy, so the
|
|
@@ -376,24 +501,9 @@ export declare const ceiling: {
|
|
|
376
501
|
* @since 1.0.0
|
|
377
502
|
*/
|
|
378
503
|
export declare const provideContext: {
|
|
379
|
-
<R>(context: Context.Context<R>): <D extends Any$
|
|
380
|
-
<D extends Any$
|
|
504
|
+
<R>(context: Context.Context<R>): <D extends Any$2, X>(policy: Policy<D, X> & ([ServicesOf<X>] extends [R] ? unknown : never)) => Policy<D, Provided<X>>;
|
|
505
|
+
<D extends Any$2, X>(policy: Policy<D, X>, context: Context.Context<ServicesOf<X>>): Policy<D, Provided<X>>;
|
|
381
506
|
};
|
|
382
|
-
/**
|
|
383
|
-
* Tests if a request fits its kind: the action is an action of the kind, and
|
|
384
|
-
* the field, if there is one, is a field of the kind. The types check this,
|
|
385
|
-
* but a value with a union type, or a value from outside, may get past them.
|
|
386
|
-
* A rule for every action (`"*"`) must not cover an action that the kind does
|
|
387
|
-
* not have, so such a request is not applicable.
|
|
388
|
-
*
|
|
389
|
-
* @stability stable
|
|
390
|
-
* @category predicates
|
|
391
|
-
* @since 1.0.0
|
|
392
|
-
*/
|
|
393
|
-
export declare const fitsKind: (descriptor: Descriptor, request: {
|
|
394
|
-
readonly action: string;
|
|
395
|
-
readonly field?: string | undefined;
|
|
396
|
-
}) => boolean;
|
|
397
507
|
/**
|
|
398
508
|
* Gives the decision of a policy for a request.
|
|
399
509
|
*
|
|
@@ -401,10 +511,7 @@ export declare const fitsKind: (descriptor: Descriptor, request: {
|
|
|
401
511
|
* @category evaluation
|
|
402
512
|
* @since 0.3.0
|
|
403
513
|
*/
|
|
404
|
-
export declare const decide:
|
|
405
|
-
<D extends Any$1 = never>(request: Request<D>): <E, R, O>(policy: Policy<D, E, R, O>) => Effect.Effect<Decision, E, R>;
|
|
406
|
-
<D extends Any$1, E, R, O>(policy: Policy<D, E, R, O>, request: Request<NoInfer<D>>): Effect.Effect<Decision, E, R>;
|
|
407
|
-
};
|
|
514
|
+
export declare const decide: <D extends Any$2, X>(policy: Policy<D, X>, request: Request<NoInfer<D>>) => Effect.Effect<Decision, ErrorOf<X>, ServicesOf<X>>;
|
|
408
515
|
/**
|
|
409
516
|
* Gives the decision of a policy with no predicates, at once.
|
|
410
517
|
*
|
|
@@ -412,29 +519,22 @@ export declare const decide: {
|
|
|
412
519
|
* @category evaluation
|
|
413
520
|
* @since 0.3.0
|
|
414
521
|
*/
|
|
415
|
-
export declare const decideSync:
|
|
416
|
-
<D extends Any$1 = never>(request: Request<D>): (policy: Policy<D>) => Decision;
|
|
417
|
-
<D extends Any$1>(policy: Policy<D>, request: Request<NoInfer<D>>): Decision;
|
|
418
|
-
};
|
|
522
|
+
export declare const decideSync: <D extends Any$2>(policy: Policy<D>, request: Request<NoInfer<D>>) => Decision;
|
|
419
523
|
/**
|
|
420
524
|
* Gives the decision of a policy and the rules that were tested to make it.
|
|
421
525
|
*
|
|
422
|
-
* One node may be a child of many nodes.
|
|
423
|
-
*
|
|
424
|
-
* and are in the steps, only the first time. So a small tree with many shared
|
|
425
|
-
* nodes gives a short list of steps.
|
|
526
|
+
* One node may be a child of many nodes. Its rules are tested, and are in the
|
|
527
|
+
* steps, each time that the decision comes to it.
|
|
426
528
|
*
|
|
427
529
|
* @stability stable
|
|
428
530
|
* @category evaluation
|
|
429
531
|
* @since 0.3.0
|
|
430
532
|
*/
|
|
431
|
-
export declare const explain:
|
|
432
|
-
<D extends Any$1 = never>(request: Request<D>): <E, R, O>(policy: Policy<D, E, R, O>) => Effect.Effect<Explanation, E, R>;
|
|
433
|
-
<D extends Any$1, E, R, O>(policy: Policy<D, E, R, O>, request: Request<NoInfer<D>>): Effect.Effect<Explanation, E, R>;
|
|
434
|
-
};
|
|
533
|
+
export declare const explain: <D extends Any$2, X>(policy: Policy<D, X>, request: Request<NoInfer<D>>) => Effect.Effect<Explanation, ErrorOf<X>, ServicesOf<X>>;
|
|
435
534
|
/**
|
|
436
535
|
* Gives the fields of a resource value that the policy lets a request use. It
|
|
437
|
-
* tests each field of
|
|
536
|
+
* tests each field that a list of fields shows: each scalar, record or array
|
|
537
|
+
* of the resource Schema, with dots for nested fields.
|
|
438
538
|
*
|
|
439
539
|
* A field that holds more than one value, such as a record, is left out when a
|
|
440
540
|
* deny rule names a part of it. The list can not name that part, and the whole
|
|
@@ -444,48 +544,7 @@ export declare const explain: {
|
|
|
444
544
|
* @category evaluation
|
|
445
545
|
* @since 0.3.0
|
|
446
546
|
*/
|
|
447
|
-
export declare const permittedFields:
|
|
448
|
-
<D extends Any$1 = never>(request: FieldlessRequest<D>): <E, R, O>(policy: Policy<D, E, R, O>) => Effect.Effect<ReadonlyArray<string>, E, R>;
|
|
449
|
-
<D extends Any$1, E, R, O>(policy: Policy<D, E, R, O>, request: FieldlessRequest<NoInfer<D>>): Effect.Effect<ReadonlyArray<string>, E, R>;
|
|
450
|
-
};
|
|
451
|
-
/**
|
|
452
|
-
* The two residual conditions of a request. See {@link residuals}.
|
|
453
|
-
*
|
|
454
|
-
* @stability stable
|
|
455
|
-
* @category models
|
|
456
|
-
* @since 1.0.0
|
|
457
|
-
*/
|
|
458
|
-
export interface Residuals<E = never, R = never, O = never, I = unknown> {
|
|
459
|
-
/** The condition on resource values for which the policy allows. */
|
|
460
|
-
readonly allow: Condition<E, R, O, I>;
|
|
461
|
-
/** The condition on resource values for which the policy denies. */
|
|
462
|
-
readonly deny: Condition<E, R, O, I>;
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* A request about a kind of resource, with no types.
|
|
466
|
-
*
|
|
467
|
-
* @stability stable
|
|
468
|
-
* @category models
|
|
469
|
-
* @since 1.0.0
|
|
470
|
-
*/
|
|
471
|
-
export interface AnyKindRequest {
|
|
472
|
-
readonly principal: object;
|
|
473
|
-
readonly action: string;
|
|
474
|
-
readonly kind: string;
|
|
475
|
-
readonly field?: string | undefined;
|
|
476
|
-
/**
|
|
477
|
-
* A scope needs the types of the domain for its builder. With the request
|
|
478
|
-
* first, the domain is not known yet, so give the policy first.
|
|
479
|
-
*/
|
|
480
|
-
readonly within?: never;
|
|
481
|
-
}
|
|
482
|
-
/**
|
|
483
|
-
* `unknown` when the request `Req` is a request of the type `T`, and `never`
|
|
484
|
-
* when it is not. With the request first and the policy later, the request is
|
|
485
|
-
* checked when the policy, and so the domain, is known. For a union, each
|
|
486
|
-
* member must be such a request.
|
|
487
|
-
*/
|
|
488
|
-
type Fits<Req, T> = [Req] extends [T] ? unknown : never;
|
|
547
|
+
export declare const permittedFields: <D extends Any$2, X>(policy: Policy<D, X>, request: FieldlessRequest<NoInfer<D>>) => Effect.Effect<ReadonlyArray<string>, ErrorOf<X>, ServicesOf<X>>;
|
|
489
548
|
/**
|
|
490
549
|
* What a residual condition reads: a value of the kind `K`. The principal is
|
|
491
550
|
* already in it. A residual is for one kind, so when `K` is a union of kinds,
|
|
@@ -497,14 +556,6 @@ type Fits<Req, T> = [Req] extends [T] ? unknown : never;
|
|
|
497
556
|
* @since 1.0.0
|
|
498
557
|
*/
|
|
499
558
|
export type ResidualReads<D, K> = Reads<(K extends unknown ? (value: ValueOf<D, K & string>) => void : never) extends ((value: infer V) => void) ? V : never, unknown>;
|
|
500
|
-
/** A request about a kind with no types, with the scope of a target. */
|
|
501
|
-
interface ScopedRequest {
|
|
502
|
-
readonly principal: object;
|
|
503
|
-
readonly action: string;
|
|
504
|
-
readonly kind: string;
|
|
505
|
-
readonly field?: string | undefined;
|
|
506
|
-
readonly within?: unknown;
|
|
507
|
-
}
|
|
508
559
|
/**
|
|
509
560
|
* Gives the condition on resource values for which the policy allows a
|
|
510
561
|
* request. It has no principal fields and no `Under` nodes, so you can give it
|
|
@@ -524,31 +575,14 @@ interface ScopedRequest {
|
|
|
524
575
|
*
|
|
525
576
|
* A policy tree may use the condition of a child two times, so a small policy
|
|
526
577
|
* may give a very large condition. When the condition would have more than
|
|
527
|
-
* 10000 nodes
|
|
528
|
-
*
|
|
529
|
-
* a defect, so the check fails.
|
|
578
|
+
* 10000 nodes, this function throws an error. In an `Authorizer`, the error
|
|
579
|
+
* is a defect, so the check fails.
|
|
530
580
|
*
|
|
531
581
|
* @stability stable
|
|
532
582
|
* @category evaluation
|
|
533
583
|
* @since 0.3.0
|
|
534
584
|
*/
|
|
535
|
-
export declare const residual:
|
|
536
|
-
<const Req extends AnyKindRequest>(request: Req): <D extends Any$1, E, R, O>(policy: Policy<D, E, R, O> & Fits<Req, KindRequest<D>>) => Condition<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
537
|
-
<D extends Any$1, E, R, O, const Req extends KindRequest<NoInfer<D>>>(policy: Policy<D, E, R, O>, request: Req): Condition<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
538
|
-
};
|
|
539
|
-
/**
|
|
540
|
-
* Gives both residual conditions of a request: the values that the policy
|
|
541
|
-
* allows, and the values that it denies. A value in neither is not
|
|
542
|
-
* applicable. See {@link residual}.
|
|
543
|
-
*
|
|
544
|
-
* @stability stable
|
|
545
|
-
* @category evaluation
|
|
546
|
-
* @since 1.0.0
|
|
547
|
-
*/
|
|
548
|
-
export declare const residuals: {
|
|
549
|
-
<const Req extends AnyKindRequest>(request: Req): <D extends Any$1, E, R, O>(policy: Policy<D, E, R, O> & Fits<Req, KindRequest<D>>) => Residuals<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
550
|
-
<D extends Any$1, E, R, O, const Req extends KindRequest<NoInfer<D>>>(policy: Policy<D, E, R, O>, request: Req): Residuals<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
551
|
-
};
|
|
585
|
+
export declare const residual: <D extends Any$2, X, const Req extends KindRequest<NoInfer<D>>>(policy: Policy<D, X>, request: Req) => Condition<ResidualReads<D, Req["kind"]>, X>;
|
|
552
586
|
/**
|
|
553
587
|
* How much of a scope a policy allows. In each case, `condition` is the exact
|
|
554
588
|
* condition on the values in the scope that the policy allows: give it to
|
|
@@ -568,67 +602,43 @@ export declare const residuals: {
|
|
|
568
602
|
* @category models
|
|
569
603
|
* @since 1.0.0
|
|
570
604
|
*/
|
|
571
|
-
export type Coverage<
|
|
605
|
+
export type Coverage<I = unknown, X = never> = Data.TaggedEnum<{
|
|
572
606
|
All: {
|
|
573
|
-
readonly condition: Condition<
|
|
607
|
+
readonly condition: Condition<I, X>;
|
|
574
608
|
};
|
|
575
609
|
None: {
|
|
576
|
-
readonly condition: Condition<
|
|
610
|
+
readonly condition: Condition<I, X>;
|
|
577
611
|
};
|
|
578
612
|
Some: {
|
|
579
|
-
readonly condition: Condition<
|
|
613
|
+
readonly condition: Condition<I, X>;
|
|
580
614
|
readonly allowed: Example;
|
|
581
615
|
readonly refused: Example;
|
|
582
616
|
};
|
|
583
617
|
Unknown: {
|
|
584
|
-
readonly condition: Condition<
|
|
585
|
-
readonly reason: "predicate" | "budget"
|
|
618
|
+
readonly condition: Condition<I, X>;
|
|
619
|
+
readonly reason: "predicate" | "budget";
|
|
586
620
|
};
|
|
587
621
|
}>;
|
|
588
|
-
/**
|
|
589
|
-
* Tests if the scope of a request has a value of the Schema of its kind. The
|
|
590
|
-
* answer is `true` only when the search finds such a value. When the search
|
|
591
|
-
* can not say, the answer is `false`. So a "yes" from it is safe to act on,
|
|
592
|
-
* as for the question "may the decider answer for this scope?".
|
|
593
|
-
*
|
|
594
|
-
* @stability stable
|
|
595
|
-
* @category evaluation
|
|
596
|
-
* @since 1.0.0
|
|
597
|
-
*/
|
|
598
|
-
export declare const scopeHasValue: (policy: Any, request: ScopedRequest) => boolean;
|
|
599
|
-
/**
|
|
600
|
-
* Tests if the scope of a request has no value of the Schema of its kind. A
|
|
601
|
-
* scope with a mistake, such as two values for one field, is empty. With no
|
|
602
|
-
* scope, the answer is `false` when the kind has a value. When the search can
|
|
603
|
-
* not say, the answer is `false`.
|
|
604
|
-
*
|
|
605
|
-
* @stability stable
|
|
606
|
-
* @category evaluation
|
|
607
|
-
* @since 1.0.0
|
|
608
|
-
*/
|
|
609
|
-
export declare const scopeIsEmpty: (policy: Any, request: ScopedRequest) => boolean;
|
|
610
622
|
/**
|
|
611
623
|
* Tells how much of a scope the policy allows: all of it, none of it, or some
|
|
612
624
|
* of it. See {@link Coverage}. With no scope (`within`), the scope is every
|
|
613
625
|
* value of the kind.
|
|
614
626
|
*
|
|
615
|
-
* The answer comes from {@link Condition.satisfiable} with the
|
|
616
|
-
* resource
|
|
617
|
-
*
|
|
618
|
-
*
|
|
619
|
-
*
|
|
627
|
+
* The answer comes from {@link Condition.satisfiable} with the shape of the
|
|
628
|
+
* Schema of the resource. `All` and `None` hold for every value of the
|
|
629
|
+
* Schema. `Some` means that, by the shape of the Schema, a value may get
|
|
630
|
+
* either answer: a check such as a minimum length may still stop one of the
|
|
631
|
+
* examples. `Unknown` comes only from a predicate or from the budget of the
|
|
632
|
+
* search.
|
|
620
633
|
*
|
|
621
|
-
* `Some`
|
|
622
|
-
*
|
|
634
|
+
* `Some` does not mean that such a value is in your database. To know that,
|
|
635
|
+
* run `condition` as a query.
|
|
623
636
|
*
|
|
624
637
|
* @stability stable
|
|
625
638
|
* @category evaluation
|
|
626
639
|
* @since 1.0.0
|
|
627
640
|
*/
|
|
628
|
-
export declare const coverage:
|
|
629
|
-
<const Req extends AnyKindRequest>(request: Req): <D extends Any$1, E, R, O>(policy: Policy<D, E, R, O> & Fits<Req, KindRequest<D>>) => Coverage<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
630
|
-
<D extends Any$1, E, R, O, const Req extends KindRequest<NoInfer<D>>>(policy: Policy<D, E, R, O>, request: Req): Coverage<E, R, O, ResidualReads<D, Req["kind"]>>;
|
|
631
|
-
};
|
|
641
|
+
export declare const coverage: <D extends Any$2, X, const Req extends KindRequest<NoInfer<D>>>(policy: Policy<D, X>, request: Req) => Coverage<ResidualReads<D, Req["kind"]>, X>;
|
|
632
642
|
/**
|
|
633
643
|
* The JSON form of a rule.
|
|
634
644
|
*
|
|
@@ -665,23 +675,20 @@ export type EncodedNode = {
|
|
|
665
675
|
readonly cap: EncodedNode;
|
|
666
676
|
readonly policy: EncodedNode;
|
|
667
677
|
};
|
|
668
|
-
/**
|
|
669
|
-
* Tests if a value is a policy.
|
|
670
|
-
*
|
|
671
|
-
* @stability stable
|
|
672
|
-
* @category guards
|
|
673
|
-
* @since 0.3.0
|
|
674
|
-
*/
|
|
675
|
-
export declare const isPolicy: (u: unknown) => u is Any;
|
|
676
678
|
/**
|
|
677
679
|
* The Schema of the policies of a domain with no predicates. Decoding checks
|
|
678
680
|
* every kind, action, field and principal field against the domain, and the
|
|
679
681
|
* `meta` of each rule against the `meta` Schema of the domain.
|
|
680
682
|
*
|
|
683
|
+
* The decoder takes at most 256 levels of policies and 500 levels of
|
|
684
|
+
* conditions, and at most 1000000 objects and array items, with a shared
|
|
685
|
+
* object counted for each place. It reads only the own data fields of the
|
|
686
|
+
* input.
|
|
687
|
+
*
|
|
681
688
|
* @stability stable
|
|
682
689
|
* @category schemas
|
|
683
690
|
* @since 0.3.0
|
|
684
691
|
*/
|
|
685
|
-
export declare const schema: <D extends Any$
|
|
692
|
+
export declare const schema: <D extends Any$2>(domain: D) => Schema.Codec<Policy<D>, EncodedNode>;
|
|
686
693
|
export { Policy_d_exports };
|
|
687
694
|
//# sourceMappingURL=Policy.d.ts.map
|