@nmnmcc/ability 0.1.0

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.
@@ -0,0 +1,516 @@
1
+ import { AliasError as AliasError$1, AuthorizationError as AuthorizationError$1, ConditionError as ConditionError$1, PredicateEvaluationError as PredicateEvaluationError$1, QueryGenerationError as QueryGenerationError$1, RawRuleError as RawRuleError$1, RuleTypeId as RuleTypeId$1, SerializationError as SerializationError$1, SubjectDetectionError as SubjectDetectionError$1, SubjectTypeId as SubjectTypeId$1, TypeId as TypeId$1 } from "./internal/ability.js";
2
+ import { MongoQuery } from "@ucast/mongo2js";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Equal from "effect/Equal";
5
+ import * as Inspectable from "effect/Inspectable";
6
+ import * as Pipeable from "effect/Pipeable";
7
+
8
+ //#region src/Ability.d.ts
9
+ declare namespace Ability_d_exports {
10
+ export { Ability, AbilityOptions, ActionAliases, ActionResolver, AliasError, AnyAction, AnyRule, AnySubject, AuthorizationError, Builder, CheckRequest, ConditionError, DetectSubjectType, ExpandedAction, FieldOf, FieldPath, FieldPattern, MongoCondition, PermittedFieldsOptions, Predicate, PredicateEvaluationError, QueryGenerationError, RawRule, RawRuleError, Rule, RuleKind, RuleOptions, RuleQueryRequest, RuleSubject, RuleTypeId, SerializationError, SingleOrReadonlyArray, SubjectDetectionError, SubjectMap, SubjectName, SubjectQueryRequest, SubjectTypeId, SubjectUnion, ToRawRulesOptions, TypeId, TypedSubject, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject };
11
+ }
12
+ /**
13
+ * @since 0.1.0
14
+ * @category Type Ids
15
+ */
16
+ declare const TypeId: typeof TypeId$1;
17
+ /**
18
+ * @since 0.1.0
19
+ * @category Type Ids
20
+ */
21
+ type TypeId = typeof TypeId;
22
+ /**
23
+ * @since 0.1.0
24
+ * @category Type Ids
25
+ */
26
+ declare const SubjectTypeId: typeof SubjectTypeId$1;
27
+ /**
28
+ * @since 0.1.0
29
+ * @category Type Ids
30
+ */
31
+ type SubjectTypeId = typeof SubjectTypeId;
32
+ /**
33
+ * Unique identifier for `Rule` values.
34
+ *
35
+ * @since 0.1.0
36
+ * @category Type Ids
37
+ */
38
+ declare const RuleTypeId: typeof RuleTypeId$1;
39
+ /**
40
+ * @since 0.1.0
41
+ * @category Type Ids
42
+ */
43
+ type RuleTypeId = typeof RuleTypeId;
44
+ /**
45
+ * @since 0.1.0
46
+ * @category Models
47
+ */
48
+ type SingleOrReadonlyArray<A> = A | ReadonlyArray<A>;
49
+ /**
50
+ * @since 0.1.0
51
+ * @category Models
52
+ */
53
+ type ActionAliases = Readonly<Record<string, SingleOrReadonlyArray<string>>>;
54
+ /**
55
+ * @since 0.1.0
56
+ * @category Models
57
+ */
58
+ type ActionResolver = (action: SingleOrReadonlyArray<string>) => ReadonlyArray<string>;
59
+ /**
60
+ * @since 0.1.0
61
+ * @category Models
62
+ */
63
+ type AnyAction = "manage";
64
+ /**
65
+ * @since 0.1.0
66
+ * @category Models
67
+ */
68
+ type AnySubject = "all";
69
+ /**
70
+ * @since 0.1.0
71
+ * @category Models
72
+ */
73
+ type SubjectMap = Readonly<Record<string, object>>;
74
+ /**
75
+ * @since 0.1.0
76
+ * @category Models
77
+ */
78
+ type SubjectName<Subjects extends SubjectMap> = string & keyof Subjects;
79
+ /**
80
+ * @since 0.1.0
81
+ * @category Models
82
+ */
83
+ type RuleSubject<Subjects extends SubjectMap> = SubjectName<Subjects> | AnySubject;
84
+ /**
85
+ * @since 0.1.0
86
+ * @category Models
87
+ */
88
+ type SubjectUnion<Subjects extends SubjectMap> = Subjects[SubjectName<Subjects>];
89
+ type Primitive = string | number | boolean | bigint | symbol | null | undefined | Function | ReadonlyArray<unknown>;
90
+ type PreviousDepth = [never, 0, 1, 2, 3, 4, 5];
91
+ type FieldPathInternal<Subject, Depth extends number> = [Depth] extends [never] ? never : Subject extends Primitive ? never : Subject extends object ? { [Key in keyof Subject & string]: Subject[Key] extends Primitive ? Key : Key | `${Key}.${FieldPathInternal<Subject[Key], PreviousDepth[Depth]>}` }[keyof Subject & string] : never;
92
+ /**
93
+ * Dot-path field names for a subject. The recursion depth is intentionally
94
+ * bounded to keep public type-checking predictable.
95
+ *
96
+ * @since 0.1.0
97
+ * @category Models
98
+ */
99
+ type FieldPath<Subject> = FieldPathInternal<Subject, 5>;
100
+ /**
101
+ * @since 0.1.0
102
+ * @category Models
103
+ */
104
+ type FieldPattern = `${string}*${string}`;
105
+ /**
106
+ * @since 0.1.0
107
+ * @category Models
108
+ */
109
+ type FieldOf<Subject> = string & (FieldPath<Subject> | FieldPattern);
110
+ /**
111
+ * @since 0.1.0
112
+ * @category Models
113
+ */
114
+ type MongoCondition<Subject extends object> = MongoQuery<Subject> & Readonly<Record<string, unknown>>;
115
+ /**
116
+ * @since 0.1.0
117
+ * @category Models
118
+ */
119
+ type RuleKind = "Allow" | "Deny";
120
+ /**
121
+ * @since 0.1.0
122
+ * @category Models
123
+ */
124
+ type Predicate<Subject, E = never, R = never> = (subject: Subject) => boolean | Effect.Effect<boolean, E, R>;
125
+ /**
126
+ * @since 0.1.0
127
+ * @category Models
128
+ */
129
+ interface RuleOptions<Subject extends object, Fields extends string, E = never, R = never> {
130
+ readonly fields?: SingleOrReadonlyArray<Fields>;
131
+ readonly conditions?: MongoCondition<Subject>;
132
+ readonly when?: Predicate<Subject, E, R>;
133
+ readonly reason?: string;
134
+ }
135
+ /**
136
+ * @since 0.1.0
137
+ * @category Models
138
+ */
139
+ interface Rule<Kind extends RuleKind, Action extends string, Name extends string, Subject extends object, Fields extends string, E, R> extends Equal.Equal, Inspectable.Inspectable, Pipeable.Pipeable, Effect.Yieldable<Rule<Kind, Action, Name, Subject, Fields, E, R>, Rule<Kind, Action, Name, Subject, Fields, E, R>> {
140
+ readonly [RuleTypeId]: RuleTypeId;
141
+ readonly _tag: Kind;
142
+ readonly action: SingleOrReadonlyArray<Action>;
143
+ readonly subject: SingleOrReadonlyArray<Name>;
144
+ readonly fields?: ReadonlyArray<Fields>;
145
+ readonly conditions?: MongoCondition<Subject>;
146
+ readonly when?: Predicate<Subject, E, R>;
147
+ readonly reason?: string;
148
+ }
149
+ /**
150
+ * @since 0.1.0
151
+ * @category Models
152
+ */
153
+ type AnyRule = Rule<RuleKind, string, string, any, string, any, any>;
154
+ /**
155
+ * @since 0.1.0
156
+ * @category Models
157
+ */
158
+ interface TypedSubject<Name extends string, Value extends object> extends Equal.Equal, Inspectable.Inspectable, Pipeable.Pipeable {
159
+ readonly [SubjectTypeId]: SubjectTypeId;
160
+ readonly _tag: "Subject";
161
+ readonly subject: Name;
162
+ readonly value: Value;
163
+ }
164
+ /**
165
+ * @since 0.1.0
166
+ * @category Models
167
+ */
168
+ type DetectSubjectType<Subjects extends SubjectMap> = (value: object) => SubjectName<Subjects>;
169
+ /**
170
+ * @since 0.1.0
171
+ * @category Models
172
+ */
173
+ interface AbilityOptions<Subjects extends SubjectMap, Aliases extends ActionAliases = {}> {
174
+ readonly detectSubjectType?: DetectSubjectType<Subjects>;
175
+ readonly actionAliases?: Aliases;
176
+ }
177
+ /**
178
+ * @since 0.1.0
179
+ * @category Models
180
+ */
181
+ interface Ability<Subjects extends SubjectMap, Rules extends AnyRule = never, Aliases extends ActionAliases = {}> extends Equal.Equal, Inspectable.Inspectable, Pipeable.Pipeable {
182
+ readonly [TypeId]: TypeId;
183
+ readonly rules: ReadonlyArray<Rules>;
184
+ readonly options: AbilityOptions<Subjects, Aliases>;
185
+ readonly _Subjects?: (_: never) => Subjects;
186
+ readonly _Rules?: (_: never) => Rules;
187
+ readonly _Aliases?: (_: never) => Aliases;
188
+ }
189
+ type ElementOf<A> = A extends ReadonlyArray<infer B> ? B : A;
190
+ type SubjectFor<Subjects extends SubjectMap, Name> = Name extends AnySubject ? SubjectUnion<Subjects> : Name extends SubjectName<Subjects> ? Subjects[Name] : never;
191
+ type PreviousAliasDepth = [never, 0, 1, 2, 3, 4, 5];
192
+ /**
193
+ * Expands an action through configured aliases. The recursion depth is bounded
194
+ * to keep public type-checking predictable.
195
+ *
196
+ * @since 0.1.0
197
+ * @category Models
198
+ */
199
+ type ExpandedAction<Action extends string, Aliases extends ActionAliases, Depth extends number = 5> = Action | ([Depth] extends [0] ? never : Action extends keyof Aliases & string ? ExpandedAction<ElementOf<Aliases[Action]> & string, Aliases, PreviousAliasDepth[Depth]> : never);
200
+ /**
201
+ * @since 0.1.0
202
+ * @category Models
203
+ */
204
+ interface Builder<Subjects extends SubjectMap> {
205
+ readonly allow: <const Action extends SingleOrReadonlyArray<string>, const Name extends SingleOrReadonlyArray<RuleSubject<Subjects>>, const Fields extends FieldOf<SubjectFor<Subjects, ElementOf<Name>> & object> = FieldOf<SubjectFor<Subjects, ElementOf<Name>> & object>, E = never, R = never>(action: Action, subject: Name, options?: RuleOptions<SubjectFor<Subjects, ElementOf<Name>> & object, Fields, E, R>) => Rule<"Allow", ElementOf<Action> & string, ElementOf<Name> & string, SubjectFor<Subjects, ElementOf<Name>> & object, Fields, E, R>;
206
+ readonly deny: <const Action extends SingleOrReadonlyArray<string>, const Name extends SingleOrReadonlyArray<RuleSubject<Subjects>>, const Fields extends FieldOf<SubjectFor<Subjects, ElementOf<Name>> & object> = FieldOf<SubjectFor<Subjects, ElementOf<Name>> & object>, E = never, R = never>(action: Action, subject: Name, options?: RuleOptions<SubjectFor<Subjects, ElementOf<Name>> & object, Fields, E, R>) => Rule<"Deny", ElementOf<Action> & string, ElementOf<Name> & string, SubjectFor<Subjects, ElementOf<Name>> & object, Fields, E, R>;
207
+ }
208
+ /**
209
+ * @since 0.1.0
210
+ * @category Models
211
+ */
212
+ interface RawRule<Action extends string = string, Name extends string = string, Fields extends string = string, Conditions = unknown> {
213
+ readonly action: SingleOrReadonlyArray<Action>;
214
+ readonly subject: SingleOrReadonlyArray<Name>;
215
+ readonly fields?: SingleOrReadonlyArray<Fields>;
216
+ readonly conditions?: Conditions;
217
+ readonly inverted?: boolean;
218
+ readonly reason?: string;
219
+ }
220
+ type RuleAction<Rules> = Rules extends Rule<infer _Kind, infer Action, infer _Name, infer _Subject, infer _Fields, infer _E, infer _R> ? Action : never;
221
+ type RuleSubjectName<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer Name, infer _Subject, infer _Fields, infer _E, infer _R> ? Name : never;
222
+ type RuleFields<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer _Name, infer _Subject, infer Fields, infer _E, infer _R> ? Fields : never;
223
+ type RuleError<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer _Name, infer _Subject, infer _Fields, infer E, infer _R> ? E : never;
224
+ type RuleServices<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer _Name, infer _Subject, infer _Fields, infer _E, infer R> ? R : never;
225
+ type ActionMatches<Rule, Action extends string, Aliases extends ActionAliases> = Rule extends AnyRule ? Action extends ExpandedAction<RuleAction<Rule> & string, Aliases> ? Rule : AnyAction extends RuleAction<Rule> ? Rule : never : never;
226
+ type SubjectMatches<Rule, Name extends string> = Rule extends AnyRule ? Name extends RuleSubjectName<Rule> ? Rule : AnySubject extends RuleSubjectName<Rule> ? Rule : never : never;
227
+ type RulesMatching<Rules, Action extends string, Name extends string, Aliases extends ActionAliases> = SubjectMatches<ActionMatches<Rules, Action, Aliases>, Name>;
228
+ type AllowedActions<Rules, Aliases extends ActionAliases> = AnyAction extends RuleAction<Rules> ? string : ExpandedAction<RuleAction<Rules> & string, Aliases>;
229
+ type AllowedSubjects<Subjects extends SubjectMap, Rules> = AnySubject extends RuleSubjectName<Rules> ? SubjectName<Subjects> : Extract<RuleSubjectName<Rules>, SubjectName<Subjects>>;
230
+ type FieldFor<Subjects extends SubjectMap, Rules, Aliases extends ActionAliases, Action extends string, Name extends SubjectName<Subjects>> = RuleFields<RulesMatching<Rules, Action, Name, Aliases>> extends infer Fields ? [Fields] extends [never] ? FieldOf<Subjects[Name]> : Extract<Fields, FieldPattern> extends never ? Fields & string : FieldOf<Subjects[Name]> : never;
231
+ type ExplicitCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = AllowedSubjects<Subjects, Rules> extends infer Name ? Name extends SubjectName<Subjects> ? AllowedActions<Rules, Aliases> extends infer Action ? Action extends string ? {
232
+ readonly action: Action;
233
+ readonly subject: Name;
234
+ readonly value?: Subjects[Name] | TypedSubject<Name, Subjects[Name]>;
235
+ readonly field?: FieldFor<Subjects, Rules, Aliases, Action, Name>;
236
+ } : never : never : never : never;
237
+ type TypedSubjectCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = AllowedSubjects<Subjects, Rules> extends infer Name ? Name extends SubjectName<Subjects> ? AllowedActions<Rules, Aliases> extends infer Action ? Action extends string ? {
238
+ readonly action: Action;
239
+ readonly subject?: never;
240
+ readonly value: TypedSubject<Name, Subjects[Name]>;
241
+ readonly field?: FieldFor<Subjects, Rules, Aliases, Action, Name>;
242
+ } : never : never : never : never;
243
+ type DetectedSubjectCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = {
244
+ readonly action: AllowedActions<Rules, Aliases>;
245
+ readonly subject?: never;
246
+ readonly value: SubjectUnion<Subjects>;
247
+ readonly field?: string;
248
+ };
249
+ /**
250
+ * @since 0.1.0
251
+ * @category Models
252
+ */
253
+ type CheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases = {}> = ExplicitCheckRequest<Subjects, Rules, Aliases> | TypedSubjectCheckRequest<Subjects, Rules, Aliases> | DetectedSubjectCheckRequest<Subjects, Rules, Aliases>;
254
+ /**
255
+ * @since 0.1.0
256
+ * @category Models
257
+ */
258
+ type RuleQueryRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases = {}> = CheckRequest<Subjects, Rules, Aliases>;
259
+ type ExplicitSubjectQueryRequest<Subjects extends SubjectMap, Rules extends AnyRule> = AllowedSubjects<Subjects, Rules> extends infer Name ? Name extends SubjectName<Subjects> ? {
260
+ readonly subject: Name;
261
+ readonly value?: Subjects[Name] | TypedSubject<Name, Subjects[Name]>;
262
+ } : never : never;
263
+ type TypedSubjectQueryRequest<Subjects extends SubjectMap, Rules extends AnyRule> = AllowedSubjects<Subjects, Rules> extends infer Name ? Name extends SubjectName<Subjects> ? {
264
+ readonly subject?: never;
265
+ readonly value: TypedSubject<Name, Subjects[Name]>;
266
+ } : never : never;
267
+ /**
268
+ * @since 0.1.0
269
+ * @category Models
270
+ */
271
+ type SubjectQueryRequest<Subjects extends SubjectMap, Rules extends AnyRule> = ExplicitSubjectQueryRequest<Subjects, Rules> | TypedSubjectQueryRequest<Subjects, Rules> | {
272
+ readonly subject?: never;
273
+ readonly value: SubjectUnion<Subjects>;
274
+ };
275
+ type RequestAction<Request> = Request extends {
276
+ readonly action: infer Action;
277
+ } ? Action & string : string;
278
+ type RequestSubject<Request> = Request extends {
279
+ readonly subject: infer Name;
280
+ } ? Name & string : Request extends {
281
+ readonly value: TypedSubject<infer Name, object>;
282
+ } ? Name & string : string;
283
+ type MatchingRules<Rules, Request, Aliases extends ActionAliases> = RulesMatching<Rules, RequestAction<Request>, RequestSubject<Request>, Aliases>;
284
+ /**
285
+ * @since 0.1.0
286
+ * @category Models
287
+ */
288
+ interface ToRawRulesOptions {
289
+ readonly strict?: boolean;
290
+ }
291
+ /**
292
+ * @since 0.1.0
293
+ * @category Models
294
+ */
295
+ interface PermittedFieldsOptions<Rules extends AnyRule> {
296
+ readonly fieldsFrom: (rule: Rules) => ReadonlyArray<string>;
297
+ }
298
+ /**
299
+ * @since 0.1.0
300
+ * @category Errors
301
+ */
302
+ declare const AuthorizationError: typeof AuthorizationError$1;
303
+ /**
304
+ * @since 0.1.0
305
+ * @category Errors
306
+ */
307
+ type AuthorizationError = AuthorizationError$1;
308
+ /**
309
+ * @since 0.1.0
310
+ * @category Errors
311
+ */
312
+ declare const ConditionError: typeof ConditionError$1;
313
+ /**
314
+ * @since 0.1.0
315
+ * @category Errors
316
+ */
317
+ type ConditionError = ConditionError$1;
318
+ /**
319
+ * @since 0.1.0
320
+ * @category Errors
321
+ */
322
+ declare const PredicateEvaluationError: typeof PredicateEvaluationError$1;
323
+ /**
324
+ * @since 0.1.0
325
+ * @category Errors
326
+ */
327
+ type PredicateEvaluationError = PredicateEvaluationError$1;
328
+ /**
329
+ * @since 0.1.0
330
+ * @category Errors
331
+ */
332
+ declare const SerializationError: typeof SerializationError$1;
333
+ /**
334
+ * @since 0.1.0
335
+ * @category Errors
336
+ */
337
+ type SerializationError = SerializationError$1;
338
+ /**
339
+ * @since 0.1.0
340
+ * @category Errors
341
+ */
342
+ declare const RawRuleError: typeof RawRuleError$1;
343
+ /**
344
+ * @since 0.1.0
345
+ * @category Errors
346
+ */
347
+ type RawRuleError = RawRuleError$1;
348
+ /**
349
+ * @since 0.1.0
350
+ * @category Errors
351
+ */
352
+ declare const SubjectDetectionError: typeof SubjectDetectionError$1;
353
+ /**
354
+ * @since 0.1.0
355
+ * @category Errors
356
+ */
357
+ type SubjectDetectionError = SubjectDetectionError$1;
358
+ /**
359
+ * @since 0.1.0
360
+ * @category Errors
361
+ */
362
+ declare const AliasError: typeof AliasError$1;
363
+ /**
364
+ * @since 0.1.0
365
+ * @category Errors
366
+ */
367
+ type AliasError = AliasError$1;
368
+ /**
369
+ * @since 0.1.0
370
+ * @category Errors
371
+ */
372
+ declare const QueryGenerationError: typeof QueryGenerationError$1;
373
+ /**
374
+ * @since 0.1.0
375
+ * @category Errors
376
+ */
377
+ type QueryGenerationError = QueryGenerationError$1;
378
+ /**
379
+ * Creates an action resolver for an alias map.
380
+ *
381
+ * @since 0.1.0
382
+ * @category Constructors
383
+ */
384
+ declare const createAliasResolver: <const Aliases extends ActionAliases>(aliases: Aliases) => ActionResolver;
385
+ /**
386
+ * Defines an immutable Ability from a generator-based rule program.
387
+ *
388
+ * @since 0.1.0
389
+ * @category Constructors
390
+ */
391
+ declare const define: <Subjects extends SubjectMap>() => <Eff extends AnyRule, A, const Aliases extends ActionAliases = {}>(body: (builder: Builder<Subjects>) => Generator<Eff, A, unknown>, options?: AbilityOptions<Subjects, Aliases>) => Ability<Subjects, Eff, Aliases>;
392
+ /**
393
+ * Constructs an Ability directly from rules.
394
+ *
395
+ * @since 0.1.0
396
+ * @category Constructors
397
+ */
398
+ declare const make: <Subjects extends SubjectMap, Rules extends AnyRule, const Aliases extends ActionAliases = {}>(rules: Iterable<Rules>, options?: AbilityOptions<Subjects, Aliases>) => Ability<Subjects, Rules, Aliases>;
399
+ /**
400
+ * Constructs an Ability from JSON-safe rules.
401
+ *
402
+ * @since 0.1.0
403
+ * @category Constructors
404
+ */
405
+ declare const fromRawRules: <Subjects extends SubjectMap, const Aliases extends ActionAliases = {}>(rules: Iterable<RawRule<string, RuleSubject<Subjects>, string, MongoCondition<SubjectUnion<Subjects>>>>, options?: AbilityOptions<Subjects, Aliases>) => Effect.Effect<Ability<Subjects, AnyRule, Aliases>, AliasError | RawRuleError>;
406
+ /**
407
+ * Creates a pure typed subject wrapper without mutating the wrapped value.
408
+ *
409
+ * @since 0.1.0
410
+ * @category Constructors
411
+ */
412
+ declare const subject: <const Name extends string, Value extends object>(name: Name, value: Value) => TypedSubject<Name, Value>;
413
+ /**
414
+ * Returns whether a value is an Ability.
415
+ *
416
+ * @since 0.1.0
417
+ * @category Guards
418
+ */
419
+ declare const isAbility: (value: unknown) => value is Ability<SubjectMap, AnyRule, ActionAliases>;
420
+ /**
421
+ * Returns whether a value is a rule.
422
+ *
423
+ * @since 0.1.0
424
+ * @category Guards
425
+ */
426
+ declare const isRule: (value: unknown) => value is AnyRule;
427
+ /**
428
+ * Returns whether a value is a typed subject wrapper.
429
+ *
430
+ * @since 0.1.0
431
+ * @category Guards
432
+ */
433
+ declare const isSubject: (value: unknown) => value is TypedSubject<string, object>;
434
+ /**
435
+ * Unwraps a typed subject wrapper.
436
+ *
437
+ * @since 0.1.0
438
+ * @category Accessors
439
+ */
440
+ declare const unwrapSubject: <Value>(value: Value) => Value extends TypedSubject<infer _Name, infer Subject> ? Subject : Value;
441
+ /**
442
+ * Detects a subject name for a value using an Ability's detection strategy.
443
+ *
444
+ * @since 0.1.0
445
+ * @category Accessors
446
+ */
447
+ declare const detectSubjectType: <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases>, value: object | TypedSubject<SubjectName<Subjects>, SubjectUnion<Subjects>>) => Effect.Effect<SubjectName<Subjects>, SubjectDetectionError>;
448
+ /**
449
+ * Converts an Ability to JSON-safe raw rules.
450
+ *
451
+ * @since 0.1.0
452
+ * @category Conversions
453
+ */
454
+ declare const toRawRules: <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases>, options?: ToRawRulesOptions) => Effect.Effect<ReadonlyArray<RawRule>, SerializationError>;
455
+ /**
456
+ * Returns rules that may apply for a request before field, condition and predicate checks.
457
+ *
458
+ * @since 0.1.0
459
+ * @category Accessors
460
+ */
461
+ declare const possibleRulesFor: {
462
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(request: Request): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<ReadonlyArray<MatchingRules<Rules, Request, Aliases>>, SubjectDetectionError>;
463
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(self: Ability<Subjects, Rules, Aliases>, request: Request): Effect.Effect<ReadonlyArray<MatchingRules<Rules, Request, Aliases>>, SubjectDetectionError>;
464
+ };
465
+ /**
466
+ * Returns rules that may apply for a request after field checks.
467
+ *
468
+ * @since 0.1.0
469
+ * @category Accessors
470
+ */
471
+ declare const rulesFor: {
472
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(request: Request): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<ReadonlyArray<MatchingRules<Rules, Request, Aliases>>, SubjectDetectionError>;
473
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(self: Ability<Subjects, Rules, Aliases>, request: Request): Effect.Effect<ReadonlyArray<MatchingRules<Rules, Request, Aliases>>, SubjectDetectionError>;
474
+ };
475
+ /**
476
+ * Returns the first matching rule for a request, if any.
477
+ *
478
+ * @since 0.1.0
479
+ * @category Accessors
480
+ */
481
+ declare const relevantRuleFor: {
482
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(request: Request): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<MatchingRules<Rules, Request, Aliases> | undefined, ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
483
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>>(self: Ability<Subjects, Rules, Aliases>, request: Request): Effect.Effect<MatchingRules<Rules, Request, Aliases> | undefined, ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
484
+ };
485
+ /**
486
+ * Returns actions that have rules for a subject.
487
+ *
488
+ * @since 0.1.0
489
+ * @category Accessors
490
+ */
491
+ declare const actionsFor: {
492
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends SubjectQueryRequest<Subjects, Rules>>(request: Request): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<ReadonlyArray<AllowedActions<Rules, Aliases>>, SubjectDetectionError>;
493
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends SubjectQueryRequest<Subjects, Rules>>(self: Ability<Subjects, Rules, Aliases>, request: Request): Effect.Effect<ReadonlyArray<AllowedActions<Rules, Aliases>>, SubjectDetectionError>;
494
+ };
495
+ /**
496
+ * Checks a request and fails with `AuthorizationError` when the request is not authorized.
497
+ *
498
+ * @since 0.1.0
499
+ * @category Combinators
500
+ */
501
+ declare const check: {
502
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends CheckRequest<Subjects, Rules, Aliases>>(request: Request): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<void, AuthorizationError | ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
503
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends CheckRequest<Subjects, Rules, Aliases>>(self: Ability<Subjects, Rules, Aliases>, request: Request): Effect.Effect<void, AuthorizationError | ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
504
+ };
505
+ /**
506
+ * Computes fields permitted for a request.
507
+ *
508
+ * @since 0.1.0
509
+ * @category Combinators
510
+ */
511
+ declare const permittedFields: {
512
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends CheckRequest<Subjects, Rules, Aliases>>(request: Request, options: PermittedFieldsOptions<Rules>): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<ReadonlyArray<string>, ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
513
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends CheckRequest<Subjects, Rules, Aliases>>(self: Ability<Subjects, Rules, Aliases>, request: Request, options: PermittedFieldsOptions<Rules>): Effect.Effect<ReadonlyArray<string>, ConditionError | PredicateEvaluationError | SubjectDetectionError | RuleError<MatchingRules<Rules, Request, Aliases>>, RuleServices<MatchingRules<Rules, Request, Aliases>>>;
514
+ };
515
+ //#endregion
516
+ export { Ability, AbilityOptions, Ability_d_exports, ActionAliases, ActionResolver, AliasError, AnyAction, AnyRule, AnySubject, AuthorizationError, Builder, CheckRequest, ConditionError, DetectSubjectType, ExpandedAction, FieldOf, FieldPath, FieldPattern, MongoCondition, PermittedFieldsOptions, Predicate, PredicateEvaluationError, QueryGenerationError, RawRule, RawRuleError, Rule, RuleKind, RuleOptions, RuleQueryRequest, RuleSubject, RuleTypeId, SerializationError, SingleOrReadonlyArray, SubjectDetectionError, SubjectMap, SubjectName, SubjectQueryRequest, SubjectTypeId, SubjectUnion, ToRawRulesOptions, TypeId, TypedSubject, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject };