feathers-utils 10.0.0 → 10.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.
Files changed (50) hide show
  1. package/dist/{hooks-DPFxxjBu.mjs → hooks-CzxNpt2c.mjs} +89 -77
  2. package/dist/hooks-CzxNpt2c.mjs.map +1 -0
  3. package/dist/hooks.d.mts +53 -24
  4. package/dist/hooks.mjs +4 -4
  5. package/dist/index.d.mts +2 -2
  6. package/dist/index.mjs +5 -5
  7. package/dist/{predicates-CT08opkD.mjs → predicates-C2SeOKGd.mjs} +16 -11
  8. package/dist/{predicates-CT08opkD.mjs.map → predicates-C2SeOKGd.mjs.map} +1 -1
  9. package/dist/predicates.d.mts +1 -1
  10. package/dist/predicates.mjs +1 -1
  11. package/dist/{resolve-Cx9osy8O.mjs → resolve-B81gQqXW.mjs} +2 -2
  12. package/dist/resolve-B81gQqXW.mjs.map +1 -0
  13. package/dist/resolvers.mjs +1 -1
  14. package/dist/{transform-result.hook-BUwLePT2.d.mts → transform-result.hook-C8-4Lezj.d.mts} +8 -5
  15. package/dist/{transform-result.hook-CevWK5TA.mjs → transform-result.hook-DifNj7zf.mjs} +12 -11
  16. package/dist/transform-result.hook-DifNj7zf.mjs.map +1 -0
  17. package/dist/transformers.d.mts +1 -1
  18. package/dist/transformers.mjs +1 -1
  19. package/dist/{unless.hook-BYWO9hzO.d.mts → unless.hook-CVD7SrZh.d.mts} +6 -3
  20. package/dist/{utils-1I_iPZkV.mjs → utils-ByzrJKGQ.mjs} +2 -2
  21. package/dist/{utils-1I_iPZkV.mjs.map → utils-ByzrJKGQ.mjs.map} +1 -1
  22. package/dist/utils.mjs +2 -2
  23. package/package.json +1 -1
  24. package/src/hooks/cache/cache.hook.ts +9 -7
  25. package/src/hooks/check-multi/check-multi.hook.ts +5 -2
  26. package/src/hooks/check-required/check-required.hook.ts +6 -1
  27. package/src/hooks/create-related/create-related.hook.ts +2 -2
  28. package/src/hooks/debug/debug.hook.ts +1 -1
  29. package/src/hooks/disable-pagination/disable-pagination.hook.ts +7 -4
  30. package/src/hooks/disallow/disallow.hook.ts +7 -2
  31. package/src/hooks/on-delete/on-delete.hook.ts +2 -2
  32. package/src/hooks/params-for-server/params-for-server.hook.ts +12 -5
  33. package/src/hooks/params-from-client/params-from-client.hook.ts +10 -6
  34. package/src/hooks/rate-limit/rate-limit.hook.ts +2 -2
  35. package/src/hooks/set-data/set-data.hook.ts +8 -7
  36. package/src/hooks/set-field/set-field.hook.ts +14 -11
  37. package/src/hooks/set-result/set-result.hook.ts +9 -3
  38. package/src/hooks/set-slug/set-slug.hook.ts +8 -6
  39. package/src/hooks/skippable/skippable.hook.ts +15 -12
  40. package/src/hooks/soft-delete/soft-delete.hook.ts +4 -5
  41. package/src/hooks/stashable/stashable.hook.ts +9 -8
  42. package/src/hooks/throw-if/throw-if.hook.ts +2 -2
  43. package/src/hooks/transform-data/transform-data.hook.ts +2 -4
  44. package/src/hooks/transform-query/transform-query.hook.ts +6 -5
  45. package/src/hooks/transform-result/transform-result.hook.ts +6 -9
  46. package/src/hooks/traverse/traverse.hook.ts +11 -10
  47. package/src/resolvers/resolve-result/resolve-result.ts +4 -1
  48. package/dist/hooks-DPFxxjBu.mjs.map +0 -1
  49. package/dist/resolve-Cx9osy8O.mjs.map +0 -1
  50. package/dist/transform-result.hook-CevWK5TA.mjs.map +0 -1
package/dist/hooks.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { A as Promisable, D as KeyOfOrDotNotation, O as MaybeArray, S as TransportName, _ as PredicateItemWithContext, d as HookFunction, g as PredicateFn, k as NeverFallback, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { d as InferFindParams, h as InferGetResult, i as InferCreateDataSingle } from "./infer-service-methods-D7zRVQeJ.mjs";
3
- import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BYWO9hzO.mjs";
4
- import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-BUwLePT2.mjs";
3
+ import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-CVD7SrZh.mjs";
4
+ import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-C8-4Lezj.mjs";
5
5
  import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-CA7-EaTw.mjs";
6
6
  import { FeathersError } from "@feathersjs/errors";
7
7
  import * as _$_feathersjs_feathers0 from "@feathersjs/feathers";
@@ -125,7 +125,7 @@ type CacheOptions = {
125
125
  *
126
126
  * @see https://utils.feathersjs.com/hooks/cache.html
127
127
  */
128
- declare const cache: <H extends HookContext = HookContext>(options: CacheOptions) => (context: H, next?: NextFunction) => Promise<HookContext<_$_feathersjs_feathers0.Application<any, any>, any> | undefined>;
128
+ declare const cache: <H extends HookContext = HookContext>(options: CacheOptions) => (context: H, next?: NextFunction) => Promise<void>;
129
129
  //#endregion
130
130
  //#region src/hooks/check-multi/check-multi.hook.d.ts
131
131
  type CheckMultiOptions = {
@@ -152,7 +152,10 @@ type CheckMultiOptions = {
152
152
  *
153
153
  * @see https://utils.feathersjs.com/hooks/check-multi.html
154
154
  */
155
- declare function checkMulti<H extends HookContext = HookContext>(options?: CheckMultiOptions): (context: H, next?: NextFunction) => Promise<any> | H;
155
+ declare function checkMulti<H extends HookContext = HookContext>(options?: CheckMultiOptions): {
156
+ (context: H): void;
157
+ (context: H, next: NextFunction): Promise<void>;
158
+ };
156
159
  //#endregion
157
160
  //#region src/hooks/check-required/check-required.hook.d.ts
158
161
  /**
@@ -171,7 +174,10 @@ declare function checkMulti<H extends HookContext = HookContext>(options?: Check
171
174
  *
172
175
  * @see https://utils.feathersjs.com/hooks/check-required.html
173
176
  */
174
- declare function checkRequired<H extends HookContext = HookContext>(fieldNames: MaybeArray<string>): (context: H, next?: NextFunction) => Promise<any> | undefined;
177
+ declare function checkRequired<H extends HookContext = HookContext>(fieldNames: MaybeArray<string>): {
178
+ (context: H): void;
179
+ (context: H, next: NextFunction): Promise<void>;
180
+ };
175
181
  //#endregion
176
182
  //#region src/hooks/create-related/create-related.hook.d.ts
177
183
  interface CreateRelatedOptions<H extends HookContext = HookContext, Services extends H['app']['services'] = H['app']['services'], S extends keyof Services = keyof Services> {
@@ -252,11 +258,10 @@ declare const debug: <H extends HookContext = HookContext>(msg: string, ...field
252
258
  *
253
259
  * @see https://utils.feathersjs.com/hooks/disable-pagination.html
254
260
  */
255
- declare const disablePagination: <H extends HookContext = HookContext>() => (context: H, next?: NextFunction) => Promise<any> | (H & {
256
- type: "around" | "before";
257
- } & {
258
- method: "find";
259
- });
261
+ declare const disablePagination: <H extends HookContext = HookContext>() => {
262
+ (context: H): void;
263
+ (context: H, next: NextFunction): Promise<void>;
264
+ };
260
265
  //#endregion
261
266
  //#region src/hooks/disallow/disallow.hook.d.ts
262
267
  /**
@@ -278,7 +283,10 @@ declare const disablePagination: <H extends HookContext = HookContext>() => (con
278
283
  *
279
284
  * @see https://utils.feathersjs.com/hooks/disallow.html
280
285
  */
281
- declare const disallow: <H extends HookContext = HookContext>(transports?: MaybeArray<TransportName>) => (context: H, next?: NextFunction) => Promise<H> | undefined;
286
+ declare const disallow: <H extends HookContext = HookContext>(transports?: MaybeArray<TransportName>) => {
287
+ (context: H): void;
288
+ (context: H, next: NextFunction): Promise<void>;
289
+ };
282
290
  //#endregion
283
291
  //#region src/hooks/on-delete/on-delete.hook.d.ts
284
292
  type OnDeleteAction = 'cascade' | 'set null';
@@ -359,7 +367,10 @@ type ParamsForServerOptions = {
359
367
  *
360
368
  * @see https://utils.feathersjs.com/hooks/params-for-server.html
361
369
  */
362
- declare const paramsForServer: (whitelist: MaybeArray<string>, options?: ParamsForServerOptions) => <H extends HookContext>(context: H, next?: NextFunction) => Promise<any> | H;
370
+ declare const paramsForServer: (whitelist: MaybeArray<string>, options?: ParamsForServerOptions) => {
371
+ <H extends HookContext>(context: H): void;
372
+ <H extends HookContext>(context: H, next: NextFunction): Promise<void>;
373
+ };
363
374
  //#endregion
364
375
  //#region src/hooks/params-from-client/params-from-client.hook.d.ts
365
376
  type paramsFromClientOptions = {
@@ -385,7 +396,10 @@ type paramsFromClientOptions = {
385
396
  *
386
397
  * @see https://utils.feathersjs.com/hooks/params-from-client.html
387
398
  */
388
- declare const paramsFromClient: (whitelist: MaybeArray<string>, options?: paramsFromClientOptions) => (context: HookContext, next?: NextFunction) => HookContext<_$_feathersjs_feathers0.Application<any, any>, any> | Promise<any>;
399
+ declare const paramsFromClient: (whitelist: MaybeArray<string>, options?: paramsFromClientOptions) => {
400
+ (context: HookContext): void;
401
+ (context: HookContext, next: NextFunction): Promise<void>;
402
+ };
389
403
  //#endregion
390
404
  //#region src/hooks/prevent-changes/prevent-changes.hook.d.ts
391
405
  type PreventChangesOptions<D, Keys extends KeyOfOrDotNotation<D>> = {
@@ -414,7 +428,7 @@ type PreventChangesOptions<D, Keys extends KeyOfOrDotNotation<D>> = {
414
428
  *
415
429
  * @see https://utils.feathersjs.com/hooks/prevent-changes.html
416
430
  */
417
- declare const preventChanges: <H extends HookContext = HookContext, D extends DataSingleHookContext<H> = DataSingleHookContext<H>, Keys extends KeyOfOrDotNotation<D> = KeyOfOrDotNotation<D>>(fieldNames: MaybeArray<Keys>, options?: PreventChangesOptions<D, Keys>) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
431
+ declare const preventChanges: <H extends HookContext = HookContext, D extends DataSingleHookContext<H> = DataSingleHookContext<H>, Keys extends KeyOfOrDotNotation<D> = KeyOfOrDotNotation<D>>(fieldNames: MaybeArray<Keys>, options?: PreventChangesOptions<D, Keys>) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
418
432
  //#endregion
419
433
  //#region src/hooks/rate-limit/rate-limit.hook.d.ts
420
434
  type RateLimitOptions<H extends HookContext = HookContext> = {
@@ -440,7 +454,7 @@ type RateLimitOptions<H extends HookContext = HookContext> = {
440
454
  *
441
455
  * @see https://utils.feathersjs.com/hooks/rate-limit.html
442
456
  */
443
- declare const rateLimit: <H extends HookContext = HookContext>(rateLimiter: RateLimiterAbstract, options?: RateLimitOptions<H>) => (context: H, next?: NextFunction) => Promise<any>;
457
+ declare const rateLimit: <H extends HookContext = HookContext>(rateLimiter: RateLimiterAbstract, options?: RateLimitOptions<H>) => (context: H, next?: NextFunction) => Promise<void>;
444
458
  //#endregion
445
459
  //#region src/hooks/set-data/set-data.hook.d.ts
446
460
  interface HookSetDataOptions {
@@ -496,7 +510,10 @@ from: PropertyPath,
496
510
  * @example 'userId'
497
511
  */
498
512
 
499
- to: PropertyPath, options?: HookSetDataOptions): (context: H, next?: NextFunction) => Promise<any> | H;
513
+ to: PropertyPath, options?: HookSetDataOptions): {
514
+ (context: H): void;
515
+ (context: H, next: NextFunction): Promise<void>;
516
+ };
500
517
  //#endregion
501
518
  //#region src/hooks/set-field/set-field.hook.d.ts
502
519
  interface SetFieldOptions {
@@ -539,7 +556,10 @@ declare const setField: <H extends HookContext = HookContext>({
539
556
  from,
540
557
  allowUndefined,
541
558
  error
542
- }: SetFieldOptions) => (context: H, next?: NextFunction) => Promise<any> | H;
559
+ }: SetFieldOptions) => {
560
+ (context: H): void;
561
+ (context: H, next: NextFunction): Promise<void>;
562
+ };
543
563
  //#endregion
544
564
  //#region src/hooks/set-result/set-result.hook.d.ts
545
565
  interface SetResultOptions {
@@ -596,7 +616,10 @@ from: PropertyPath,
596
616
  * @example 'userId'
597
617
  */
598
618
 
599
- to: PropertyPath, options?: SetResultOptions): (context: H, next?: NextFunction) => H | Promise<H>;
619
+ to: PropertyPath, options?: SetResultOptions): {
620
+ (context: H): void;
621
+ (context: H, next: NextFunction): Promise<void>;
622
+ };
600
623
  //#endregion
601
624
  //#region src/hooks/set-slug/set-slug.hook.d.ts
602
625
  /**
@@ -615,7 +638,10 @@ to: PropertyPath, options?: SetResultOptions): (context: H, next?: NextFunction)
615
638
  *
616
639
  * @see https://utils.feathersjs.com/hooks/set-slug.html
617
640
  */
618
- declare const setSlug: <H extends HookContext = HookContext>(slug: string, fieldName?: string) => (context: H, next?: NextFunction) => Promise<any> | H;
641
+ declare const setSlug: <H extends HookContext = HookContext>(slug: string, fieldName?: string) => {
642
+ (context: H): void;
643
+ (context: H, next: NextFunction): Promise<void>;
644
+ };
619
645
  //#endregion
620
646
  //#region src/hooks/soft-delete/soft-delete.hook.d.ts
621
647
  type SoftDeleteOptionFunction<H extends HookContext = HookContext> = (context?: H) => Promisable<{
@@ -669,7 +695,7 @@ interface SoftDeleteOptions<H extends HookContext = HookContext> {
669
695
  *
670
696
  * @see https://utils.feathersjs.com/hooks/soft-delete.html
671
697
  */
672
- declare const softDelete: <H extends HookContext = HookContext>(options: SoftDeleteOptions<H>) => (context: H, next?: NextFunction) => Promise<any>;
698
+ declare const softDelete: <H extends HookContext = HookContext>(options: SoftDeleteOptions<H>) => (context: H, next?: NextFunction) => Promise<void>;
673
699
  //#endregion
674
700
  //#region src/hooks/stashable/stashable.hook.d.ts
675
701
  type StashableOptions = {
@@ -697,8 +723,8 @@ type StashableOptions = {
697
723
  * @see https://utils.feathersjs.com/hooks/stashable.html
698
724
  */
699
725
  declare function stashable<H extends HookContext = HookContext>(options?: StashableOptions): {
726
+ (context: H): void;
700
727
  (context: H, next: NextFunction): Promise<void>;
701
- (context: H): H;
702
728
  };
703
729
  //#endregion
704
730
  //#region src/hooks/throw-if-is-multi/throw-if-is-multi.hook.d.ts
@@ -730,7 +756,7 @@ type ThrowIfIsMultiOptions = {
730
756
  *
731
757
  * @see https://utils.feathersjs.com/hooks/throw-if-is-multi.html
732
758
  */
733
- declare const throwIfIsMulti: <H extends HookContext = HookContext>(options?: ThrowIfIsMultiOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
759
+ declare const throwIfIsMulti: <H extends HookContext = HookContext>(options?: ThrowIfIsMultiOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
734
760
  //#endregion
735
761
  //#region src/hooks/throw-if-is-provider/throw-if-is-provider.hook.d.ts
736
762
  type ThrowIfIsIsProviderOptions = {
@@ -757,7 +783,7 @@ type ThrowIfIsIsProviderOptions = {
757
783
  *
758
784
  * @see https://utils.feathersjs.com/hooks/throw-if-is-provider.html
759
785
  */
760
- declare const throwIfIsProvider: <H extends HookContext = HookContext>(transports: TransportName | TransportName[], options?: ThrowIfIsIsProviderOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
786
+ declare const throwIfIsProvider: <H extends HookContext = HookContext>(transports: TransportName | TransportName[], options?: ThrowIfIsIsProviderOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
761
787
  //#endregion
762
788
  //#region src/hooks/traverse/traverse.hook.d.ts
763
789
  type TraverseOptions = {
@@ -785,7 +811,10 @@ type TraverseOptions = {
785
811
  declare const traverse: <H extends HookContext = HookContext>({
786
812
  transformer,
787
813
  getObject
788
- }: TraverseOptions) => (context: H, next?: NextFunction) => Promise<any> | H;
814
+ }: TraverseOptions) => {
815
+ (context: H): void;
816
+ (context: H, next: NextFunction): Promise<void>;
817
+ };
789
818
  //#endregion
790
819
  export { CacheEvent, CacheOptions, CheckMultiOptions, CreateRelatedOptions, HookSetDataOptions, IffHook, OnDeleteAction, OnDeleteOptions, ParamsForServerOptions, PreventChangesOptions, RateLimitOptions, SetFieldOptions, SetResultOptions, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, ThrowIfOptions, TransformResultOptions, TraverseOptions, cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, iff, iff as when, iffElse, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, preventChanges, rateLimit, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skippable, softDelete, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, transformData, transformQuery, transformResult, traverse, unless };
791
820
  //# sourceMappingURL=hooks.d.mts.map
package/dist/hooks.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as combine, a as iffElse, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-CT08opkD.mjs";
2
- import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-DPFxxjBu.mjs";
3
- import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-CevWK5TA.mjs";
4
- import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-Cx9osy8O.mjs";
1
+ import { _ as combine, a as iffElse, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-C2SeOKGd.mjs";
2
+ import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-CzxNpt2c.mjs";
3
+ import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-DifNj7zf.mjs";
4
+ import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-B81gQqXW.mjs";
5
5
  export { cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, iff, iff as when, iffElse, onDelete, paramsForServer, paramsFromClient, preventChanges, rateLimit, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skippable, softDelete, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, transformData, transformQuery, transformResult, traverse, unless };
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { C as hookTypes, S as TransportName, _ as PredicateItemWithContext, a as ContextFunction, b as TransformerFn, c as DefaultsInput, d as HookFunction, f as HookType, g as PredicateFn, h as PredicateContextSync, i as UnwrapPaginatedOrArray, l as DispatchOption, m as PredicateContextAsync, n as ResultSingleHookContext, o as ContextFunctionAsync, p as MethodName, r as UnwrapPaginated, s as ContextFunctionSync, t as DataSingleHookContext, u as FieldKey, v as StringFieldKey, w as methodNames, x as TransformerInputFn, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { C as InferResultFromPath, D as InferUpdateResultFromPath, E as InferUpdateResult, S as InferRemoveResultFromPath, T as InferUpdateDataFromPath, _ as InferPatchData, a as InferCreateDataSingleFromPath, b as InferPatchResultFromPath, c as InferCreateResultSingle, d as InferFindParams, f as InferFindResult, g as InferGetResultFromPath, h as InferGetResult, i as InferCreateDataSingle, l as InferCreateResultSingleFromPath, m as InferFindResultSingle, n as InferCreateData, o as InferCreateResult, p as InferFindResultFromPath, r as InferCreateDataFromPath, s as InferCreateResultFromPath, t as GetService, u as InferDataFromPath, v as InferPatchDataFromPath, w as InferUpdateData, x as InferRemoveResult, y as InferPatchResult } from "./infer-service-methods-D7zRVQeJ.mjs";
3
- import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BYWO9hzO.mjs";
4
- import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-BUwLePT2.mjs";
3
+ import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-CVD7SrZh.mjs";
4
+ import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-C8-4Lezj.mjs";
5
5
  import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-CA7-EaTw.mjs";
6
6
  import { CacheEvent, CacheOptions, CheckMultiOptions, CreateRelatedOptions, HookSetDataOptions, OnDeleteAction, OnDeleteOptions, ParamsForServerOptions, PreventChangesOptions, RateLimitOptions, SetFieldOptions, SetResultOptions, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, TraverseOptions, cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, preventChanges, rateLimit, setData, setField, setResult, setSlug, softDelete, stashable, throwIfIsMulti, throwIfIsProvider, traverse } from "./hooks.mjs";
7
7
  import { A as SkipHookName, C as contextToJson, O as addToQuery, S as defineHooks, T as checkContext, _ as getResultIsArray, a as WalkQueryOptions, b as GetDataIsArrayReturn, c as transformParams, d as PatchBatchOptions, f as PatchBatchResultItem, g as GetResultIsArrayReturn, h as GetResultIsArrayOptions, i as WalkQueryCallback, j as addSkip, k as chunkFind, l as toPaginated, m as iterateFind, n as ZipDataResultOptions, o as walkQuery, p as patchBatch, r as zipDataResult, s as sortQueryProperties, t as ZipDataResultItem, u as skipResult, v as getPaginate, w as CheckContextOptions, x as getDataIsArray, y as getExposedMethods } from "./index-CNrzxmWo.mjs";
package/dist/index.mjs CHANGED
@@ -1,9 +1,9 @@
1
- import { _ as combine, a as iffElse, f as getPaginate, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-CT08opkD.mjs";
2
- import { a as skipResult, c as getExposedMethods, d as checkContext, f as addToQuery, h as sortQueryProperties, i as toPaginated, l as defineHooks, m as addSkip, n as walkQuery, o as patchBatch, p as chunkFind, r as transformParams, s as iterateFind, t as zipDataResult, u as contextToJson } from "./utils-1I_iPZkV.mjs";
3
- import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-DPFxxjBu.mjs";
1
+ import { _ as combine, a as iffElse, f as getPaginate, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-C2SeOKGd.mjs";
2
+ import { a as skipResult, c as getExposedMethods, d as checkContext, f as addToQuery, h as sortQueryProperties, i as toPaginated, l as defineHooks, m as addSkip, n as walkQuery, o as patchBatch, p as chunkFind, r as transformParams, s as iterateFind, t as zipDataResult, u as contextToJson } from "./utils-ByzrJKGQ.mjs";
3
+ import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-CzxNpt2c.mjs";
4
4
  import { i as getDataIsArray, n as mutateData, r as getResultIsArray, t as mutateResult } from "./mutate-result.util-CCBWix-G.mjs";
5
- import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-CevWK5TA.mjs";
6
- import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-Cx9osy8O.mjs";
5
+ import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-DifNj7zf.mjs";
6
+ import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-B81gQqXW.mjs";
7
7
  //#region src/types.ts
8
8
  const hookTypes = [
9
9
  "around",
@@ -397,16 +397,21 @@ function unless(predicate, ...hooks) {
397
397
  *
398
398
  * @see https://utils.feathersjs.com/hooks/skippable.html
399
399
  */
400
- const skippable = (hook, predicate) => (context, next) => {
401
- const skip = predicate(context);
402
- function skipOrRun(skip) {
403
- if (skip) {
404
- if (next) return next();
405
- return context;
406
- } else return hook(context, next);
400
+ const skippable = (innerHook, predicate) => {
401
+ function hook(context, next) {
402
+ const skip = predicate(context);
403
+ const skipOrRun = (shouldSkip) => {
404
+ if (shouldSkip) {
405
+ if (next) return next();
406
+ return;
407
+ }
408
+ if (next) return innerHook(context, next);
409
+ innerHook(context);
410
+ };
411
+ if (!skip || typeof skip === "boolean") return skipOrRun(skip);
412
+ return skip.then(skipOrRun);
407
413
  }
408
- if (!skip || typeof skip === "boolean") return skipOrRun(skip);
409
- return skip.then(skipOrRun);
414
+ return hook;
410
415
  };
411
416
  //#endregion
412
417
  //#region src/hooks/throw-if/throw-if.hook.ts
@@ -429,10 +434,10 @@ const skippable = (hook, predicate) => (context, next) => {
429
434
  const throwIf = (predicate, options) => {
430
435
  return async (context, next) => {
431
436
  if (await predicate(context)) throw options?.error ? options.error(context) : new BadRequest("Invalid operation");
432
- if (next) return await next();
437
+ if (next) await next();
433
438
  };
434
439
  };
435
440
  //#endregion
436
441
  export { combine as _, iffElse as a, shouldSkip as c, isPaginated as d, getPaginate as f, every as g, and as h, iff as i, not as l, isContext as m, skippable as n, or as o, isMulti as p, unless as r, some as s, throwIf as t, isProvider as u };
437
442
 
438
- //# sourceMappingURL=predicates-CT08opkD.mjs.map
443
+ //# sourceMappingURL=predicates-C2SeOKGd.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"predicates-CT08opkD.mjs","names":[],"sources":["../src/utils/combine/combine.util.ts","../src/predicates/and/and.predicate.ts","../src/predicates/is-context/is-context.predicate.ts","../src/predicates/is-multi/is-multi.predicate.ts","../src/utils/get-paginate/get-paginate.util.ts","../src/predicates/is-paginated/is-paginated.predicate.ts","../src/predicates/is-provider/is-provider.predicate.ts","../src/predicates/not/not.predicate.ts","../src/predicates/should-skip/should-skip.predicate.ts","../src/predicates/or/or.predicate.ts","../src/hooks/iff-else/iff-else.hook.ts","../src/hooks/iff/iff.hook.ts","../src/hooks/unless/unless.hook.ts","../src/hooks/skippable/skippable.hook.ts","../src/hooks/throw-if/throw-if.hook.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { HookFunction } from '../../types.js'\n\n/**\n * Sequentially executes multiple hooks, passing the updated context from one to the next.\n * Returns a single hook function that runs the entire chain. If any hook throws,\n * the error is annotated with the current hook context.\n *\n * @example\n * ```ts\n * import { combine } from 'feathers-utils/hooks'\n *\n * const combinedHook = combine(hookA(), hookB(), hookC())\n * app.service('users').hooks({ before: { create: [combinedHook] } })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/combine.html\n */\nexport function combine<H extends HookContext = HookContext>(\n ...serviceHooks: HookFunction<H>[]\n) {\n const isContext = function (ctx: H) {\n return typeof ctx?.method === 'string' && typeof ctx?.type === 'string'\n }\n\n return async function (context: H) {\n let ctx = context\n\n const updateCurrentHook = (current: void | H) => {\n // Either use the returned hook object or the current\n // hook object from the chain if the hook returned undefined\n if (current) {\n if (!isContext(current)) {\n throw new Error(\n `${ctx.type} hook for '${ctx.method}' method returned invalid hook object`,\n )\n }\n\n ctx = current\n }\n\n return ctx\n }\n\n // Go through all hooks and chain them into our promise\n\n // @ts-expect-error TODO\n const promise = serviceHooks.reduce(async (current, fn) => {\n // @ts-expect-error TODO\n const hook = fn.bind(this)\n\n // Use the returned hook object or the old one\n\n const currentHook = await current\n const currentCtx = await hook(currentHook)\n return updateCurrentHook(currentCtx)\n }, Promise.resolve(ctx))\n\n try {\n await promise\n return ctx\n } catch (error: any) {\n // Add the hook information to any errors\n error.hook = ctx\n throw error\n }\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` only when **all** given predicates are `true` (logical AND).\n * Supports both sync and async predicates. Short-circuits on the first `false` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, and, isProvider, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(and(isProvider('external'), isMulti), checkMulti())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/and.html\n */\nexport const and = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // same as Array.prototype.every for empty arrays\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#description\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n if (result === false) {\n return false\n } else if (isPromise(result)) {\n promises.push(result)\n }\n }\n\n if (!promises.length) {\n return true\n }\n\n return Promise.all(promises).then((results) =>\n results.every((result) => !!result),\n )\n }\n}\n\n// Alias for 'every'\nexport const every = and\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\nexport type IsContextOptions<H extends HookContext = HookContext> = {\n path?: MaybeArray<H['path']>\n type?: MaybeArray<H['type']>\n method?: MaybeArray<H['method']>\n}\n\n/**\n * Returns a predicate that checks whether the hook context matches the given criteria.\n * You can filter by `path` (service name), `type` (before/after/around/error),\n * and/or `method` (find/get/create/update/patch/remove).\n *\n * @example\n * ```ts\n * import { iff, isContext } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isContext({ method: 'create', type: 'before' }), validateHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-context.html\n */\nexport const isContext = <H extends HookContext = HookContext>(\n options: IsContextOptions<H>,\n) => {\n const path = options.path != null ? toArray(options.path) : undefined\n const type = options.type != null ? toArray(options.type) : undefined\n const method = options.method != null ? toArray(options.method) : undefined\n\n return (context: any): boolean => {\n if (path && !path.some((x) => context.path.includes(x))) {\n return false\n }\n\n if (type && !type.some((x) => context.type === x)) {\n return false\n }\n\n if (method && !method.some((x) => context.method === x)) {\n return false\n }\n\n return true\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Checks if the current hook context represents a multi operation.\n * Returns `true` for `find`, for `create` with array data, and for `patch`/`remove`\n * with `id === null`. Returns `false` for `get` and `update`.\n *\n * @example\n * ```ts\n * import { iff, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isMulti, rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-multi.html\n */\nexport const isMulti = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n const { method } = context\n if (method === 'find') {\n return true\n } else if (method === 'patch' || method === 'remove') {\n return context.id == null\n } else if (method === 'create') {\n return Array.isArray(context.data)\n } else if (method === 'get' || method === 'update') {\n return false\n }\n\n return false\n}\n","import type { PaginationOptions } from '@feathersjs/adapter-commons'\nimport type { HookContext } from '@feathersjs/feathers'\nimport { hasOwnProperty } from '../../internal.utils.js'\n\n/**\n * Resolves the active pagination options for the current hook context.\n * Checks (in order): `context.params.paginate`, `service.options.paginate`,\n * and `context.params.adapter.paginate`. Returns `undefined` if pagination is disabled.\n *\n * @example\n * ```ts\n * import { getPaginate } from 'feathers-utils/utils'\n *\n * const paginate = getPaginate(context)\n * if (paginate) {\n * console.log('Max items:', paginate.max)\n * }\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-paginate.html\n */\nexport const getPaginate = <H extends HookContext = HookContext>(\n context: H,\n): PaginationOptions | undefined => {\n if (hasOwnProperty(context.params, 'paginate')) {\n return (context.params.paginate as PaginationOptions) || undefined\n }\n\n if (context.params.paginate === false) {\n return undefined\n }\n let options = context.service?.options || {}\n\n options = {\n ...options,\n ...context.params.adapter,\n }\n\n return options.paginate || undefined\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getPaginate } from '../../utils/get-paginate/get-paginate.util.js'\n\n/**\n * Checks if the current `find` operation is paginated by inspecting\n * `params.paginate` and the service's pagination options via `getPaginate`.\n * Returns `false` for all methods other than `find` or when pagination is disabled.\n *\n * @example\n * ```ts\n * import { iff, isPaginated } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * after: { find: [iff(isPaginated, addTotalCountHeader())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-paginated.html\n */\nexport const isPaginated = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n if (context.params.paginate === false || context.method !== 'find') {\n return false\n }\n\n const paginate = getPaginate(context)\n\n return !!paginate\n}\n","import { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { TransportName } from '../../types.js'\n\n/**\n * Returns a predicate that checks the transport provider of the service call.\n * Matches against `'rest'`, `'socketio'`, `'external'` (any external provider),\n * or `'server'` (internal call without a provider).\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isProvider('external'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-provider.html\n */\nexport function isProvider<H extends HookContext = HookContext>(\n ...providers: TransportName[]\n) {\n if (!providers.length) {\n throw new MethodNotAllowed('Calling isProvider predicate incorrectly.')\n }\n\n return (context: H): boolean => {\n const hookProvider = context.params.provider\n\n return providers.some(\n (provider) =>\n provider === hookProvider ||\n (provider === 'server' && !hookProvider) ||\n (provider === 'external' && !!hookProvider),\n )\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport type { PredicateFn } from '../../types.js'\n\n/**\n * Negates a sync or async predicate function, inverting its boolean result.\n * Useful for composing conditions like \"not external\" or \"not multi\".\n *\n * @example\n * ```ts\n * import { iff, not, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(not(isProvider('server')), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/not.html\n */\nexport const not =\n <H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n ): PredicateFn<H> =>\n (context: H) => {\n const result = predicate(context)\n\n if (!isPromise(result)) {\n return !result\n }\n\n return result.then((result1) => !result1)\n }\n","import { GeneralError } from '@feathersjs/errors'\n\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { SkipHookName } from '../../utils/index.js'\n\n/**\n * Returns a predicate that checks `params.skipHooks` to determine if a hook should be skipped.\n * Matches by hook name, hook type (e.g. `'before'`), prefixed name (e.g. `'before:myHook'`),\n * or `'all'` to skip everything. Designed to be used with `skippable` and `addSkip`.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(actualHook(), shouldSkip('myHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/should-skip.html\n */\nexport const shouldSkip = <H extends HookContext = HookContext>(\n hookName: SkipHookName,\n) => {\n return (context: H): boolean => {\n if (!context.params?.skipHooks) {\n return false\n }\n\n const { skipHooks } = context.params\n if (!Array.isArray(skipHooks)) {\n throw new GeneralError(\n 'The `skipHooks` param must be an Array of Strings',\n )\n }\n const { type } = context\n if (skipHooks.includes(hookName)) {\n return true\n } else if (skipHooks.includes('all')) {\n return true\n } else if (skipHooks.includes(type)) {\n return true\n } else if (skipHooks.includes(`${type}:${hookName}`)) {\n return true\n }\n\n return false\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` when **any** of the given predicates is `true` (logical OR).\n * Supports both sync and async predicates. Short-circuits on the first `true` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, or, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(or(isProvider('rest'), isProvider('socketio')), rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/or.html\n */\nexport const or = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // same as Array.prototype.some for empty arrays\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#description\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n\n if (result === true) {\n return true\n } else if (result === false) {\n continue\n } else if (isPromise(result)) {\n promises.push(result)\n }\n }\n\n if (!promises.length) {\n return false\n }\n\n return Promise.all(promises).then((results) =>\n results.some((result) => !!result),\n )\n }\n}\n\n// Alias for 'some'\nexport const some = or\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport { combine } from '../../utils/combine/combine.util.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Executes one array of hooks when the predicate is truthy, or another array when it is falsy.\n * The predicate can be a boolean or a sync/async function.\n * Unlike `iff`, both branches are provided upfront without chaining.\n *\n * @example\n * ```ts\n * import { iffElse, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iffElse(isProvider('external'), [hook1()], [hook2()])]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff-else.html\n */\nexport function iffElse<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n trueHook: HookFunction<H> | HookFunction<H>[] | undefined,\n falseHook?: HookFunction<H> | HookFunction<H>[] | undefined,\n) {\n // fnArgs is [context] for service & permission hooks, [data, connection, context] for event filters\n return function (this: any, ctx: H, next?: NextFunction) {\n const trueHooks = Array.isArray(trueHook)\n ? trueHook\n : typeof trueHook === 'function'\n ? [trueHook]\n : undefined\n\n const falseHooks = Array.isArray(falseHook)\n ? falseHook\n : typeof falseHook === 'function'\n ? [falseHook]\n : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const check =\n typeof predicate === 'function'\n ? predicate.apply(that, [ctx])\n : !!predicate\n\n if (!isPromise(check)) {\n return callHooks.call(\n that,\n ctx,\n (check ? trueHooks : falseHooks) as any,\n next,\n )\n }\n\n return check.then((check1: any) => {\n const hooks = check1 ? trueHooks : falseHooks\n return callHooks.call(that, ctx, hooks as any, next)\n })\n }\n}\n\nfunction callHooks<H extends HookContext = HookContext>(\n this: any,\n ctx: H,\n serviceHooks: HookFunction<H>[],\n next?: NextFunction,\n) {\n if (!serviceHooks) {\n if (next) return next()\n return ctx\n }\n\n const result = combine(...serviceHooks).call(this, ctx)\n\n if (!next) return result\n\n return Promise.resolve(result).then(() => next())\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\nexport interface IffHook<\n H extends HookContext = HookContext,\n> extends HookFunction<H> {\n else(...hooks: HookFunction<H>[]): HookFunction<H>\n}\n\n/**\n * Conditionally executes a series of hooks when the predicate is truthy.\n * The predicate can be a boolean value or a sync/async function.\n * Supports an `.else(...)` chain for the falsy branch. Also exported as `when`.\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iff(isProvider('external'), authenticate('jwt'))]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff.html\n */\nexport function iff<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n ...hooks: HookFunction<H>[]\n): IffHook<H> {\n if (hooks.length && Array.isArray(hooks[0])) {\n hooks = hooks[0]\n }\n\n const iffWithoutElse = function (context: H, next?: NextFunction) {\n return iffElse(predicate, hooks.slice())(context, next)\n }\n\n iffWithoutElse.else =\n (...falseHooks: any[]) =>\n (context: H, next?: NextFunction) =>\n iffElse(predicate, hooks.slice(), falseHooks.slice())(context, next)\n\n return iffWithoutElse as IffHook<H>\n}\n\nexport { iff as when }\n","import type { HookContext } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { PredicateFn, HookFunction } from '../../types.js'\n\n/**\n * Executes a series of hooks when the predicate is falsy --- the inverse of `iff`.\n * The predicate can be a boolean or a sync/async function.\n * Useful for applying hooks to all contexts except those matching a condition.\n *\n * @example\n * ```ts\n * import { unless, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [unless(isProvider('server'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/unless.html\n */\nexport function unless<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn,\n ...hooks: HookFunction<H>[]\n) {\n return iffElse(predicate, undefined, [...hooks])\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Wraps a hook so it can be conditionally skipped based on a predicate.\n * When the predicate returns `true`, the wrapped hook is skipped entirely.\n * Commonly used with `shouldSkip` and `addSkip` for runtime hook control.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(someHook(), shouldSkip('someHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/skippable.html\n */\nexport const skippable =\n <H extends HookContext = HookContext>(\n hook: HookFunction<H>,\n predicate: PredicateFn<H>,\n ) =>\n (context: H, next?: NextFunction) => {\n const skip = predicate(context)\n\n function skipOrRun(skip: boolean) {\n if (skip) {\n if (next) return next()\n return context\n } else {\n return hook(context, next)\n }\n }\n\n if (!skip || typeof skip === 'boolean') {\n return skipOrRun(skip)\n }\n\n return skip.then(skipOrRun)\n }\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { BadRequest } from '@feathersjs/errors'\nimport type { FeathersError } from '@feathersjs/errors'\n\nexport type ThrowIfOptions = {\n /**\n * Customize the error that is thrown if the predicate returns true.\n *\n * If not provided, throws a `BadRequest` error with 'Invalid operation'.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Throws a `BadRequest` error when the given predicate function returns `true`.\n * The predicate receives the hook context and can be async.\n * Useful for validating conditions before proceeding with a request.\n *\n * @example\n * ```ts\n * import { throwIf } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { remove: [throwIf((context) => context.id === context.params.user?.id)] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if.html\n */\nexport const throwIf = <H extends HookContext = HookContext>(\n predicate: PredicateFn,\n options?: ThrowIfOptions,\n) => {\n return async (context: H, next?: NextFunction) => {\n const result = await predicate(context)\n\n if (result) {\n throw options?.error\n ? options.error(context)\n : new BadRequest('Invalid operation')\n }\n\n if (next) {\n return await next()\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"predicates-C2SeOKGd.mjs","names":[],"sources":["../src/utils/combine/combine.util.ts","../src/predicates/and/and.predicate.ts","../src/predicates/is-context/is-context.predicate.ts","../src/predicates/is-multi/is-multi.predicate.ts","../src/utils/get-paginate/get-paginate.util.ts","../src/predicates/is-paginated/is-paginated.predicate.ts","../src/predicates/is-provider/is-provider.predicate.ts","../src/predicates/not/not.predicate.ts","../src/predicates/should-skip/should-skip.predicate.ts","../src/predicates/or/or.predicate.ts","../src/hooks/iff-else/iff-else.hook.ts","../src/hooks/iff/iff.hook.ts","../src/hooks/unless/unless.hook.ts","../src/hooks/skippable/skippable.hook.ts","../src/hooks/throw-if/throw-if.hook.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { HookFunction } from '../../types.js'\n\n/**\n * Sequentially executes multiple hooks, passing the updated context from one to the next.\n * Returns a single hook function that runs the entire chain. If any hook throws,\n * the error is annotated with the current hook context.\n *\n * @example\n * ```ts\n * import { combine } from 'feathers-utils/hooks'\n *\n * const combinedHook = combine(hookA(), hookB(), hookC())\n * app.service('users').hooks({ before: { create: [combinedHook] } })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/combine.html\n */\nexport function combine<H extends HookContext = HookContext>(\n ...serviceHooks: HookFunction<H>[]\n) {\n const isContext = function (ctx: H) {\n return typeof ctx?.method === 'string' && typeof ctx?.type === 'string'\n }\n\n return async function (context: H) {\n let ctx = context\n\n const updateCurrentHook = (current: void | H) => {\n // Either use the returned hook object or the current\n // hook object from the chain if the hook returned undefined\n if (current) {\n if (!isContext(current)) {\n throw new Error(\n `${ctx.type} hook for '${ctx.method}' method returned invalid hook object`,\n )\n }\n\n ctx = current\n }\n\n return ctx\n }\n\n // Go through all hooks and chain them into our promise\n\n // @ts-expect-error TODO\n const promise = serviceHooks.reduce(async (current, fn) => {\n // @ts-expect-error TODO\n const hook = fn.bind(this)\n\n // Use the returned hook object or the old one\n\n const currentHook = await current\n const currentCtx = await hook(currentHook)\n return updateCurrentHook(currentCtx)\n }, Promise.resolve(ctx))\n\n try {\n await promise\n return ctx\n } catch (error: any) {\n // Add the hook information to any errors\n error.hook = ctx\n throw error\n }\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` only when **all** given predicates are `true` (logical AND).\n * Supports both sync and async predicates. Short-circuits on the first `false` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, and, isProvider, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(and(isProvider('external'), isMulti), checkMulti())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/and.html\n */\nexport const and = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // same as Array.prototype.every for empty arrays\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every#description\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n if (result === false) {\n return false\n } else if (isPromise(result)) {\n promises.push(result)\n }\n }\n\n if (!promises.length) {\n return true\n }\n\n return Promise.all(promises).then((results) =>\n results.every((result) => !!result),\n )\n }\n}\n\n// Alias for 'every'\nexport const every = and\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\nexport type IsContextOptions<H extends HookContext = HookContext> = {\n path?: MaybeArray<H['path']>\n type?: MaybeArray<H['type']>\n method?: MaybeArray<H['method']>\n}\n\n/**\n * Returns a predicate that checks whether the hook context matches the given criteria.\n * You can filter by `path` (service name), `type` (before/after/around/error),\n * and/or `method` (find/get/create/update/patch/remove).\n *\n * @example\n * ```ts\n * import { iff, isContext } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isContext({ method: 'create', type: 'before' }), validateHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-context.html\n */\nexport const isContext = <H extends HookContext = HookContext>(\n options: IsContextOptions<H>,\n) => {\n const path = options.path != null ? toArray(options.path) : undefined\n const type = options.type != null ? toArray(options.type) : undefined\n const method = options.method != null ? toArray(options.method) : undefined\n\n return (context: any): boolean => {\n if (path && !path.some((x) => context.path.includes(x))) {\n return false\n }\n\n if (type && !type.some((x) => context.type === x)) {\n return false\n }\n\n if (method && !method.some((x) => context.method === x)) {\n return false\n }\n\n return true\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Checks if the current hook context represents a multi operation.\n * Returns `true` for `find`, for `create` with array data, and for `patch`/`remove`\n * with `id === null`. Returns `false` for `get` and `update`.\n *\n * @example\n * ```ts\n * import { iff, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isMulti, rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-multi.html\n */\nexport const isMulti = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n const { method } = context\n if (method === 'find') {\n return true\n } else if (method === 'patch' || method === 'remove') {\n return context.id == null\n } else if (method === 'create') {\n return Array.isArray(context.data)\n } else if (method === 'get' || method === 'update') {\n return false\n }\n\n return false\n}\n","import type { PaginationOptions } from '@feathersjs/adapter-commons'\nimport type { HookContext } from '@feathersjs/feathers'\nimport { hasOwnProperty } from '../../internal.utils.js'\n\n/**\n * Resolves the active pagination options for the current hook context.\n * Checks (in order): `context.params.paginate`, `service.options.paginate`,\n * and `context.params.adapter.paginate`. Returns `undefined` if pagination is disabled.\n *\n * @example\n * ```ts\n * import { getPaginate } from 'feathers-utils/utils'\n *\n * const paginate = getPaginate(context)\n * if (paginate) {\n * console.log('Max items:', paginate.max)\n * }\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-paginate.html\n */\nexport const getPaginate = <H extends HookContext = HookContext>(\n context: H,\n): PaginationOptions | undefined => {\n if (hasOwnProperty(context.params, 'paginate')) {\n return (context.params.paginate as PaginationOptions) || undefined\n }\n\n if (context.params.paginate === false) {\n return undefined\n }\n let options = context.service?.options || {}\n\n options = {\n ...options,\n ...context.params.adapter,\n }\n\n return options.paginate || undefined\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getPaginate } from '../../utils/get-paginate/get-paginate.util.js'\n\n/**\n * Checks if the current `find` operation is paginated by inspecting\n * `params.paginate` and the service's pagination options via `getPaginate`.\n * Returns `false` for all methods other than `find` or when pagination is disabled.\n *\n * @example\n * ```ts\n * import { iff, isPaginated } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * after: { find: [iff(isPaginated, addTotalCountHeader())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-paginated.html\n */\nexport const isPaginated = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n if (context.params.paginate === false || context.method !== 'find') {\n return false\n }\n\n const paginate = getPaginate(context)\n\n return !!paginate\n}\n","import { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { TransportName } from '../../types.js'\n\n/**\n * Returns a predicate that checks the transport provider of the service call.\n * Matches against `'rest'`, `'socketio'`, `'external'` (any external provider),\n * or `'server'` (internal call without a provider).\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isProvider('external'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-provider.html\n */\nexport function isProvider<H extends HookContext = HookContext>(\n ...providers: TransportName[]\n) {\n if (!providers.length) {\n throw new MethodNotAllowed('Calling isProvider predicate incorrectly.')\n }\n\n return (context: H): boolean => {\n const hookProvider = context.params.provider\n\n return providers.some(\n (provider) =>\n provider === hookProvider ||\n (provider === 'server' && !hookProvider) ||\n (provider === 'external' && !!hookProvider),\n )\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport type { PredicateFn } from '../../types.js'\n\n/**\n * Negates a sync or async predicate function, inverting its boolean result.\n * Useful for composing conditions like \"not external\" or \"not multi\".\n *\n * @example\n * ```ts\n * import { iff, not, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(not(isProvider('server')), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/not.html\n */\nexport const not =\n <H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n ): PredicateFn<H> =>\n (context: H) => {\n const result = predicate(context)\n\n if (!isPromise(result)) {\n return !result\n }\n\n return result.then((result1) => !result1)\n }\n","import { GeneralError } from '@feathersjs/errors'\n\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { SkipHookName } from '../../utils/index.js'\n\n/**\n * Returns a predicate that checks `params.skipHooks` to determine if a hook should be skipped.\n * Matches by hook name, hook type (e.g. `'before'`), prefixed name (e.g. `'before:myHook'`),\n * or `'all'` to skip everything. Designed to be used with `skippable` and `addSkip`.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(actualHook(), shouldSkip('myHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/should-skip.html\n */\nexport const shouldSkip = <H extends HookContext = HookContext>(\n hookName: SkipHookName,\n) => {\n return (context: H): boolean => {\n if (!context.params?.skipHooks) {\n return false\n }\n\n const { skipHooks } = context.params\n if (!Array.isArray(skipHooks)) {\n throw new GeneralError(\n 'The `skipHooks` param must be an Array of Strings',\n )\n }\n const { type } = context\n if (skipHooks.includes(hookName)) {\n return true\n } else if (skipHooks.includes('all')) {\n return true\n } else if (skipHooks.includes(type)) {\n return true\n } else if (skipHooks.includes(`${type}:${hookName}`)) {\n return true\n }\n\n return false\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` when **any** of the given predicates is `true` (logical OR).\n * Supports both sync and async predicates. Short-circuits on the first `true` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, or, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(or(isProvider('rest'), isProvider('socketio')), rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/or.html\n */\nexport const or = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // same as Array.prototype.some for empty arrays\n // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#description\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n\n if (result === true) {\n return true\n } else if (result === false) {\n continue\n } else if (isPromise(result)) {\n promises.push(result)\n }\n }\n\n if (!promises.length) {\n return false\n }\n\n return Promise.all(promises).then((results) =>\n results.some((result) => !!result),\n )\n }\n}\n\n// Alias for 'some'\nexport const some = or\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport { combine } from '../../utils/combine/combine.util.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Executes one array of hooks when the predicate is truthy, or another array when it is falsy.\n * The predicate can be a boolean or a sync/async function.\n * Unlike `iff`, both branches are provided upfront without chaining.\n *\n * @example\n * ```ts\n * import { iffElse, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iffElse(isProvider('external'), [hook1()], [hook2()])]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff-else.html\n */\nexport function iffElse<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n trueHook: HookFunction<H> | HookFunction<H>[] | undefined,\n falseHook?: HookFunction<H> | HookFunction<H>[] | undefined,\n) {\n // fnArgs is [context] for service & permission hooks, [data, connection, context] for event filters\n return function (this: any, ctx: H, next?: NextFunction) {\n const trueHooks = Array.isArray(trueHook)\n ? trueHook\n : typeof trueHook === 'function'\n ? [trueHook]\n : undefined\n\n const falseHooks = Array.isArray(falseHook)\n ? falseHook\n : typeof falseHook === 'function'\n ? [falseHook]\n : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const check =\n typeof predicate === 'function'\n ? predicate.apply(that, [ctx])\n : !!predicate\n\n if (!isPromise(check)) {\n return callHooks.call(\n that,\n ctx,\n (check ? trueHooks : falseHooks) as any,\n next,\n )\n }\n\n return check.then((check1: any) => {\n const hooks = check1 ? trueHooks : falseHooks\n return callHooks.call(that, ctx, hooks as any, next)\n })\n }\n}\n\nfunction callHooks<H extends HookContext = HookContext>(\n this: any,\n ctx: H,\n serviceHooks: HookFunction<H>[],\n next?: NextFunction,\n) {\n if (!serviceHooks) {\n if (next) return next()\n return ctx\n }\n\n const result = combine(...serviceHooks).call(this, ctx)\n\n if (!next) return result\n\n return Promise.resolve(result).then(() => next())\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\nexport interface IffHook<\n H extends HookContext = HookContext,\n> extends HookFunction<H> {\n else(...hooks: HookFunction<H>[]): HookFunction<H>\n}\n\n/**\n * Conditionally executes a series of hooks when the predicate is truthy.\n * The predicate can be a boolean value or a sync/async function.\n * Supports an `.else(...)` chain for the falsy branch. Also exported as `when`.\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iff(isProvider('external'), authenticate('jwt'))]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff.html\n */\nexport function iff<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n ...hooks: HookFunction<H>[]\n): IffHook<H> {\n if (hooks.length && Array.isArray(hooks[0])) {\n hooks = hooks[0]\n }\n\n const iffWithoutElse = function (context: H, next?: NextFunction) {\n return iffElse(predicate, hooks.slice())(context, next)\n }\n\n iffWithoutElse.else =\n (...falseHooks: any[]) =>\n (context: H, next?: NextFunction) =>\n iffElse(predicate, hooks.slice(), falseHooks.slice())(context, next)\n\n return iffWithoutElse as IffHook<H>\n}\n\nexport { iff as when }\n","import type { HookContext } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { PredicateFn, HookFunction } from '../../types.js'\n\n/**\n * Executes a series of hooks when the predicate is falsy --- the inverse of `iff`.\n * The predicate can be a boolean or a sync/async function.\n * Useful for applying hooks to all contexts except those matching a condition.\n *\n * @example\n * ```ts\n * import { unless, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [unless(isProvider('server'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/unless.html\n */\nexport function unless<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn,\n ...hooks: HookFunction<H>[]\n) {\n return iffElse(predicate, undefined, [...hooks])\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Wraps a hook so it can be conditionally skipped based on a predicate.\n * When the predicate returns `true`, the wrapped hook is skipped entirely.\n * Commonly used with `shouldSkip` and `addSkip` for runtime hook control.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(someHook(), shouldSkip('someHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/skippable.html\n */\nexport const skippable = <H extends HookContext = HookContext>(\n innerHook: HookFunction<H>,\n predicate: PredicateFn<H>,\n) => {\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n const skip = predicate(context)\n\n const skipOrRun = (shouldSkip: boolean): void | Promise<void> => {\n if (shouldSkip) {\n if (next) return next()\n return\n }\n if (next) return innerHook(context, next) as Promise<void>\n innerHook(context)\n }\n\n if (!skip || typeof skip === 'boolean') {\n return skipOrRun(skip)\n }\n\n return skip.then(skipOrRun) as Promise<void>\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { BadRequest } from '@feathersjs/errors'\nimport type { FeathersError } from '@feathersjs/errors'\n\nexport type ThrowIfOptions = {\n /**\n * Customize the error that is thrown if the predicate returns true.\n *\n * If not provided, throws a `BadRequest` error with 'Invalid operation'.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Throws a `BadRequest` error when the given predicate function returns `true`.\n * The predicate receives the hook context and can be async.\n * Useful for validating conditions before proceeding with a request.\n *\n * @example\n * ```ts\n * import { throwIf } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { remove: [throwIf((context) => context.id === context.params.user?.id)] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if.html\n */\nexport const throwIf = <H extends HookContext = HookContext>(\n predicate: PredicateFn,\n options?: ThrowIfOptions,\n) => {\n return async (context: H, next?: NextFunction): Promise<void> => {\n const result = await predicate(context)\n\n if (result) {\n throw options?.error\n ? options.error(context)\n : new BadRequest('Invalid operation')\n }\n\n if (next) {\n await next()\n }\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { S as TransportName, g as PredicateFn } from "./hook-context-aHkq1h0N.mjs";
2
- import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BYWO9hzO.mjs";
2
+ import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-CVD7SrZh.mjs";
3
3
  import { A as SkipHookName, D as isContext, E as IsContextOptions } from "./index-CNrzxmWo.mjs";
4
4
  import * as _$_feathersjs_feathers0 from "@feathersjs/feathers";
5
5
  import { HookContext } from "@feathersjs/feathers";
@@ -1,2 +1,2 @@
1
- import { a as iffElse, c as shouldSkip, d as isPaginated, g as every, h as and, i as iff, l as not, m as isContext, n as skippable, o as or, p as isMulti, r as unless, s as some, t as throwIf, u as isProvider } from "./predicates-CT08opkD.mjs";
1
+ import { a as iffElse, c as shouldSkip, d as isPaginated, g as every, h as and, i as iff, l as not, m as isContext, n as skippable, o as or, p as isMulti, r as unless, s as some, t as throwIf, u as isProvider } from "./predicates-C2SeOKGd.mjs";
2
2
  export { and, every, iff, iff as when, iffElse, isContext, isMulti, isPaginated, isProvider, not, or, shouldSkip, skippable, some, throwIf, unless };
@@ -1,4 +1,4 @@
1
- import "./utils-1I_iPZkV.mjs";
1
+ import "./utils-ByzrJKGQ.mjs";
2
2
  import { n as mutateData, t as mutateResult } from "./mutate-result.util-CCBWix-G.mjs";
3
3
  import { BadRequest } from "@feathersjs/errors";
4
4
  //#region src/resolvers/resolvers.internal.ts
@@ -212,4 +212,4 @@ const resolve = (resolverProperties) => {
212
212
  //#endregion
213
213
  export { resolveData as i, resolveQuery as n, resolveResult as r, resolve as t };
214
214
 
215
- //# sourceMappingURL=resolve-Cx9osy8O.mjs.map
215
+ //# sourceMappingURL=resolve-B81gQqXW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-B81gQqXW.mjs","names":["resolve","resolve","resolve","resolve"],"sources":["../src/resolvers/resolvers.internal.ts","../src/resolvers/resolve-data/resolve-data.ts","../src/resolvers/resolve-result/resolve-result.ts","../src/resolvers/resolve-query/resolve-query.ts","../src/resolvers/resolve/resolve.ts"],"sourcesContent":["import { BadRequest } from '@feathersjs/errors'\nimport type { Promisable } from '../internal.utils.js'\n\nexport interface ResolverPropertyOptions<T, V, C> {\n value: V | undefined\n data: T\n context: C\n properties: ResolverStatus<T, C>\n i: number\n}\n\nexport type ResolverProperty<T, V, C, R = V> = (\n options: ResolverPropertyOptions<T, V, C>,\n) => Promisable<R | undefined>\n\nexport type ResolverObject<T, C> = {\n [K in keyof T & string]?: ResolverProperty<T, T[K], C, T[K]>\n}\n\nexport interface ResolverStatus<T, C> {\n path: string[]\n stack: ResolverProperty<T, any, C>[]\n}\n\nexport interface ResolveOptions<T, D extends Record<string, any>, C> {\n resolvers: ResolverObject<T, C>\n data: D\n context: C\n status?: Partial<ResolverStatus<T, C>>\n propertyNames?: (keyof T)[]\n i?: number\n}\n\nconst toError = (error: any) =>\n typeof error.toJSON === 'function'\n ? error.toJSON()\n : { message: error.message || error }\n\nexport const resolve = <T, D extends Record<string, any>, C>(\n options: ResolveOptions<T, D, C>,\n): Promise<T> | T => {\n const {\n resolvers,\n data,\n context,\n status,\n propertyNames = Object.keys(resolvers) as any as (keyof T)[],\n i = 0,\n } = options\n\n if (!propertyNames.length) {\n return data as any as T\n }\n\n const propertyList = [\n ...new Set(Object.keys(data).concat(propertyNames as string[])),\n ]\n\n const result: any = {}\n const errors: any = {}\n let hasErrors = false\n const { path = [], stack = [] } = status || {}\n const promises: Promise<void>[] = []\n\n for (const name of propertyList) {\n const value = (data as any)[name]\n\n if (!(name in resolvers)) {\n if (value !== undefined) {\n result[name] = value\n }\n continue\n }\n\n const resolver = (resolvers as any)[name] as ResolverProperty<T, any, C>\n\n if (stack.includes(resolver)) {\n continue\n }\n\n const properties: ResolverStatus<T, C> = {\n ...status,\n path: [...path, name],\n stack: [...stack, resolver],\n }\n\n try {\n const resolved = resolver({\n value,\n data: data as any,\n context,\n properties,\n i,\n })\n\n if (resolved instanceof Promise) {\n promises.push(\n resolved\n .then((val) => {\n if (val !== undefined) {\n result[name] = val\n }\n })\n .catch((error: any) => {\n errors[name] = toError(error)\n hasErrors = true\n }),\n )\n } else if (resolved !== undefined) {\n result[name] = resolved\n }\n } catch (error: any) {\n errors[name] = toError(error)\n hasErrors = true\n }\n }\n\n const finalize = () => {\n if (hasErrors) {\n throw new BadRequest('Error resolving data', errors)\n }\n return result as T\n }\n\n if (promises.length) {\n return Promise.all(promises).then(finalize)\n }\n\n return finalize()\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolve } from '../resolvers.internal.js'\nimport { mutateData } from '../../utils/index.js'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.data` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveData, lowercase } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * create: [resolveData({ email: lowercase() })]\n * }\n * })\n * ```\n */\nexport const resolveData = <H extends HookContext = HookContext, D = Data<H>>(\n resolvers: ResolverObject<D, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof D)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const result = mutateData(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n\n if (result instanceof Promise) {\n return next ? result.then(() => next()).then(() => context) : result\n }\n\n if (next) return next().then(() => context)\n return result\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { resolve, type ResolverObject } from '../resolvers.internal.js'\nimport { mutateResult } from '../../utils/index.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.result` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs after `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveResult, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * after: {\n * all: [resolveResult({ password: omit() })]\n * }\n * })\n * ```\n */\nexport const resolveResult = <\n H extends HookContext = HookContext,\n R = Result<H>,\n>(\n resolvers: ResolverObject<R, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<void>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof R)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next()\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n function run(): Promisable<void> {\n const result = mutateResult(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n if (result instanceof Promise) return result.then(() => {})\n return\n }\n\n if (next) {\n return next().then(run)\n }\n\n return run()\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { type ResolverObject, resolve } from '../resolvers.internal.js'\nimport type { Promisable } from '../../internal.utils.js'\n\n/**\n * Resolves and transforms `context.params.query` using a map of resolver functions.\n * Each property in the resolver object receives the current query value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveQuery, defaults } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * find: [resolveQuery({ active: defaults(true) })]\n * }\n * })\n * ```\n */\nexport const resolveQuery = <H extends HookContext>(\n resolvers: ResolverObject<any, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof any)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const queryIngoing = context?.params?.query || {}\n const result = resolve({\n resolvers,\n data: queryIngoing,\n context,\n propertyNames,\n })\n\n function assign(query: any) {\n context.params = { ...context.params, query }\n if (next) return next().then(() => context)\n return context\n }\n\n if (result instanceof Promise) {\n return result.then(assign)\n }\n\n return assign(result)\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolveData } from '../resolve-data/resolve-data.js'\nimport { resolveQuery } from '../resolve-query/resolve-query.js'\nimport { resolveResult } from '../resolve-result/resolve-result.js'\nimport type {\n DataSingleHookContext,\n ResultSingleHookContext,\n} from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Combines `data`, `query`, and `result` resolvers into a single around hook.\n * Data and query resolvers run before `next()`, while the result resolver runs after.\n * At least one resolver must be provided.\n *\n * @example\n * ```ts\n * import { resolve, lowercase, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * around: {\n * all: [resolve({\n * data: { email: lowercase() },\n * result: { password: omit() },\n * })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/resolvers/resolve.html\n */\nexport const resolve = <\n H extends HookContext = HookContext,\n D = Data<H>,\n R = Result<H>,\n>(resolverProperties: {\n data?: ResolverObject<D, H>\n query?: ResolverObject<any, H>\n result?: ResolverObject<R, H>\n}) => {\n const dataResolver = resolverProperties.data\n ? resolveData(resolverProperties.data)\n : undefined\n const queryResolver = resolverProperties.query\n ? resolveQuery(resolverProperties.query)\n : undefined\n const resultResolver = resolverProperties.result\n ? resolveResult(resolverProperties.result)\n : undefined\n\n if (!dataResolver && !queryResolver && !resultResolver) {\n throw new Error(\n 'At least one resolver must be provided (data, query, or result)',\n )\n }\n\n return async (context: H, next?: NextFunction) => {\n if (queryResolver || dataResolver) {\n const promisesBefore: Promise<any>[] = []\n\n if (queryResolver) {\n promisesBefore.push(Promise.resolve(queryResolver(context)))\n }\n\n if (dataResolver) {\n promisesBefore.push(Promise.resolve(dataResolver(context)))\n }\n\n await Promise.all(promisesBefore)\n }\n\n if (next) {\n await next()\n }\n\n if (resultResolver) {\n await resultResolver(context)\n }\n\n return\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-Cx9osy8O.mjs";
1
+ import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-B81gQqXW.mjs";
2
2
  //#region src/resolvers/helpers/omit/omit.ts
3
3
  /**
4
4
  * Returns a resolver property that removes the field by returning `undefined`.
@@ -1,4 +1,4 @@
1
- import { T as AnyFallback, b as TransformerFn, d as HookFunction, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, x as TransformerInputFn } from "./hook-context-aHkq1h0N.mjs";
1
+ import { T as AnyFallback, b as TransformerFn, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, x as TransformerInputFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { HookContext, NextFunction, Query } from "@feathersjs/feathers";
3
3
 
4
4
  //#region src/hooks/transform-data/transform-data.hook.d.ts
@@ -19,7 +19,7 @@ type Data<H extends HookContext> = AnyFallback<DataSingleHookContext<H>, Record<
19
19
  *
20
20
  * @see https://utils.feathersjs.com/hooks/transform-data.html
21
21
  */
22
- declare const transformData: <H extends HookContext = HookContext, D = Data<H>>(transformer: TransformerInputFn<D, H>) => (context: H, next?: NextFunction) => Promise<any>;
22
+ declare const transformData: <H extends HookContext = HookContext, D = Data<H>>(transformer: TransformerInputFn<D, H>) => (context: H, next?: NextFunction) => Promise<void>;
23
23
  //#endregion
24
24
  //#region src/hooks/transform-query/transform-query.hook.d.ts
25
25
  /**
@@ -38,7 +38,10 @@ declare const transformData: <H extends HookContext = HookContext, D = Data<H>>(
38
38
  *
39
39
  * @see https://utils.feathersjs.com/hooks/transform-query.html
40
40
  */
41
- declare const transformQuery: <Q extends Query, H extends HookContext = HookContext>(transformer: TransformerFn<Q, H>) => (context: H, next?: NextFunction) => H | Promise<H>;
41
+ declare const transformQuery: <Q extends Query, H extends HookContext = HookContext>(transformer: TransformerFn<Q, H>) => {
42
+ (context: H): void;
43
+ (context: H, next: NextFunction): Promise<void>;
44
+ };
42
45
  //#endregion
43
46
  //#region src/hooks/transform-result/transform-result.hook.d.ts
44
47
  type Result<H extends HookContext> = AnyFallback<ResultSingleHookContext<H>, Record<string, any>>;
@@ -61,7 +64,7 @@ type TransformResultOptions = {
61
64
  *
62
65
  * @see https://utils.feathersjs.com/hooks/transform-result.html
63
66
  */
64
- declare const transformResult: <H extends HookContext = HookContext, R = Result<H>>(transformer: TransformerInputFn<R, H>, options?: TransformResultOptions) => HookFunction<H>;
67
+ declare const transformResult: <H extends HookContext = HookContext, R = Result<H>>(transformer: TransformerInputFn<R, H>, options?: TransformResultOptions) => (context: H, next?: NextFunction) => Promise<void>;
65
68
  //#endregion
66
69
  export { transformData as i, transformResult as n, transformQuery as r, TransformResultOptions as t };
67
- //# sourceMappingURL=transform-result.hook-BUwLePT2.d.mts.map
70
+ //# sourceMappingURL=transform-result.hook-C8-4Lezj.d.mts.map
@@ -18,8 +18,7 @@ import { n as mutateData, t as mutateResult } from "./mutate-result.util-CCBWix-
18
18
  */
19
19
  const transformData = (transformer) => async (context, next) => {
20
20
  await mutateData(context, transformer);
21
- if (next) return next();
22
- return context;
21
+ if (next) await next();
23
22
  };
24
23
  //#endregion
25
24
  //#region src/hooks/transform-query/transform-query.hook.ts
@@ -40,14 +39,14 @@ const transformData = (transformer) => async (context, next) => {
40
39
  * @see https://utils.feathersjs.com/hooks/transform-query.html
41
40
  */
42
41
  const transformQuery = (transformer) => {
43
- return (context, next) => {
42
+ function hook(context, next) {
44
43
  context.params.query = transformer(context.params.query ?? {}, {
45
44
  context,
46
45
  i: 0
47
46
  });
48
- if (next) return next().then(() => context);
49
- return context;
50
- };
47
+ if (next) return next();
48
+ }
49
+ return hook;
51
50
  };
52
51
  //#endregion
53
52
  //#region src/hooks/transform-result/transform-result.hook.ts
@@ -67,11 +66,13 @@ const transformQuery = (transformer) => {
67
66
  *
68
67
  * @see https://utils.feathersjs.com/hooks/transform-result.html
69
68
  */
70
- const transformResult = (transformer, options) => (context, next) => mutateResult(context, transformer, {
71
- next,
72
- dispatch: options?.dispatch
73
- });
69
+ const transformResult = (transformer, options) => async (context, next) => {
70
+ await mutateResult(context, transformer, {
71
+ next,
72
+ dispatch: options?.dispatch
73
+ });
74
+ };
74
75
  //#endregion
75
76
  export { transformQuery as n, transformData as r, transformResult as t };
76
77
 
77
- //# sourceMappingURL=transform-result.hook-CevWK5TA.mjs.map
78
+ //# sourceMappingURL=transform-result.hook-DifNj7zf.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-result.hook-DifNj7zf.mjs","names":[],"sources":["../src/hooks/transform-data/transform-data.hook.ts","../src/hooks/transform-query/transform-query.hook.ts","../src/hooks/transform-result/transform-result.hook.ts"],"sourcesContent":["import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { mutateData } from '../../utils/mutate-data/mutate-data.util.js'\nimport type { TransformerInputFn } from '../../types.js'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Transforms each item in `context.data` using the provided transformer function.\n * The transformer receives each item and can mutate it in place or return a new object.\n * Commonly used with built-in transformers like `lowercase`, `trim`, or `setNow`.\n *\n * @example\n * ```ts\n * import { transformData, lowercase } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * before: { create: [transformData(item => lowercase(item, 'email'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-data.html\n */\nexport const transformData =\n <H extends HookContext = HookContext, D = Data<H>>(\n transformer: TransformerInputFn<D, H>,\n ) =>\n async (context: H, next?: NextFunction): Promise<void> => {\n await mutateData(context, transformer)\n\n if (next) {\n await next()\n }\n }\n","import type { HookContext, NextFunction, Query } from '@feathersjs/feathers'\nimport type { TransformerFn } from '../../types.js'\n\n/**\n * Transforms `context.params.query` using the provided transformer function.\n * The transformer receives the current query and can return a modified version.\n * Useful for normalizing, sanitizing, or enriching queries before they hit the database.\n *\n * @example\n * ```ts\n * import { transformQuery } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * before: { find: [transformQuery((query) => ({ ...query, active: true }))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-query.html\n */\nexport const transformQuery = <\n Q extends Query,\n H extends HookContext = HookContext,\n>(\n transformer: TransformerFn<Q, H>,\n) => {\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n context.params.query = transformer(context.params.query ?? {}, {\n context,\n i: 0,\n })\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { mutateResult } from '../../utils/mutate-result/mutate-result.util.js'\nimport type { DispatchOption, TransformerInputFn } from '../../types.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\nexport type TransformResultOptions = {\n dispatch?: DispatchOption\n}\n\n/**\n * Transforms each item in `context.result` using the provided transformer function.\n * The transformer receives each item and can mutate it in place or return a new object.\n * Optionally operates on `context.dispatch` via the `dispatch` option.\n *\n * @example\n * ```ts\n * import { transformResult, omit } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * after: { all: [transformResult(item => omit(item, 'password'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-result.html\n */\nexport const transformResult =\n <H extends HookContext = HookContext, R = Result<H>>(\n transformer: TransformerInputFn<R, H>,\n options?: TransformResultOptions,\n ) =>\n async (context: H, next?: NextFunction): Promise<void> => {\n await mutateResult(context, transformer, {\n next,\n dispatch: options?.dispatch,\n })\n }\n"],"mappings":";;;;;;;;;;;;;;;;;;AA2BA,MAAa,iBAET,gBAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,WAAW,SAAS,YAAY;CAEtC,IAAI,MACF,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;AChBlB,MAAa,kBAIX,gBACG;CAGH,SAAS,KAAK,SAAY,MAA2C;EACnE,QAAQ,OAAO,QAAQ,YAAY,QAAQ,OAAO,SAAS,EAAE,EAAE;GAC7D;GACA,GAAG;GACJ,CAAC;EAEF,IAAI,MAAM,OAAO,MAAM;;CAIzB,OAAO;;;;;;;;;;;;;;;;;;;;ACNT,MAAa,mBAET,aACA,YAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,aAAa,SAAS,aAAa;EACvC;EACA,UAAU,SAAS;EACpB,CAAC"}