feathers-utils 7.0.0 → 10.0.0-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/CHANGELOG.md +1 -0
- package/LICENSE +2 -2
- package/README.md +106 -46
- package/dist/add-skip.util-BoYO28ie.d.ts +10 -0
- package/dist/chunk-DKP457HT.js +9 -0
- package/dist/chunk-DKP457HT.js.map +1 -0
- package/dist/chunk-DYLA6A4I.js +250 -0
- package/dist/chunk-DYLA6A4I.js.map +1 -0
- package/dist/chunk-EMKSEUNW.js +770 -0
- package/dist/chunk-EMKSEUNW.js.map +1 -0
- package/dist/chunk-KSCPQLU3.js +189 -0
- package/dist/chunk-KSCPQLU3.js.map +1 -0
- package/dist/hooks.d.ts +453 -0
- package/dist/hooks.js +6 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index-CFEhfnTB.d.ts +190 -0
- package/dist/index.d.ts +10 -321
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.utils-CskQ4psU.d.ts +5 -0
- package/dist/predicates.d.ts +73 -0
- package/dist/predicates.js +4 -0
- package/dist/predicates.js.map +1 -0
- package/dist/resolvers.d.ts +26 -0
- package/dist/resolvers.js +135 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/transformers.d.ts +94 -0
- package/dist/transformers.js +77 -0
- package/dist/transformers.js.map +1 -0
- package/dist/types-Cckf74Jv.d.ts +24 -0
- package/dist/utils.d.ts +6 -0
- package/dist/utils.js +5 -0
- package/dist/utils.js.map +1 -0
- package/package.json +106 -49
- package/src/common/clone.ts +3 -0
- package/src/common/index.ts +6 -0
- package/src/common/traverse.ts +10 -0
- package/src/hooks/cache/cache-utils.ts +23 -0
- package/src/hooks/cache/cache.hook.md +8 -0
- package/src/hooks/cache/cache.hook.test.ts +304 -0
- package/src/hooks/cache/cache.hook.ts +185 -0
- package/src/hooks/check-multi/check-multi.hook.md +9 -0
- package/src/hooks/check-multi/check-multi.hook.test.ts +173 -0
- package/src/hooks/check-multi/check-multi.hook.ts +41 -0
- package/src/hooks/check-required/check-required.hook.md +8 -0
- package/src/hooks/check-required/check-required.hook.test.ts +41 -0
- package/src/hooks/check-required/check-required.hook.ts +49 -0
- package/src/hooks/create-related/create-related.hook.md +8 -0
- package/src/hooks/create-related/create-related.hook.test.ts +247 -0
- package/src/hooks/create-related/create-related.hook.ts +59 -0
- package/src/hooks/debug/debug.hook.md +8 -0
- package/src/hooks/debug/debug.hook.test.ts +25 -0
- package/src/hooks/debug/debug.hook.ts +60 -0
- package/src/hooks/disable-pagination/disable-pagination.hook.md +8 -0
- package/src/hooks/disable-pagination/disable-pagination.hook.test.ts +44 -0
- package/src/hooks/disable-pagination/disable-pagination.hook.ts +23 -0
- package/src/hooks/disallow/disallow.hook.md +9 -0
- package/src/hooks/disallow/disallow.hook.test.ts +159 -0
- package/src/hooks/disallow/disallow.hook.ts +30 -0
- package/src/hooks/iff/iff.hook.md +15 -0
- package/src/hooks/iff/iff.hook.test.ts +469 -0
- package/src/hooks/iff/iff.hook.ts +35 -0
- package/src/hooks/iff-else/iff-else.hook.md +15 -0
- package/src/hooks/iff-else/iff-else.hook.test.ts +219 -0
- package/src/hooks/iff-else/iff-else.hook.ts +58 -0
- package/src/hooks/index.ts +29 -9
- package/src/hooks/on-delete/on-delete.hook.md +32 -0
- package/src/hooks/on-delete/on-delete.hook.test.ts +584 -0
- package/src/hooks/on-delete/on-delete.hook.ts +107 -0
- package/src/hooks/params-for-server/params-for-from-shared.ts +1 -0
- package/src/hooks/params-for-server/params-for-server.hook.md +9 -0
- package/src/hooks/params-for-server/params-for-server.hook.test.ts +46 -0
- package/src/hooks/params-for-server/params-for-server.hook.ts +67 -0
- package/src/hooks/params-from-client/params-from-client.hook.md +9 -0
- package/src/hooks/params-from-client/params-from-client.hook.test.ts +54 -0
- package/src/hooks/params-from-client/params-from-client.hook.ts +63 -0
- package/src/hooks/prevent-changes/prevent-changes.hook.md +8 -0
- package/src/hooks/prevent-changes/prevent-changes.hook.test.ts +125 -0
- package/src/hooks/prevent-changes/prevent-changes.hook.ts +51 -0
- package/src/hooks/set-data/set-data.hook.md +8 -0
- package/src/hooks/set-data/set-data.hook.test.ts +390 -0
- package/src/hooks/set-data/set-data.hook.ts +103 -0
- package/src/hooks/set-field/set-field.hook.md +8 -0
- package/src/hooks/set-field/set-field.hook.test.ts +94 -0
- package/src/hooks/set-field/set-field.hook.ts +63 -0
- package/src/hooks/set-result/set-result.hook.md +8 -0
- package/src/hooks/set-result/set-result.hook.test.ts +417 -0
- package/src/hooks/set-result/set-result.hook.ts +117 -0
- package/src/hooks/set-slug/set-slug.hook.md +8 -0
- package/src/hooks/set-slug/set-slug.hook.test.ts +57 -0
- package/src/hooks/set-slug/set-slug.hook.ts +29 -0
- package/src/hooks/skippable/skippable.md +13 -0
- package/src/hooks/skippable/skippable.test.ts +124 -0
- package/src/hooks/skippable/skippable.ts +28 -0
- package/src/hooks/soft-delete/soft-delete.hook.md +8 -0
- package/src/hooks/soft-delete/soft-delete.hook.test.ts +179 -0
- package/src/hooks/soft-delete/soft-delete.hook.ts +93 -0
- package/src/hooks/stash-before/stash-before.hook.md +8 -0
- package/src/hooks/stash-before/stash-before.hook.test.ts +124 -0
- package/src/hooks/stash-before/stash-before.hook.ts +53 -0
- package/src/hooks/throw-if/throw-if.hook.md +8 -0
- package/src/hooks/throw-if/throw-if.hook.test.ts +27 -0
- package/src/hooks/throw-if/throw-if.hook.ts +41 -0
- package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.md +9 -0
- package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.test.ts +148 -0
- package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.ts +39 -0
- package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.md +9 -0
- package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.test.ts +39 -0
- package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.ts +40 -0
- package/src/hooks/transform-data/transform-data.hook.md +46 -0
- package/src/hooks/transform-data/transform-data.hook.test.ts +117 -0
- package/src/hooks/transform-data/transform-data.hook.ts +22 -0
- package/src/hooks/transform-query/transform-query.hook.md +17 -0
- package/src/hooks/transform-query/transform-query.hook.test.ts +30 -0
- package/src/hooks/transform-query/transform-query.hook.ts +25 -0
- package/src/hooks/transform-result/transform-result.hook.md +38 -0
- package/src/hooks/transform-result/transform-result.hook.test.ts +254 -0
- package/src/hooks/transform-result/transform-result.hook.ts +23 -0
- package/src/hooks/traverse/traverse.hook.md +8 -0
- package/src/hooks/traverse/traverse.hook.test.ts +128 -0
- package/src/hooks/traverse/traverse.hook.ts +30 -0
- package/src/hooks/unless/unless.hook.md +9 -0
- package/src/hooks/unless/unless.hook.test.ts +450 -0
- package/src/hooks/unless/unless.hook.ts +15 -0
- package/src/index.ts +5 -7
- package/src/internal.utils.ts +13 -0
- package/src/predicates/every/every.predicate.md +5 -0
- package/src/predicates/every/every.predicate.test.ts +186 -0
- package/src/predicates/every/every.predicate.ts +55 -0
- package/src/predicates/index.ts +8 -0
- package/src/predicates/is-context/is-context.predicate.md +4 -0
- package/src/predicates/is-context/is-context.predicate.test.ts +64 -0
- package/src/predicates/is-context/is-context.predicate.ts +45 -0
- package/src/predicates/is-multi/is-multi.predicate.md +4 -0
- package/src/predicates/is-multi/is-multi.predicate.test.ts +57 -0
- package/src/predicates/is-multi/is-multi.predicate.ts +29 -0
- package/src/predicates/is-paginated/is-paginated.predicate.md +5 -0
- package/src/predicates/is-paginated/is-paginated.predicate.test.ts +72 -0
- package/src/predicates/is-paginated/is-paginated.predicate.ts +19 -0
- package/src/predicates/is-provider/is-provider.predicate.md +4 -0
- package/src/predicates/is-provider/is-provider.predicate.test.ts +138 -0
- package/src/predicates/is-provider/is-provider.predicate.ts +27 -0
- package/src/predicates/not/not.predicate.md +5 -0
- package/src/predicates/not/not.predicate.test.ts +124 -0
- package/src/predicates/not/not.predicate.ts +22 -0
- package/src/predicates/should-skip/should-skip.predicate.md +5 -0
- package/src/predicates/should-skip/should-skip.predicate.test.ts +121 -0
- package/src/predicates/should-skip/should-skip.predicate.ts +38 -0
- package/src/predicates/some/some.predicate.md +5 -0
- package/src/predicates/some/some.predicate.test.ts +66 -0
- package/src/predicates/some/some.predicate.ts +58 -0
- package/src/resolvers/hooks/index.ts +4 -0
- package/src/resolvers/hooks/resolve-data.test.ts +131 -0
- package/src/resolvers/hooks/resolve-data.ts +20 -0
- package/src/resolvers/hooks/resolve-query.ts +20 -0
- package/src/resolvers/hooks/resolve-result.test.ts +215 -0
- package/src/resolvers/hooks/resolve-result.ts +22 -0
- package/src/resolvers/hooks/resolve.ts +55 -0
- package/src/resolvers/hooks/resolvers.internal.ts +118 -0
- package/src/resolvers/index.ts +1 -0
- package/src/transformers/index.ts +6 -0
- package/src/transformers/lowercase/lowercase.transformer.md +4 -0
- package/src/transformers/lowercase/lowercase.transformer.test.ts +42 -0
- package/src/transformers/lowercase/lowercase.transformer.ts +42 -0
- package/src/transformers/omit/omit.transformer.md +4 -0
- package/src/transformers/omit/omit.transformer.test.ts +41 -0
- package/src/transformers/omit/omit.transformer.ts +27 -0
- package/src/transformers/parse-date/parse-date.transformer.md +4 -0
- package/src/transformers/parse-date/parse-date.transformer.test.ts +43 -0
- package/src/transformers/parse-date/parse-date.transformer.ts +18 -0
- package/src/transformers/pick/pick.transformer.md +4 -0
- package/src/transformers/pick/pick.transformer.test.ts +29 -0
- package/src/transformers/pick/pick.transformer.ts +27 -0
- package/src/transformers/set-now/set-now.transformer.md +4 -0
- package/src/transformers/set-now/set-now.transformer.test.ts +30 -0
- package/src/transformers/set-now/set-now.transformer.ts +34 -0
- package/src/transformers/trim/trim.transformer.md +4 -0
- package/src/transformers/trim/trim.transformer.test.ts +42 -0
- package/src/transformers/trim/trim.transformer.ts +42 -0
- package/src/types.ts +55 -6
- package/src/utility-types/index.ts +1 -162
- package/src/utility-types/infer-service-methods.ts +190 -0
- package/src/utils/add-skip/add-skip.util.md +5 -0
- package/src/utils/add-skip/add-skip.util.test.ts +29 -0
- package/src/utils/add-skip/add-skip.util.ts +34 -0
- package/src/utils/check-context/check-context.util.md +4 -0
- package/src/utils/check-context/check-context.util.test.ts +107 -0
- package/src/utils/check-context/check-context.util.ts +24 -0
- package/src/utils/combine/combine.util.md +8 -0
- package/src/utils/combine/combine.util.test.ts +158 -0
- package/src/utils/combine/combine.util.ts +58 -0
- package/src/utils/context-to-json/context-to-json.util.md +4 -0
- package/src/utils/context-to-json/context-to-json.util.ts +18 -0
- package/src/utils/define-hooks/define-hooks.util.md +27 -0
- package/src/utils/define-hooks/define-hooks.util.test.ts +27 -0
- package/src/utils/define-hooks/define-hooks.util.ts +21 -0
- package/src/utils/get-data-is-array/get-data-is-array.util.md +4 -0
- package/src/utils/get-data-is-array/get-data-is-array.util.test.ts +31 -0
- package/src/utils/get-data-is-array/get-data-is-array.util.ts +25 -0
- package/src/utils/get-exposed-methods/get-exposed-methods.util.md +4 -0
- package/src/utils/get-exposed-methods/get-exposed-methods.util.test.ts +47 -0
- package/src/utils/get-exposed-methods/get-exposed-methods.util.ts +17 -0
- package/src/utils/get-paginate/get-paginate.util.md +4 -0
- package/src/utils/get-paginate/get-paginate.util.test.ts +73 -0
- package/src/utils/get-paginate/get-paginate.util.ts +29 -0
- package/src/utils/get-result-is-array/get-result-is-array.util.md +4 -0
- package/src/utils/get-result-is-array/get-result-is-array.util.test.ts +154 -0
- package/src/utils/get-result-is-array/get-result-is-array.util.ts +39 -0
- package/src/utils/index.ts +14 -17
- package/src/utils/iterate-find/iterate-find.util.md +4 -0
- package/src/utils/iterate-find/iterate-find.util.test.ts +86 -0
- package/src/utils/iterate-find/iterate-find.util.ts +55 -0
- package/src/utils/mutate-data/mutate-data.util.md +5 -0
- package/src/utils/mutate-data/mutate-data.util.ts +45 -0
- package/src/utils/mutate-result/mutate-result.util.md +5 -0
- package/src/utils/mutate-result/mutate-result.util.test.ts +175 -0
- package/src/utils/mutate-result/mutate-result.util.ts +75 -0
- package/src/utils/patch-batch/patch-batch.util.md +4 -0
- package/src/utils/patch-batch/patch-batch.util.test.ts +41 -0
- package/src/utils/patch-batch/patch-batch.util.ts +81 -0
- package/src/utils/skip-result/skip-result.util.md +4 -0
- package/src/utils/{setResultEmpty.ts → skip-result/skip-result.util.test.ts} +127 -158
- package/src/utils/skip-result/skip-result.util.ts +30 -0
- package/src/utils/transform-params/transform-params.util.md +4 -0
- package/src/utils/transform-params/transform-params.util.ts +18 -0
- package/dist/index.cjs +0 -1185
- package/dist/index.d.cts +0 -321
- package/dist/index.d.mts +0 -321
- package/dist/index.mjs +0 -1140
- package/src/.DS_Store +0 -0
- package/src/filters/array.ts +0 -30
- package/src/filters/index.ts +0 -2
- package/src/filters/object.ts +0 -27
- package/src/hooks/.DS_Store +0 -0
- package/src/hooks/checkMulti.ts +0 -177
- package/src/hooks/createRelated.ts +0 -62
- package/src/hooks/forEach.ts +0 -71
- package/src/hooks/from-client-for-server/common.ts +0 -1
- package/src/hooks/from-client-for-server/index.ts +0 -2
- package/src/hooks/from-client-for-server/paramsForServer.ts +0 -100
- package/src/hooks/from-client-for-server/paramsFromClient.ts +0 -105
- package/src/hooks/makeSequelizeQuery.ts_ +0 -90
- package/src/hooks/onDelete.ts +0 -77
- package/src/hooks/parseFields.ts +0 -29
- package/src/hooks/removeRelated.ts +0 -63
- package/src/hooks/runPerItem.ts +0 -47
- package/src/hooks/setData.ts +0 -587
- package/src/mixins/debounce-mixin/DebouncedStore.ts +0 -72
- package/src/mixins/debounce-mixin/debounceMixin.ts +0 -34
- package/src/mixins/debounce-mixin/index.ts +0 -3
- package/src/mixins/debounce-mixin/types.ts +0 -16
- package/src/mixins/debounce-mixin/utils.ts +0 -10
- package/src/mixins/index.ts +0 -1
- package/src/typesInternal.ts +0 -26
- package/src/utils/_utils.internal.ts +0 -16
- package/src/utils/defineHooks.ts +0 -16
- package/src/utils/deflattenQuery.ts +0 -109
- package/src/utils/filterQuery.ts +0 -170
- package/src/utils/flattenQuery.ts +0 -198
- package/src/utils/getItemsIsArray.ts +0 -322
- package/src/utils/getPaginate.ts +0 -102
- package/src/utils/isMulti.ts +0 -78
- package/src/utils/isPaginated.ts +0 -89
- package/src/utils/markHookForSkip.ts +0 -440
- package/src/utils/mergeQuery/index.ts +0 -3
- package/src/utils/mergeQuery/mergeArrays.ts +0 -118
- package/src/utils/mergeQuery/mergeQuery.ts +0 -562
- package/src/utils/mergeQuery/types.ts +0 -23
- package/src/utils/mergeQuery/utils.ts +0 -483
- package/src/utils/optimizeBatchPatch.ts +0 -98
- package/src/utils/pushSet.ts +0 -98
- package/src/utils/setQueryKeySafely.ts +0 -221
- package/src/utils/shouldSkip.ts +0 -161
- package/src/utils/toJSON.ts +0 -8
- package/src/utils/validateQueryProperty.ts +0 -31
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Changelog
|
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
MIT License
|
|
1
|
+
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2025 Feathers
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,54 +1,114 @@
|
|
|
1
|
-
|
|
1
|
+
## feathers-utils
|
|
2
|
+
|
|
3
|
+
#### hooks
|
|
4
|
+
|
|
5
|
+
- added transformData, transformResult, rm alterItems
|
|
6
|
+
- added discardData, discardResult, rm discard
|
|
7
|
+
- moved to omitData, omitResult, rm omit
|
|
8
|
+
- MaybeArray
|
|
9
|
+
- added keepData, keepResult, rm keep
|
|
10
|
+
- moved to pickData, pickResult, rm pick
|
|
11
|
+
- MaybeArray
|
|
12
|
+
- added lowercaseData, lowercaseResult, rm lowercase
|
|
13
|
+
- MaybeArray
|
|
14
|
+
- added setNowData, setNowResult, rm setNow
|
|
15
|
+
|
|
16
|
+
- removed several checks that are handled by typescript
|
|
17
|
+
- removed check for `preventChanges(true, ...fieldNames)`
|
|
18
|
+
- switch `true` to second argument options
|
|
19
|
+
- async
|
|
20
|
+
|
|
21
|
+
- renamed 'keepQuery' to 'pickQuery', added alias
|
|
22
|
+
- renamed 'required' to 'checkRequired', added alias
|
|
23
|
+
|
|
24
|
+
- removed 'runParallel'
|
|
25
|
+
|
|
26
|
+
- removed 'actOn', 'actOnDefault', 'actOnDispatch'
|
|
27
|
+
|
|
28
|
+
- added throwIf
|
|
29
|
+
- added throwIfIsProvider
|
|
30
|
+
- added throwIfIsMulti
|
|
31
|
+
|
|
32
|
+
- removed old paramsForServer & changed to hook
|
|
33
|
+
|
|
34
|
+
- removed 'callingParams'
|
|
35
|
+
|
|
36
|
+
- removed 'checkContextIf'
|
|
37
|
+
|
|
38
|
+
- added 'onDelete' & 'createRelated'
|
|
39
|
+
- added 'checkMulti'
|
|
40
|
+
- added 'shouldSkip' & 'skippable'
|
|
41
|
+
|
|
42
|
+
- stashBefore multi
|
|
43
|
+
|
|
44
|
+
- softDelete: added 'transformParams' & added 'key' option
|
|
45
|
+
|
|
46
|
+
- disallow: MaybeArray
|
|
47
|
+
|
|
48
|
+
- rm support for spread argument
|
|
49
|
+
|
|
50
|
+
- rm 'actOnDispatch' & 'actOnDefault'
|
|
51
|
+
|
|
52
|
+
- rm 'validate', 'validateSchema', 'setNow', 'sequelizeConvert', 'serialize', 'required', 'runHook', 'populate', 'pick', 'omit', 'mongoKeys', 'lowercase', 'lowerCase', 'keepQuery', 'keepQueryInArray', 'isNot', fgraphql', 'fastJoin', 'discard...', 'dePopulate', 'actOnDefault', 'actOnDispatch', 'sifter'
|
|
53
|
+
|
|
54
|
+
- softDelete: need to pass 'deletedQuery' and 'removeData'
|
|
55
|
+
|
|
56
|
+
- traverse options object & getObject explicitly required
|
|
57
|
+
|
|
58
|
+
- cache changed
|
|
59
|
+
|
|
60
|
+
#### predicates
|
|
61
|
+
|
|
62
|
+
- renamed 'isNot' to 'not' (added alias for 'isNot')
|
|
63
|
+
- added predicate isMulti
|
|
64
|
+
- added predicate isPaginated
|
|
65
|
+
- added predicate isContext
|
|
66
|
+
|
|
67
|
+
#### utils
|
|
68
|
+
|
|
69
|
+
- added getDataIsArray, getResultIsArray, rm getItems
|
|
70
|
+
- added mutateData, mutateResult, rm replaceItems
|
|
71
|
+
- added util getPaginate
|
|
72
|
+
- added util skipResult
|
|
73
|
+
- rm 'runHook'
|
|
74
|
+
|
|
75
|
+
### Hooks to discuss
|
|
76
|
+
|
|
77
|
+
- cache
|
|
78
|
+
- populate
|
|
79
|
+
- dePopulate
|
|
80
|
+
- fgraphql
|
|
81
|
+
- fastJoin
|
|
82
|
+
- sequelizeConvert
|
|
83
|
+
- serialize
|
|
84
|
+
|
|
85
|
+
<p align="center">
|
|
86
|
+
<img src="https://utils.feathersjs.com/feathers-utils-logo.png" width="200">
|
|
87
|
+
</p>
|
|
2
88
|
|
|
3
89
|
[](https://www.npmjs.com/package/feathers-utils)
|
|
4
|
-
[](https://codeclimate.com/github/fratzinger/feathers-utils)
|
|
90
|
+
[](https://github.com/feathersjs/feathers-utils/actions/workflows/nodejs.yml?query=branch%3Amaster)
|
|
91
|
+
[](https://libraries.io/npm/feathers-utils)
|
|
7
92
|
[](https://www.npmjs.com/package/feathers-utils)
|
|
8
|
-
[
|
|
93
|
+
[](https://github.com/feathersjs/feathers-utils/blob/master/LICENSE)
|
|
94
|
+
[](https://discord.gg/qa8kez8QBx)
|
|
11
95
|
|
|
96
|
+
A collection of useful hooks and utils to use with Feathers services.
|
|
12
97
|
|
|
13
|
-
|
|
98
|
+
> NOTE: This is the version for Feathers v5. For Feathers v4 use [feathers-utils v6](https://github.com/feathersjs/feathers-utils/tree/crow)
|
|
14
99
|
|
|
15
|
-
```shell
|
|
16
|
-
npm i feathers-utils
|
|
17
100
|
```
|
|
101
|
+
npm install feathers-utils --save
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Documentation
|
|
105
|
+
|
|
106
|
+
For the full list and API of available hooks and utilities, refer to the [feathers-utils documentation](https://utils.feathersjs.com/).
|
|
107
|
+
|
|
108
|
+
## Tests
|
|
109
|
+
|
|
110
|
+
`npm test` to run tests.
|
|
111
|
+
|
|
112
|
+
## License
|
|
18
113
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
### Hooks
|
|
22
|
-
|
|
23
|
-
- `checkMulti`: throws if the request is **multi** data, but the services `allowsMulti(method)` returns `false`
|
|
24
|
-
- `createRelated`: simply create related items from a hook.
|
|
25
|
-
- `forEach`
|
|
26
|
-
- `onDelete`: simply remove/set null related items from a hook.
|
|
27
|
-
- `paramsForServer`
|
|
28
|
-
- `paramsFromClient`
|
|
29
|
-
- `parseFields`
|
|
30
|
-
- `removeRelated`: simple remove related items from a hook. Basically `cascade` at feathers level.
|
|
31
|
-
- `runPerItem`: run a function for every item. Meant for `multi:true`.
|
|
32
|
-
- `setData`: map properties from `context` to `data`. Something like `userId: context.params.user.id`
|
|
33
|
-
|
|
34
|
-
### Mixins
|
|
35
|
-
|
|
36
|
-
- `mixins/debounceMixin` & `mixins/DebouncedStore`
|
|
37
|
-
|
|
38
|
-
### Utils
|
|
39
|
-
|
|
40
|
-
- `defineHooks`
|
|
41
|
-
- `filterQuery`
|
|
42
|
-
- `flattenQuery`
|
|
43
|
-
- `deflattenQuery`
|
|
44
|
-
- `getItemsIsArray(context)`: returns `{ items: any[], isArray: boolean }`
|
|
45
|
-
- `getPaginate`
|
|
46
|
-
- `isMulti(context) => Boolean`: returns true, if `find`, `create/patch/remove`: multi
|
|
47
|
-
- `isPaginated`
|
|
48
|
-
- `markHookForSkip`: add hookName to `context.params.skipHooks` - also see `shouldSkip`
|
|
49
|
-
- `mergeQuery`: deeply merges queries
|
|
50
|
-
- `mergeArrays`: merges arrays with intersection options
|
|
51
|
-
- `pushSet`: if existing array: *push*, else *set*
|
|
52
|
-
- `setQueryKeySafely`
|
|
53
|
-
- `setResultEmpty`
|
|
54
|
-
- `shouldSkip`: checks `context.params.skipHooks` for `'all' | '${hookName}' | '${type}:${hookName}'` - also see `markHookForSkip`
|
|
114
|
+
See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HookType, HookContext } from '@feathersjs/feathers';
|
|
2
|
+
import { M as MaybeArray } from './internal.utils-CskQ4psU.js';
|
|
3
|
+
|
|
4
|
+
type SkipHookName = 'all' | HookType | `${HookType}:${string}` | (string & {});
|
|
5
|
+
/**
|
|
6
|
+
* Add names to `context.params.skipHooks` for `skippable` hooks.
|
|
7
|
+
*/
|
|
8
|
+
declare const addSkip: <H extends HookContext>(context: H, hooks: MaybeArray<SkipHookName>) => void;
|
|
9
|
+
|
|
10
|
+
export { type SkipHookName as S, addSkip as a };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/internal.utils.ts
|
|
2
|
+
var hasOwnProperty = (obj, ...keys) => {
|
|
3
|
+
return keys.some((x) => Object.prototype.hasOwnProperty.call(obj, x));
|
|
4
|
+
};
|
|
5
|
+
var toArray = (value) => Array.isArray(value) ? value : [value];
|
|
6
|
+
|
|
7
|
+
export { hasOwnProperty, toArray };
|
|
8
|
+
//# sourceMappingURL=chunk-DKP457HT.js.map
|
|
9
|
+
//# sourceMappingURL=chunk-DKP457HT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal.utils.ts"],"names":[],"mappings":";AAAO,IAAM,cAAA,GAAiB,CAC5B,GAAA,EAAA,GACG,IAAA,KACS;AACZ,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,UAAU,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAA;AACtE;AAGO,IAAM,OAAA,GAAU,CAAI,KAAA,KACzB,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK","file":"chunk-DKP457HT.js","sourcesContent":["export const hasOwnProperty = (\n obj: Record<string, unknown>,\n ...keys: string[]\n): boolean => {\n return keys.some((x) => Object.prototype.hasOwnProperty.call(obj, x))\n}\n\nexport type MaybeArray<T> = T | T[]\nexport const toArray = <T>(value: T | T[]): T[] =>\n Array.isArray(value) ? value : [value]\n\nexport type Promisable<T> = T | Promise<T>\nexport type KeyOf<T> = Extract<keyof T, string>\n"]}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { isContext, isPromise, isMulti, isPaginated } from './chunk-KSCPQLU3.js';
|
|
2
|
+
import { SERVICE } from '@feathersjs/feathers';
|
|
3
|
+
import copy from 'fast-copy';
|
|
4
|
+
import { deepEqual } from 'fast-equals';
|
|
5
|
+
|
|
6
|
+
// src/utils/add-skip/add-skip.util.ts
|
|
7
|
+
var addSkip = (context, hooks) => {
|
|
8
|
+
const names = Array.isArray(hooks) ? hooks : [hooks];
|
|
9
|
+
if (context.params.skipHooks === void 0) {
|
|
10
|
+
context.params = {
|
|
11
|
+
...context.params,
|
|
12
|
+
skipHooks: [...names]
|
|
13
|
+
};
|
|
14
|
+
} else {
|
|
15
|
+
if (!Array.isArray(context.params.skipHooks)) {
|
|
16
|
+
throw new Error("Invalid skipHooks parameter");
|
|
17
|
+
}
|
|
18
|
+
context.params = {
|
|
19
|
+
...context.params,
|
|
20
|
+
skipHooks: [.../* @__PURE__ */ new Set([...context.params.skipHooks, ...names])]
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/utils/check-context/check-context.util.ts
|
|
26
|
+
function checkContext(context, type, methods, label = "anonymous") {
|
|
27
|
+
if (!isContext({
|
|
28
|
+
method: methods ?? void 0,
|
|
29
|
+
type: type ?? void 0
|
|
30
|
+
})(context)) {
|
|
31
|
+
throw new Error(`The '${label}' hook has invalid context.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// src/utils/context-to-json/context-to-json.util.ts
|
|
36
|
+
var contextToJson = (context) => {
|
|
37
|
+
if (context.toJSON) {
|
|
38
|
+
return context.toJSON();
|
|
39
|
+
}
|
|
40
|
+
return context;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// src/utils/define-hooks/define-hooks.util.ts
|
|
44
|
+
function defineHooks(hooks) {
|
|
45
|
+
return hooks;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/utils/get-data-is-array/get-data-is-array.util.ts
|
|
49
|
+
function getDataIsArray(context) {
|
|
50
|
+
if (!context.data) {
|
|
51
|
+
return {
|
|
52
|
+
isArray: false,
|
|
53
|
+
data: []
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const isArray = Array.isArray(context.data);
|
|
57
|
+
return {
|
|
58
|
+
isArray,
|
|
59
|
+
data: isArray ? context.data : [context.data]
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function getExposedMethods(service) {
|
|
63
|
+
const result = service[SERVICE].methods;
|
|
64
|
+
if (!result || !Array.isArray(result)) {
|
|
65
|
+
throw new Error(`Service does not have exposed methods`);
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
function getResultIsArray(context, options) {
|
|
70
|
+
const { dispatch = false } = options || {};
|
|
71
|
+
const isDispatch = dispatch && context.dispatch !== void 0;
|
|
72
|
+
const result = dispatch ? isDispatch ? context.dispatch : copy(context.result) : context.result;
|
|
73
|
+
if (!result) {
|
|
74
|
+
return {
|
|
75
|
+
isArray: false,
|
|
76
|
+
result: [],
|
|
77
|
+
key: isDispatch ? "dispatch" : "result"
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const items = context.method === "find" ? result.data || result : result;
|
|
81
|
+
const isArray = Array.isArray(items);
|
|
82
|
+
return {
|
|
83
|
+
isArray,
|
|
84
|
+
result: isArray ? items : items ? [items] : [],
|
|
85
|
+
key: isDispatch ? "dispatch" : "result"
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/utils/iterate-find/iterate-find.util.ts
|
|
90
|
+
async function* iterateFind(app, servicePath, options) {
|
|
91
|
+
const service = app.service(servicePath);
|
|
92
|
+
if (!service || !("find" in service)) {
|
|
93
|
+
throw new Error(`Service '${servicePath}' does not have a 'find' method.`);
|
|
94
|
+
}
|
|
95
|
+
const params = {
|
|
96
|
+
...options?.params,
|
|
97
|
+
query: {
|
|
98
|
+
...options?.params?.query ?? {},
|
|
99
|
+
$limit: options?.params?.query?.$limit ?? 10,
|
|
100
|
+
$skip: options?.params?.query?.$skip ?? 0
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
let result;
|
|
104
|
+
do {
|
|
105
|
+
result = await service.find(params);
|
|
106
|
+
for (const item of result.data) {
|
|
107
|
+
yield item;
|
|
108
|
+
}
|
|
109
|
+
params.query.$skip = (params.query.$skip ?? 0) + result.data.length;
|
|
110
|
+
} while (result.total > params.query.$skip);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// src/utils/mutate-data/mutate-data.util.ts
|
|
114
|
+
function mutateData(context, transformer) {
|
|
115
|
+
if (!context.data) {
|
|
116
|
+
return context;
|
|
117
|
+
}
|
|
118
|
+
const { data, isArray } = getDataIsArray(context);
|
|
119
|
+
if (!data.length) {
|
|
120
|
+
return context;
|
|
121
|
+
}
|
|
122
|
+
let hasPromises = false;
|
|
123
|
+
const results = data.map((item, i) => {
|
|
124
|
+
const result = transformer(item, { context, i });
|
|
125
|
+
if (isPromise(result)) {
|
|
126
|
+
hasPromises = true;
|
|
127
|
+
return result.then((res) => res ?? item);
|
|
128
|
+
}
|
|
129
|
+
return result ?? item;
|
|
130
|
+
});
|
|
131
|
+
function mutate(data2) {
|
|
132
|
+
context.data = isArray ? data2 : data2[0];
|
|
133
|
+
return context;
|
|
134
|
+
}
|
|
135
|
+
if (hasPromises) {
|
|
136
|
+
return Promise.all(results).then(mutate);
|
|
137
|
+
} else {
|
|
138
|
+
return mutate(results);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
async function mutateResult(context, transformer, options) {
|
|
142
|
+
if (options?.next) {
|
|
143
|
+
await options.next();
|
|
144
|
+
}
|
|
145
|
+
if (!!options?.dispatch && !context.dispatch) {
|
|
146
|
+
context.dispatch = copy(context.result);
|
|
147
|
+
}
|
|
148
|
+
async function forResult(dispatch) {
|
|
149
|
+
const { result, isArray, key } = getResultIsArray(context, { dispatch });
|
|
150
|
+
if (!result.length) {
|
|
151
|
+
return context;
|
|
152
|
+
}
|
|
153
|
+
let hasPromises = false;
|
|
154
|
+
const results = result.map((item, i) => {
|
|
155
|
+
const result2 = transformer(item, { context, i });
|
|
156
|
+
if (isPromise(result2)) {
|
|
157
|
+
hasPromises = true;
|
|
158
|
+
return result2.then((res) => res ?? item);
|
|
159
|
+
}
|
|
160
|
+
return result2 ?? item;
|
|
161
|
+
});
|
|
162
|
+
function mutate(r) {
|
|
163
|
+
if (options?.transform) {
|
|
164
|
+
r = options.transform(r);
|
|
165
|
+
}
|
|
166
|
+
if (!isArray) {
|
|
167
|
+
context[key] = r[0];
|
|
168
|
+
} else if (isArray && !Array.isArray(context[key]) && context[key].data) {
|
|
169
|
+
context[key].data = r;
|
|
170
|
+
} else {
|
|
171
|
+
context[key] = r;
|
|
172
|
+
}
|
|
173
|
+
return context;
|
|
174
|
+
}
|
|
175
|
+
if (hasPromises) {
|
|
176
|
+
return await Promise.all(results).then(mutate);
|
|
177
|
+
} else {
|
|
178
|
+
return mutate(results);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
if (options?.dispatch === "both") {
|
|
182
|
+
await Promise.all([forResult(true), forResult(false)]);
|
|
183
|
+
return context;
|
|
184
|
+
}
|
|
185
|
+
return await forResult(options?.dispatch ?? false);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// src/utils/skip-result/skip-result.util.ts
|
|
189
|
+
var skipResult = (context) => {
|
|
190
|
+
if (context.result) {
|
|
191
|
+
return context;
|
|
192
|
+
}
|
|
193
|
+
const multi = isMulti(context);
|
|
194
|
+
if (multi) {
|
|
195
|
+
if (context.method === "find" && isPaginated(context)) {
|
|
196
|
+
context.result = {
|
|
197
|
+
total: 0,
|
|
198
|
+
skip: 0,
|
|
199
|
+
limit: 0,
|
|
200
|
+
data: []
|
|
201
|
+
};
|
|
202
|
+
} else {
|
|
203
|
+
context.result = [];
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
context.result = null;
|
|
207
|
+
}
|
|
208
|
+
return context;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/utils/transform-params/transform-params.util.ts
|
|
212
|
+
var transformParams = (params, fn) => {
|
|
213
|
+
if (!fn) {
|
|
214
|
+
return params;
|
|
215
|
+
}
|
|
216
|
+
const result = fn({ ...params });
|
|
217
|
+
return result ?? params;
|
|
218
|
+
};
|
|
219
|
+
function patchBatch(items, options) {
|
|
220
|
+
const map = [];
|
|
221
|
+
const idKey = options?.id ?? "id";
|
|
222
|
+
for (const _data of items) {
|
|
223
|
+
const data = _data;
|
|
224
|
+
const id = _data[idKey];
|
|
225
|
+
delete data[idKey];
|
|
226
|
+
const index = map.findIndex((item) => {
|
|
227
|
+
return deepEqual(item.data, data);
|
|
228
|
+
});
|
|
229
|
+
if (index === -1) {
|
|
230
|
+
map.push({ ids: [id], data });
|
|
231
|
+
} else {
|
|
232
|
+
map[index].ids.push(id);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return map.map(({ ids, data }) => {
|
|
236
|
+
return ids.length === 1 ? [ids[0], data, void 0] : [
|
|
237
|
+
null,
|
|
238
|
+
data,
|
|
239
|
+
{
|
|
240
|
+
query: {
|
|
241
|
+
[idKey]: { $in: ids }
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
];
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export { addSkip, checkContext, contextToJson, defineHooks, getDataIsArray, getExposedMethods, getResultIsArray, iterateFind, mutateData, mutateResult, patchBatch, skipResult, transformParams };
|
|
249
|
+
//# sourceMappingURL=chunk-DYLA6A4I.js.map
|
|
250
|
+
//# sourceMappingURL=chunk-DYLA6A4I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/add-skip/add-skip.util.ts","../src/utils/check-context/check-context.util.ts","../src/utils/context-to-json/context-to-json.util.ts","../src/utils/define-hooks/define-hooks.util.ts","../src/utils/get-data-is-array/get-data-is-array.util.ts","../src/utils/get-exposed-methods/get-exposed-methods.util.ts","../src/utils/get-result-is-array/get-result-is-array.util.ts","../src/utils/iterate-find/iterate-find.util.ts","../src/utils/mutate-data/mutate-data.util.ts","../src/utils/mutate-result/mutate-result.util.ts","../src/utils/skip-result/skip-result.util.ts","../src/utils/transform-params/transform-params.util.ts","../src/utils/patch-batch/patch-batch.util.ts"],"names":["data","copy","result"],"mappings":"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","file":"chunk-DYLA6A4I.js","sourcesContent":["import type { HookContext, HookType } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\n\nexport type SkipHookName =\n | 'all'\n | HookType\n | `${HookType}:${string}`\n | (string & {})\n\n/**\n * Add names to `context.params.skipHooks` for `skippable` hooks.\n */\nexport const addSkip = <H extends HookContext>(\n context: H,\n hooks: MaybeArray<SkipHookName>,\n) => {\n const names = Array.isArray(hooks) ? hooks : [hooks]\n\n if (context.params.skipHooks === undefined) {\n context.params = {\n ...context.params,\n skipHooks: [...names],\n }\n } else {\n if (!Array.isArray(context.params.skipHooks)) {\n throw new Error('Invalid skipHooks parameter')\n }\n\n context.params = {\n ...context.params,\n skipHooks: [...new Set([...context.params.skipHooks, ...names])],\n }\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { HookType, MethodName } from '../../types.js'\nimport { isContext } from '../../predicates/is-context/is-context.predicate.js'\n\n/**\n * Restrict a hook to run for certain methods and method types.\n *\n * @see https://utils.feathersjs.com/utils/check-context.html\n */\nexport function checkContext<H extends HookContext = HookContext>(\n context: H,\n type?: HookType | HookType[] | null,\n methods?: MethodName | MethodName[] | null,\n label = 'anonymous',\n): void {\n if (\n !isContext({\n method: methods ?? undefined,\n type: type ?? undefined,\n })(context)\n ) {\n throw new Error(`The '${label}' hook has invalid context.`)\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Converts a FeathersJS HookContext to JSON.\n * If the context has a `toJSON` method, it will call that method.\n * Otherwise, it will return the context as is.\n *\n * This is useful for serializing the context for logging or debugging purposes.\n * E.g. when you use 'has'/'get' from lodash to access properties of the context.\n *\n * @see https://utils.feathersjs.com/utils/context-to-json.html\n */\nexport const contextToJson = (context: HookContext) => {\n if (context.toJSON) {\n return context.toJSON()\n }\n return context\n}\n","import type { Application, HookOptions } from '@feathersjs/feathers'\n\n/**\n * Typescript helper function to define hooks with type safety.\n *\n * @see https://utils.feathersjs.com/utils/define-hooks.html\n */\nexport function defineHooks<\n A extends Application = Application,\n S = {\n find: any\n get: any\n create: any\n update: any\n patch: any\n remove: any\n },\n Options = HookOptions<A, S>,\n>(hooks: Options): Options {\n return hooks\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Always returns the `context.data` as an array.\n * If `context.data` is not an array, it will be wrapped in an array.\n *\n * @see https://utils.feathersjs.com/utils/get-data-is-array.html\n */\nexport function getDataIsArray<H extends HookContext = HookContext>(\n context: H,\n): { data: any[]; isArray: boolean } {\n if (!context.data) {\n return {\n isArray: false,\n data: [],\n }\n }\n\n const isArray = Array.isArray(context.data)\n\n return {\n isArray,\n data: isArray ? context.data : [context.data],\n }\n}\n","import type { Service } from '@feathersjs/feathers'\nimport { SERVICE } from '@feathersjs/feathers'\n\n/**\n * Little helper to get methods are publicly exposed by a service.\n *\n * @see https://utils.feathersjs.com/utils/get-exposed-methods.html\n */\nexport function getExposedMethods(service: Service) {\n const result = (service as any)[SERVICE].methods\n\n if (!result || !Array.isArray(result)) {\n throw new Error(`Service does not have exposed methods`)\n }\n\n return result\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport copy from 'fast-copy'\n\ntype GetResultIsArrayOptions = {\n dispatch?: boolean\n}\n\nexport function getResultIsArray<H extends HookContext = HookContext>(\n context: H,\n options?: GetResultIsArrayOptions,\n): { isArray: boolean; result: any[]; key: 'dispatch' | 'result' } {\n const { dispatch = false } = options || {}\n\n const isDispatch: boolean = dispatch && context.dispatch !== undefined\n\n const result = dispatch\n ? isDispatch\n ? context.dispatch\n : copy(context.result)\n : context.result\n\n if (!result) {\n return {\n isArray: false,\n result: [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n }\n\n const items = context.method === 'find' ? result.data || result : result\n\n const isArray = Array.isArray(items)\n\n return {\n isArray,\n result: isArray ? items : items ? [items] : [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n}\n","import type { Application, Params } from '@feathersjs/feathers'\nimport type { KeyOf } from '../../internal.utils.js'\nimport type {\n InferFindParams,\n InferFindResultSingle,\n} from '../../utility-types/infer-service-methods.js'\n\ntype IterateFindOptions<P extends Params = Params> = {\n params?: P\n}\n\n/**\n * Use `for await` to iterate over the results of a `find` method.\n *\n * This function is useful for iterating over large datasets without loading everything into memory at once.\n * It uses pagination to fetch results in chunks, allowing you to process each item as it is retrieved.\n */\nexport async function* iterateFind<\n Services,\n Path extends KeyOf<Services>,\n Service extends Services[Path] = Services[Path],\n P extends Params = InferFindParams<Service>,\n Item = InferFindResultSingle<Service>,\n>(\n app: Application<Services>,\n servicePath: Path,\n options?: IterateFindOptions<P>,\n): AsyncGenerator<Item, void, unknown> {\n const service = app.service(servicePath)\n\n if (!service || !('find' in service)) {\n throw new Error(`Service '${servicePath}' does not have a 'find' method.`)\n }\n\n const params = {\n ...options?.params,\n query: {\n ...(options?.params?.query ?? {}),\n $limit: options?.params?.query?.$limit ?? 10,\n $skip: options?.params?.query?.$skip ?? 0,\n },\n }\n\n let result\n\n do {\n result = await (service as any).find(params)\n\n for (const item of result.data) {\n yield item\n }\n\n params.query.$skip = (params.query.$skip ?? 0) + result.data.length\n } while (result.total > params.query.$skip)\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getDataIsArray } from '../get-data-is-array/get-data-is-array.util.js'\nimport { isPromise } from '../../common/index.js'\nimport type { Promisable } from '../../internal.utils.js'\nimport type { TransformerFn } from '../../types.js'\n\nexport function mutateData<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerFn<any, H>,\n): Promisable<H> {\n if (!context.data) {\n return context\n }\n\n const { data, isArray } = getDataIsArray(context)\n\n if (!data.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = data.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(data: any) {\n context.data = isArray ? data : data[0]\n\n return context\n }\n\n if (hasPromises) {\n return Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { getResultIsArray } from '../get-result-is-array/get-result-is-array.util.js'\nimport { isPromise } from '../../common/index.js'\nimport copy from 'fast-copy'\nimport type { DispatchOption, TransformerFn } from '../../types.js'\n\nexport type MutateResultOptions = {\n next?: NextFunction\n transform?: (items: any[]) => any[]\n dispatch?: DispatchOption\n}\n\nexport async function mutateResult<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerFn<any, H>,\n options?: MutateResultOptions,\n): Promise<H> {\n if (options?.next) {\n await options.next()\n }\n\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result)\n }\n\n async function forResult(dispatch: boolean) {\n const { result, isArray, key } = getResultIsArray(context, { dispatch })\n\n if (!result.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = result.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(r: any) {\n if (options?.transform) {\n r = options.transform(r)\n }\n\n if (!isArray) {\n context[key] = r[0]\n } else if (isArray && !Array.isArray(context[key]) && context[key].data) {\n context[key].data = r\n } else {\n context[key] = r\n }\n\n return context\n }\n\n if (hasPromises) {\n return await Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n }\n\n if (options?.dispatch === 'both') {\n await Promise.all([forResult(true), forResult(false)])\n return context\n }\n\n return await forResult(options?.dispatch ?? false)\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { isMulti, isPaginated } from '../../predicates/index.js'\n\n/**\n * Set `context.result` to an empty array or object, depending on the hook type\n */\nexport const skipResult = <H extends HookContext = HookContext>(context: H) => {\n if (context.result) {\n return context\n }\n\n const multi = isMulti(context)\n\n if (multi) {\n if (context.method === 'find' && isPaginated(context)) {\n context.result = {\n total: 0,\n skip: 0,\n limit: 0,\n data: [],\n }\n } else {\n context.result = []\n }\n } else {\n context.result = null\n }\n\n return context\n}\n","import type { Params } from '@feathersjs/feathers'\nimport type { TransformParamsFn } from '../../types.js'\n\n/**\n * Safely use a transformParams function to modify params.\n */\nexport const transformParams = <P extends Params = Params>(\n params: P,\n fn: TransformParamsFn<P> | undefined,\n): P => {\n if (!fn) {\n return params\n }\n\n const result = fn({ ...params })\n\n return result ?? params\n}\n","import type { Id, Params } from '@feathersjs/feathers'\nimport { deepEqual } from 'fast-equals'\nimport type { KeyOf } from '../../internal.utils.js'\n\nexport type PatchBatchOptions<IdKey extends string> = {\n /** the key of the id property */\n id?: IdKey\n}\n\nexport type PatchBatchResultItem<T = Record<string, unknown>, P = Params> = [\n Id | null,\n T,\n P | undefined,\n]\n\n/**\n * Batch patching utility that takes an array of items to be changed and returns an array of arguments to be called with the `patch` method.\n *\n * This utility is useful when you need to patch multiple items with varying data in as few requests as possible.\n *\n * @example\n * ```ts\n * const items = [\n * { id: 1, value: 10 },\n * { id: 2, value: 10 },\n * { id: 3, value: 20 },\n * ];\n *\n * const batched = patchBatch(items, { id: 'id' });\n * // batched will be:\n * // [\n * // [null, { value: 10 }, { query: { id: { $in: [1, 2] } } }],\n * // [3, { value: 20 }, undefined],\n * // ]\n *\n * await Promise.all(batched.map(args => service.patch(...args)));\n * ```\n */\nexport function patchBatch<\n T extends Record<string, any>,\n IdKey extends KeyOf<T>,\n P extends Params,\n R extends Omit<T, IdKey> = Omit<T, IdKey>,\n>(\n items: T[],\n options?: PatchBatchOptions<IdKey>,\n): PatchBatchResultItem<R, P>[] {\n const map: { ids: Id[]; data: R }[] = []\n\n const idKey = options?.id ?? 'id'\n\n for (const _data of items) {\n const data = _data as unknown as R\n const id = _data[idKey]\n delete (data as any)[idKey as any]\n\n const index = map.findIndex((item) => {\n return deepEqual(item.data, data)\n })\n\n if (index === -1) {\n map.push({ ids: [id], data })\n } else {\n map[index].ids.push(id)\n }\n }\n\n return map.map(({ ids, data }) => {\n return ids.length === 1\n ? ([ids[0], data, undefined] as PatchBatchResultItem<R, P>)\n : ([\n null,\n data,\n {\n query: {\n [idKey]: { $in: ids },\n },\n },\n ] as PatchBatchResultItem<R, P>)\n })\n}\n"]}
|