@nmnmcc/ability 0.1.0 → 0.2.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.
package/dist/Ability.d.ts CHANGED
@@ -1,5 +1,5 @@
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";
1
+ import { AliasError as AliasError$1, AuthorizationError as AuthorizationError$1, ConditionError as ConditionError$1, QueryGenerationError as QueryGenerationError$1, RawRuleError as RawRuleError$1, RuleTypeId as RuleTypeId$1, SubjectDetectionError as SubjectDetectionError$1, SubjectTypeId as SubjectTypeId$1, TypeId as TypeId$1 } from "./internal/ability.js";
2
+ import { MongoQuery } from "@casl/ability";
3
3
  import * as Effect from "effect/Effect";
4
4
  import * as Equal from "effect/Equal";
5
5
  import * as Inspectable from "effect/Inspectable";
@@ -7,7 +7,7 @@ import * as Pipeable from "effect/Pipeable";
7
7
 
8
8
  //#region src/Ability.d.ts
9
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 };
10
+ export { Ability, AbilityOptions, ActionAliases, ActionResolver, AliasError, AnyAction, AnyRule, AnySubject, AuthorizationError, Builder, CheckRequest, ConditionError, DetectSubjectType, ExpandedAction, FieldOf, FieldPath, FieldPattern, MongoCondition, PermittedFieldsOptions, QueryGenerationError, RawRule, RawRuleError, Rule, RuleKind, RuleOptions, RuleQueryRequest, RuleSubject, RuleTypeId, SingleOrReadonlyArray, SubjectDetectionError, SubjectMap, SubjectName, SubjectQueryRequest, SubjectTypeId, SubjectUnion, TypeId, TypedSubject, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject, update };
11
11
  }
12
12
  /**
13
13
  * @since 0.1.0
@@ -107,11 +107,7 @@ type FieldPattern = `${string}*${string}`;
107
107
  * @category Models
108
108
  */
109
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>>;
110
+ type MongoCondition<Subject extends object> = MongoQuery<Subject>;
115
111
  /**
116
112
  * @since 0.1.0
117
113
  * @category Models
@@ -121,36 +117,29 @@ type RuleKind = "Allow" | "Deny";
121
117
  * @since 0.1.0
122
118
  * @category Models
123
119
  */
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> {
120
+ interface RuleOptions<Subject extends object, Fields extends string> {
130
121
  readonly fields?: SingleOrReadonlyArray<Fields>;
131
122
  readonly conditions?: MongoCondition<Subject>;
132
- readonly when?: Predicate<Subject, E, R>;
133
123
  readonly reason?: string;
134
124
  }
135
125
  /**
136
126
  * @since 0.1.0
137
127
  * @category Models
138
128
  */
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>> {
129
+ interface Rule<Kind extends RuleKind, Action extends string, Name extends string, Subject extends object, Fields extends string> extends Equal.Equal, Inspectable.Inspectable, Pipeable.Pipeable, Effect.Yieldable<Rule<Kind, Action, Name, Subject, Fields>, Rule<Kind, Action, Name, Subject, Fields>> {
140
130
  readonly [RuleTypeId]: RuleTypeId;
141
131
  readonly _tag: Kind;
142
132
  readonly action: SingleOrReadonlyArray<Action>;
143
133
  readonly subject: SingleOrReadonlyArray<Name>;
144
134
  readonly fields?: ReadonlyArray<Fields>;
145
135
  readonly conditions?: MongoCondition<Subject>;
146
- readonly when?: Predicate<Subject, E, R>;
147
136
  readonly reason?: string;
148
137
  }
149
138
  /**
150
139
  * @since 0.1.0
151
140
  * @category Models
152
141
  */
153
- type AnyRule = Rule<RuleKind, string, string, any, string, any, any>;
142
+ type AnyRule = Rule<RuleKind, string, string, any, string>;
154
143
  /**
155
144
  * @since 0.1.0
156
145
  * @category Models
@@ -202,8 +191,8 @@ type ExpandedAction<Action extends string, Aliases extends ActionAliases, Depth
202
191
  * @category Models
203
192
  */
204
193
  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>;
194
+ 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>>(action: Action, subject: Name, options?: RuleOptions<SubjectFor<Subjects, ElementOf<Name>> & object, Fields>) => Rule<"Allow", ElementOf<Action> & string, ElementOf<Name> & string, SubjectFor<Subjects, ElementOf<Name>> & object, Fields>;
195
+ 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>>(action: Action, subject: Name, options?: RuleOptions<SubjectFor<Subjects, ElementOf<Name>> & object, Fields>) => Rule<"Deny", ElementOf<Action> & string, ElementOf<Name> & string, SubjectFor<Subjects, ElementOf<Name>> & object, Fields>;
207
196
  }
208
197
  /**
209
198
  * @since 0.1.0
@@ -217,35 +206,38 @@ interface RawRule<Action extends string = string, Name extends string = string,
217
206
  readonly inverted?: boolean;
218
207
  readonly reason?: string;
219
208
  }
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;
209
+ type RuleAction<Rules> = Rules extends Rule<infer _Kind, infer Action, infer _Name, infer _Subject, infer _Fields> ? Action : never;
210
+ type RuleSubjectName<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer Name, infer _Subject, infer _Fields> ? Name : never;
211
+ type RuleFields<Rules> = Rules extends Rule<infer _Kind, infer _Action, infer _Name, infer _Subject, infer Fields> ? Fields : never;
225
212
  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
213
  type SubjectMatches<Rule, Name extends string> = Rule extends AnyRule ? Name extends RuleSubjectName<Rule> ? Rule : AnySubject extends RuleSubjectName<Rule> ? Rule : never : never;
227
214
  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 ? {
215
+ type RuleAllowedActions<Rule, Aliases extends ActionAliases> = Rule extends AnyRule ? AnyAction extends RuleAction<Rule> ? string : ExpandedAction<RuleAction<Rule> & string, Aliases> : never;
216
+ type RuleAllowedSubjects<Subjects extends SubjectMap, Rule> = AnySubject extends RuleSubjectName<Rule> ? SubjectName<Subjects> : Extract<RuleSubjectName<Rule>, SubjectName<Subjects>>;
217
+ type AllowedActions<Rules, Aliases extends ActionAliases> = RuleAllowedActions<Rules, Aliases>;
218
+ type AllowedSubjects<Subjects extends SubjectMap, Rules> = RuleAllowedSubjects<Subjects, Rules>;
219
+ 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] ? never : string extends Fields & string ? FieldOf<Subjects[Name]> : Extract<Fields, FieldPattern> extends never ? Extract<Fields & string, FieldOf<Subjects[Name]>> : FieldOf<Subjects[Name]> : never;
220
+ type ExplicitRuleCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, Rule extends AnyRule> = RuleAllowedActions<Rule, Aliases> extends infer Action ? Action extends string ? RuleAllowedSubjects<Subjects, Rule> extends infer Name ? Name extends SubjectName<Subjects> ? {
232
221
  readonly action: Action;
233
222
  readonly subject: Name;
234
223
  readonly value?: Subjects[Name] | TypedSubject<Name, Subjects[Name]>;
235
224
  readonly field?: FieldFor<Subjects, Rules, Aliases, Action, Name>;
236
225
  } : 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 ? {
226
+ type ExplicitCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = Rules extends AnyRule ? ExplicitRuleCheckRequest<Subjects, Rules, Aliases, Rules> : never;
227
+ type TypedSubjectRuleCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, Rule extends AnyRule> = RuleAllowedActions<Rule, Aliases> extends infer Action ? Action extends string ? RuleAllowedSubjects<Subjects, Rule> extends infer Name ? Name extends SubjectName<Subjects> ? {
238
228
  readonly action: Action;
239
229
  readonly subject?: never;
240
230
  readonly value: TypedSubject<Name, Subjects[Name]>;
241
231
  readonly field?: FieldFor<Subjects, Rules, Aliases, Action, Name>;
242
232
  } : never : never : never : never;
243
- type DetectedSubjectCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = {
244
- readonly action: AllowedActions<Rules, Aliases>;
233
+ type TypedSubjectCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = Rules extends AnyRule ? TypedSubjectRuleCheckRequest<Subjects, Rules, Aliases, Rules> : never;
234
+ type DetectedSubjectRuleCheckRequest<Subjects extends SubjectMap, Aliases extends ActionAliases, Rule extends AnyRule> = RuleAllowedActions<Rule, Aliases> extends infer Action ? Action extends string ? RuleAllowedSubjects<Subjects, Rule> extends infer Name ? Name extends SubjectName<Subjects> ? {
235
+ readonly action: Action;
245
236
  readonly subject?: never;
246
- readonly value: SubjectUnion<Subjects>;
237
+ readonly value: Subjects[Name];
247
238
  readonly field?: string;
248
- };
239
+ } : never : never : never : never;
240
+ type DetectedSubjectCheckRequest<Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases> = Rules extends AnyRule ? DetectedSubjectRuleCheckRequest<Subjects, Aliases, Rules> : never;
249
241
  /**
250
242
  * @since 0.1.0
251
243
  * @category Models
@@ -281,13 +273,6 @@ type RequestSubject<Request> = Request extends {
281
273
  readonly value: TypedSubject<infer Name, object>;
282
274
  } ? Name & string : string;
283
275
  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
276
  /**
292
277
  * @since 0.1.0
293
278
  * @category Models
@@ -315,26 +300,6 @@ declare const ConditionError: typeof ConditionError$1;
315
300
  * @category Errors
316
301
  */
317
302
  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
303
  /**
339
304
  * @since 0.1.0
340
305
  * @category Errors
@@ -402,7 +367,17 @@ declare const make: <Subjects extends SubjectMap, Rules extends AnyRule, const A
402
367
  * @since 0.1.0
403
368
  * @category Constructors
404
369
  */
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>;
370
+ declare const fromRawRules: <Subjects extends SubjectMap, const Aliases extends ActionAliases = {}>(rules: Iterable<RawRule<string, RuleSubject<Subjects>, string, MongoCondition<any>>>, options?: AbilityOptions<Subjects, Aliases>) => Effect.Effect<Ability<Subjects, AnyRule, Aliases>, AliasError | RawRuleError>;
371
+ /**
372
+ * Returns a new Ability from raw rules using an existing Ability's options.
373
+ *
374
+ * @since 0.1.0
375
+ * @category Constructors
376
+ */
377
+ declare const update: {
378
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(rules: Iterable<RawRule<string, RuleSubject<Subjects>, string, MongoCondition<any>>>): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<Ability<Subjects, AnyRule, Aliases>, AliasError | RawRuleError>;
379
+ <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases>, rules: Iterable<RawRule<string, RuleSubject<Subjects>, string, MongoCondition<any>>>): Effect.Effect<Ability<Subjects, AnyRule, Aliases>, AliasError | RawRuleError>;
380
+ };
406
381
  /**
407
382
  * Creates a pure typed subject wrapper without mutating the wrapped value.
408
383
  *
@@ -451,9 +426,9 @@ declare const detectSubjectType: <Subjects extends SubjectMap, Rules extends Any
451
426
  * @since 0.1.0
452
427
  * @category Conversions
453
428
  */
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>;
429
+ declare const toRawRules: <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<ReadonlyArray<RawRule>>;
455
430
  /**
456
- * Returns rules that may apply for a request before field, condition and predicate checks.
431
+ * Returns rules that may apply for a request before field and condition checks.
457
432
  *
458
433
  * @since 0.1.0
459
434
  * @category Accessors
@@ -479,8 +454,8 @@ declare const rulesFor: {
479
454
  * @category Accessors
480
455
  */
481
456
  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>>>;
457
+ <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 | SubjectDetectionError>;
458
+ <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 | SubjectDetectionError>;
484
459
  };
485
460
  /**
486
461
  * Returns actions that have rules for a subject.
@@ -499,8 +474,8 @@ declare const actionsFor: {
499
474
  * @category Combinators
500
475
  */
501
476
  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>>>;
477
+ <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 | SubjectDetectionError>;
478
+ <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 | SubjectDetectionError>;
504
479
  };
505
480
  /**
506
481
  * Computes fields permitted for a request.
@@ -509,8 +484,8 @@ declare const check: {
509
484
  * @category Combinators
510
485
  */
511
486
  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>>>;
487
+ <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 | SubjectDetectionError>;
488
+ <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 | SubjectDetectionError>;
514
489
  };
515
490
  //#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 };
491
+ export { Ability, AbilityOptions, Ability_d_exports, ActionAliases, ActionResolver, AliasError, AnyAction, AnyRule, AnySubject, AuthorizationError, Builder, CheckRequest, ConditionError, DetectSubjectType, ExpandedAction, FieldOf, FieldPath, FieldPattern, MongoCondition, PermittedFieldsOptions, QueryGenerationError, RawRule, RawRuleError, Rule, RuleKind, RuleOptions, RuleQueryRequest, RuleSubject, RuleTypeId, SingleOrReadonlyArray, SubjectDetectionError, SubjectMap, SubjectName, SubjectQueryRequest, SubjectTypeId, SubjectUnion, TypeId, TypedSubject, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject, update };
package/dist/Ability.js CHANGED
@@ -1,15 +1,13 @@
1
1
  import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
- 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, actionsFor as actionsFor$1, check as check$1, createAliasResolver as createAliasResolver$1, define as define$1, detectSubjectType as detectSubjectType$1, fromRawRules as fromRawRules$1, isAbility as isAbility$1, isRule as isRule$1, isSubject as isSubject$1, make as make$1, permittedFields as permittedFields$1, possibleRulesFor as possibleRulesFor$1, relevantRuleFor as relevantRuleFor$1, rulesFor as rulesFor$1, subject as subject$1, toRawRules as toRawRules$1, unwrapSubject as unwrapSubject$1 } from "./internal/ability.js";
2
+ import { AliasError as AliasError$1, AuthorizationError as AuthorizationError$1, ConditionError as ConditionError$1, QueryGenerationError as QueryGenerationError$1, RawRuleError as RawRuleError$1, RuleTypeId as RuleTypeId$1, SubjectDetectionError as SubjectDetectionError$1, SubjectTypeId as SubjectTypeId$1, TypeId as TypeId$1, actionsFor as actionsFor$1, check as check$1, createAliasResolver as createAliasResolver$1, define as define$1, detectSubjectType as detectSubjectType$1, fromRawRules as fromRawRules$1, isAbility as isAbility$1, isRule as isRule$1, isSubject as isSubject$1, make as make$1, permittedFields as permittedFields$1, possibleRulesFor as possibleRulesFor$1, relevantRuleFor as relevantRuleFor$1, rulesFor as rulesFor$1, subject as subject$1, toRawRules as toRawRules$1, unwrapSubject as unwrapSubject$1, update as update$1 } from "./internal/ability.js";
3
3
  //#region src/Ability.ts
4
4
  var Ability_exports = /* @__PURE__ */ __exportAll({
5
5
  AliasError: () => AliasError,
6
6
  AuthorizationError: () => AuthorizationError,
7
7
  ConditionError: () => ConditionError,
8
- PredicateEvaluationError: () => PredicateEvaluationError,
9
8
  QueryGenerationError: () => QueryGenerationError,
10
9
  RawRuleError: () => RawRuleError,
11
10
  RuleTypeId: () => RuleTypeId,
12
- SerializationError: () => SerializationError,
13
11
  SubjectDetectionError: () => SubjectDetectionError,
14
12
  SubjectTypeId: () => SubjectTypeId,
15
13
  TypeId: () => TypeId,
@@ -29,7 +27,8 @@ var Ability_exports = /* @__PURE__ */ __exportAll({
29
27
  rulesFor: () => rulesFor,
30
28
  subject: () => subject,
31
29
  toRawRules: () => toRawRules,
32
- unwrapSubject: () => unwrapSubject
30
+ unwrapSubject: () => unwrapSubject,
31
+ update: () => update
33
32
  });
34
33
  /**
35
34
  * @since 0.1.0
@@ -62,16 +61,6 @@ const ConditionError = ConditionError$1;
62
61
  * @since 0.1.0
63
62
  * @category Errors
64
63
  */
65
- const PredicateEvaluationError = PredicateEvaluationError$1;
66
- /**
67
- * @since 0.1.0
68
- * @category Errors
69
- */
70
- const SerializationError = SerializationError$1;
71
- /**
72
- * @since 0.1.0
73
- * @category Errors
74
- */
75
64
  const RawRuleError = RawRuleError$1;
76
65
  /**
77
66
  * @since 0.1.0
@@ -117,6 +106,13 @@ const make = make$1;
117
106
  */
118
107
  const fromRawRules = fromRawRules$1;
119
108
  /**
109
+ * Returns a new Ability from raw rules using an existing Ability's options.
110
+ *
111
+ * @since 0.1.0
112
+ * @category Constructors
113
+ */
114
+ const update = update$1;
115
+ /**
120
116
  * Creates a pure typed subject wrapper without mutating the wrapped value.
121
117
  *
122
118
  * @since 0.1.0
@@ -166,7 +162,7 @@ const detectSubjectType = detectSubjectType$1;
166
162
  */
167
163
  const toRawRules = toRawRules$1;
168
164
  /**
169
- * Returns rules that may apply for a request before field, condition and predicate checks.
165
+ * Returns rules that may apply for a request before field and condition checks.
170
166
  *
171
167
  * @since 0.1.0
172
168
  * @category Accessors
@@ -208,4 +204,4 @@ const check = check$1;
208
204
  */
209
205
  const permittedFields = permittedFields$1;
210
206
  //#endregion
211
- export { Ability_exports, AliasError, AuthorizationError, ConditionError, PredicateEvaluationError, QueryGenerationError, RawRuleError, RuleTypeId, SerializationError, SubjectDetectionError, SubjectTypeId, TypeId, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject };
207
+ export { Ability_exports, AliasError, AuthorizationError, ConditionError, QueryGenerationError, RawRuleError, RuleTypeId, SubjectDetectionError, SubjectTypeId, TypeId, actionsFor, check, createAliasResolver, define, detectSubjectType, fromRawRules, isAbility, isRule, isSubject, make, permittedFields, possibleRulesFor, relevantRuleFor, rulesFor, subject, toRawRules, unwrapSubject, update };
@@ -52,7 +52,7 @@ declare const unpackRules: <Rule extends RawRule = RawRule>(rules: Iterable<Pack
52
52
  * @category Conversions
53
53
  */
54
54
  declare const rulesToFields: {
55
- <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<Readonly<Record<string, unknown>>, QueryGenerationError | SubjectDetectionError>;
55
+ <const Request>(request: Request): <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases> & (Request extends RuleQueryRequest<Subjects, Rules, Aliases> ? unknown : never)) => Effect.Effect<Readonly<Record<string, unknown>>, QueryGenerationError | SubjectDetectionError>;
56
56
  <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<Readonly<Record<string, unknown>>, QueryGenerationError | SubjectDetectionError>;
57
57
  };
58
58
  /**
@@ -62,7 +62,7 @@ declare const rulesToFields: {
62
62
  * @category Conversions
63
63
  */
64
64
  declare const rulesToCondition: {
65
- <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>, Query, E = never, R = never>(request: Request, convert: (rule: Rules) => Query | Effect.Effect<Query, E, R>, hooks: RulesToConditionHooks<Query>): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<Query | null, QueryGenerationError | SubjectDetectionError | E, R>;
65
+ <const Request, Query, E = never, R = never>(request: Request, convert: (rule: AnyRule) => Query | Effect.Effect<Query, E, R>, hooks: RulesToConditionHooks<Query>): <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases> & (Request extends RuleQueryRequest<Subjects, Rules, Aliases> ? unknown : never)) => Effect.Effect<Query | null, QueryGenerationError | SubjectDetectionError | E, R>;
66
66
  <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>, Query, E = never, R = never>(self: Ability<Subjects, Rules, Aliases>, request: Request, convert: (rule: Rules) => Query | Effect.Effect<Query, E, R>, hooks: RulesToConditionHooks<Query>): Effect.Effect<Query | null, QueryGenerationError | SubjectDetectionError | E, R>;
67
67
  };
68
68
  /**
@@ -72,7 +72,7 @@ declare const rulesToCondition: {
72
72
  * @category Conversions
73
73
  */
74
74
  declare const rulesToQuery: {
75
- <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>, Query, E = never, R = never>(request: Request, convert: (rule: Rules) => Query | Effect.Effect<Query, E, R>): (self: Ability<Subjects, Rules, Aliases>) => Effect.Effect<LogicalQuery<Query> | null, QueryGenerationError | SubjectDetectionError | E, R>;
75
+ <const Request, Query, E = never, R = never>(request: Request, convert: (rule: AnyRule) => Query | Effect.Effect<Query, E, R>): <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases>(self: Ability<Subjects, Rules, Aliases> & (Request extends RuleQueryRequest<Subjects, Rules, Aliases> ? unknown : never)) => Effect.Effect<LogicalQuery<Query> | null, QueryGenerationError | SubjectDetectionError | E, R>;
76
76
  <Subjects extends SubjectMap, Rules extends AnyRule, Aliases extends ActionAliases, const Request extends RuleQueryRequest<Subjects, Rules, Aliases>, Query, E = never, R = never>(self: Ability<Subjects, Rules, Aliases>, request: Request, convert: (rule: Rules) => Query | Effect.Effect<Query, E, R>): Effect.Effect<LogicalQuery<Query> | null, QueryGenerationError | SubjectDetectionError | E, R>;
77
77
  };
78
78
  //#endregion
@@ -19,8 +19,6 @@ import { dual } from "effect/Function";
19
19
  * or {@link rulesToQuery}.
20
20
  *
21
21
  * Gotchas:
22
- * - Query generation rejects function predicates because they cannot be
23
- * represented as static conditions.
24
22
  * - Conversion callbacks may be synchronous or Effectful; synchronous throws are
25
23
  * converted to `QueryGenerationError`.
26
24
  *
@@ -101,10 +99,6 @@ const queryGenerationError = (reason, ruleIndex, cause) => {
101
99
  if (cause !== void 0) error.cause = cause;
102
100
  return new QueryGenerationError(error);
103
101
  };
104
- const assertSerializableRule = (rule, ruleIndex) => {
105
- if (rule.when !== void 0) return Effect.fail(queryGenerationError("Cannot transform rules with function predicates", ruleIndex));
106
- return Effect.void;
107
- };
108
102
  /**
109
103
  * Extracts scalar condition values as default fields.
110
104
  *
@@ -116,7 +110,6 @@ const rulesToFields = dual(2, Effect.fnUntraced(function* (self, request) {
116
110
  const fields = {};
117
111
  let index = 0;
118
112
  for (const rule of rules) {
119
- yield* assertSerializableRule(rule, index);
120
113
  if (rule._tag === "Allow" && rule.conditions !== void 0) for (const key of Object.keys(rule.conditions)) {
121
114
  const value = rule.conditions[key];
122
115
  if (!isPlainObject(value)) setByPath(fields, key, value);
@@ -143,7 +136,6 @@ const rulesToConditionEffect = Effect.fnUntraced(function* (self, request, conve
143
136
  let index = 0;
144
137
  while (index < rules.length) {
145
138
  const rule = rules[index];
146
- yield* assertSerializableRule(rule, index);
147
139
  if (rule._tag === "Deny") {
148
140
  if (rule.conditions === void 0) break;
149
141
  const condition = yield* convertRule(rule, convert, index);
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
1
  import { Ability_d_exports } from "./Ability.js";
2
2
  import { AbilityExtra_d_exports } from "./AbilityExtra.js";
3
- import { AbilityRef_d_exports } from "./AbilityRef.js";
4
- export { Ability_d_exports as Ability, AbilityExtra_d_exports as AbilityExtra, AbilityRef_d_exports as AbilityRef };
3
+ export { Ability_d_exports as Ability, AbilityExtra_d_exports as AbilityExtra };
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  import { Ability_exports } from "./Ability.js";
2
2
  import { AbilityExtra_exports } from "./AbilityExtra.js";
3
- import { AbilityRef_exports } from "./AbilityRef.js";
4
- export { Ability_exports as Ability, AbilityExtra_exports as AbilityExtra, AbilityRef_exports as AbilityRef };
3
+ export { Ability_exports as Ability, AbilityExtra_exports as AbilityExtra };
@@ -40,30 +40,6 @@ declare class ConditionError extends ConditionError_base<{
40
40
  readonly field?: string;
41
41
  readonly cause: unknown;
42
42
  }> {}
43
- declare const PredicateEvaluationError_base: new <A extends Record<string, any> = {}>(args: _$effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => _$effect_Cause0.YieldableError & {
44
- readonly _tag: "PredicateEvaluationError";
45
- } & Readonly<A>;
46
- /**
47
- * @since 0.1.0
48
- * @category Errors
49
- */
50
- declare class PredicateEvaluationError extends PredicateEvaluationError_base<{
51
- readonly action: string;
52
- readonly subject: string;
53
- readonly field?: string;
54
- readonly cause: unknown;
55
- }> {}
56
- declare const SerializationError_base: new <A extends Record<string, any> = {}>(args: _$effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => _$effect_Cause0.YieldableError & {
57
- readonly _tag: "SerializationError";
58
- } & Readonly<A>;
59
- /**
60
- * @since 0.1.0
61
- * @category Errors
62
- */
63
- declare class SerializationError extends SerializationError_base<{
64
- readonly reason: string;
65
- readonly ruleIndex?: number;
66
- }> {}
67
43
  declare const RawRuleError_base: new <A extends Record<string, any> = {}>(args: _$effect_Types0.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => _$effect_Cause0.YieldableError & {
68
44
  readonly _tag: "RawRuleError";
69
45
  } & Readonly<A>;
@@ -111,4 +87,4 @@ declare class QueryGenerationError extends QueryGenerationError_base<{
111
87
  readonly cause?: unknown;
112
88
  }> {}
113
89
  //#endregion
114
- export { AliasError, AuthorizationError, ConditionError, PredicateEvaluationError, QueryGenerationError, RawRuleError, RuleTypeId, SerializationError, SubjectDetectionError, SubjectTypeId, TypeId };
90
+ export { AliasError, AuthorizationError, ConditionError, QueryGenerationError, RawRuleError, RuleTypeId, SubjectDetectionError, SubjectTypeId, TypeId };