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.
Files changed (275) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/LICENSE +2 -2
  3. package/README.md +106 -46
  4. package/dist/add-skip.util-BoYO28ie.d.ts +10 -0
  5. package/dist/chunk-DKP457HT.js +9 -0
  6. package/dist/chunk-DKP457HT.js.map +1 -0
  7. package/dist/chunk-DYLA6A4I.js +250 -0
  8. package/dist/chunk-DYLA6A4I.js.map +1 -0
  9. package/dist/chunk-EMKSEUNW.js +770 -0
  10. package/dist/chunk-EMKSEUNW.js.map +1 -0
  11. package/dist/chunk-KSCPQLU3.js +189 -0
  12. package/dist/chunk-KSCPQLU3.js.map +1 -0
  13. package/dist/hooks.d.ts +453 -0
  14. package/dist/hooks.js +6 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index-CFEhfnTB.d.ts +190 -0
  17. package/dist/index.d.ts +10 -321
  18. package/dist/index.js +19 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/internal.utils-CskQ4psU.d.ts +5 -0
  21. package/dist/predicates.d.ts +73 -0
  22. package/dist/predicates.js +4 -0
  23. package/dist/predicates.js.map +1 -0
  24. package/dist/resolvers.d.ts +26 -0
  25. package/dist/resolvers.js +135 -0
  26. package/dist/resolvers.js.map +1 -0
  27. package/dist/transformers.d.ts +94 -0
  28. package/dist/transformers.js +77 -0
  29. package/dist/transformers.js.map +1 -0
  30. package/dist/types-Cckf74Jv.d.ts +24 -0
  31. package/dist/utils.d.ts +6 -0
  32. package/dist/utils.js +5 -0
  33. package/dist/utils.js.map +1 -0
  34. package/package.json +106 -49
  35. package/src/common/clone.ts +3 -0
  36. package/src/common/index.ts +6 -0
  37. package/src/common/traverse.ts +10 -0
  38. package/src/hooks/cache/cache-utils.ts +23 -0
  39. package/src/hooks/cache/cache.hook.md +8 -0
  40. package/src/hooks/cache/cache.hook.test.ts +304 -0
  41. package/src/hooks/cache/cache.hook.ts +185 -0
  42. package/src/hooks/check-multi/check-multi.hook.md +9 -0
  43. package/src/hooks/check-multi/check-multi.hook.test.ts +173 -0
  44. package/src/hooks/check-multi/check-multi.hook.ts +41 -0
  45. package/src/hooks/check-required/check-required.hook.md +8 -0
  46. package/src/hooks/check-required/check-required.hook.test.ts +41 -0
  47. package/src/hooks/check-required/check-required.hook.ts +49 -0
  48. package/src/hooks/create-related/create-related.hook.md +8 -0
  49. package/src/hooks/create-related/create-related.hook.test.ts +247 -0
  50. package/src/hooks/create-related/create-related.hook.ts +59 -0
  51. package/src/hooks/debug/debug.hook.md +8 -0
  52. package/src/hooks/debug/debug.hook.test.ts +25 -0
  53. package/src/hooks/debug/debug.hook.ts +60 -0
  54. package/src/hooks/disable-pagination/disable-pagination.hook.md +8 -0
  55. package/src/hooks/disable-pagination/disable-pagination.hook.test.ts +44 -0
  56. package/src/hooks/disable-pagination/disable-pagination.hook.ts +23 -0
  57. package/src/hooks/disallow/disallow.hook.md +9 -0
  58. package/src/hooks/disallow/disallow.hook.test.ts +159 -0
  59. package/src/hooks/disallow/disallow.hook.ts +30 -0
  60. package/src/hooks/iff/iff.hook.md +15 -0
  61. package/src/hooks/iff/iff.hook.test.ts +469 -0
  62. package/src/hooks/iff/iff.hook.ts +35 -0
  63. package/src/hooks/iff-else/iff-else.hook.md +15 -0
  64. package/src/hooks/iff-else/iff-else.hook.test.ts +219 -0
  65. package/src/hooks/iff-else/iff-else.hook.ts +58 -0
  66. package/src/hooks/index.ts +29 -9
  67. package/src/hooks/on-delete/on-delete.hook.md +32 -0
  68. package/src/hooks/on-delete/on-delete.hook.test.ts +584 -0
  69. package/src/hooks/on-delete/on-delete.hook.ts +107 -0
  70. package/src/hooks/params-for-server/params-for-from-shared.ts +1 -0
  71. package/src/hooks/params-for-server/params-for-server.hook.md +9 -0
  72. package/src/hooks/params-for-server/params-for-server.hook.test.ts +46 -0
  73. package/src/hooks/params-for-server/params-for-server.hook.ts +67 -0
  74. package/src/hooks/params-from-client/params-from-client.hook.md +9 -0
  75. package/src/hooks/params-from-client/params-from-client.hook.test.ts +54 -0
  76. package/src/hooks/params-from-client/params-from-client.hook.ts +63 -0
  77. package/src/hooks/prevent-changes/prevent-changes.hook.md +8 -0
  78. package/src/hooks/prevent-changes/prevent-changes.hook.test.ts +125 -0
  79. package/src/hooks/prevent-changes/prevent-changes.hook.ts +51 -0
  80. package/src/hooks/set-data/set-data.hook.md +8 -0
  81. package/src/hooks/set-data/set-data.hook.test.ts +390 -0
  82. package/src/hooks/set-data/set-data.hook.ts +103 -0
  83. package/src/hooks/set-field/set-field.hook.md +8 -0
  84. package/src/hooks/set-field/set-field.hook.test.ts +94 -0
  85. package/src/hooks/set-field/set-field.hook.ts +63 -0
  86. package/src/hooks/set-result/set-result.hook.md +8 -0
  87. package/src/hooks/set-result/set-result.hook.test.ts +417 -0
  88. package/src/hooks/set-result/set-result.hook.ts +117 -0
  89. package/src/hooks/set-slug/set-slug.hook.md +8 -0
  90. package/src/hooks/set-slug/set-slug.hook.test.ts +57 -0
  91. package/src/hooks/set-slug/set-slug.hook.ts +29 -0
  92. package/src/hooks/skippable/skippable.md +13 -0
  93. package/src/hooks/skippable/skippable.test.ts +124 -0
  94. package/src/hooks/skippable/skippable.ts +28 -0
  95. package/src/hooks/soft-delete/soft-delete.hook.md +8 -0
  96. package/src/hooks/soft-delete/soft-delete.hook.test.ts +179 -0
  97. package/src/hooks/soft-delete/soft-delete.hook.ts +93 -0
  98. package/src/hooks/stash-before/stash-before.hook.md +8 -0
  99. package/src/hooks/stash-before/stash-before.hook.test.ts +124 -0
  100. package/src/hooks/stash-before/stash-before.hook.ts +53 -0
  101. package/src/hooks/throw-if/throw-if.hook.md +8 -0
  102. package/src/hooks/throw-if/throw-if.hook.test.ts +27 -0
  103. package/src/hooks/throw-if/throw-if.hook.ts +41 -0
  104. package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.md +9 -0
  105. package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.test.ts +148 -0
  106. package/src/hooks/throw-if-is-multi/throw-if-is-multi.hook.ts +39 -0
  107. package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.md +9 -0
  108. package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.test.ts +39 -0
  109. package/src/hooks/throw-if-is-provider/throw-if-is-provider.hook.ts +40 -0
  110. package/src/hooks/transform-data/transform-data.hook.md +46 -0
  111. package/src/hooks/transform-data/transform-data.hook.test.ts +117 -0
  112. package/src/hooks/transform-data/transform-data.hook.ts +22 -0
  113. package/src/hooks/transform-query/transform-query.hook.md +17 -0
  114. package/src/hooks/transform-query/transform-query.hook.test.ts +30 -0
  115. package/src/hooks/transform-query/transform-query.hook.ts +25 -0
  116. package/src/hooks/transform-result/transform-result.hook.md +38 -0
  117. package/src/hooks/transform-result/transform-result.hook.test.ts +254 -0
  118. package/src/hooks/transform-result/transform-result.hook.ts +23 -0
  119. package/src/hooks/traverse/traverse.hook.md +8 -0
  120. package/src/hooks/traverse/traverse.hook.test.ts +128 -0
  121. package/src/hooks/traverse/traverse.hook.ts +30 -0
  122. package/src/hooks/unless/unless.hook.md +9 -0
  123. package/src/hooks/unless/unless.hook.test.ts +450 -0
  124. package/src/hooks/unless/unless.hook.ts +15 -0
  125. package/src/index.ts +5 -7
  126. package/src/internal.utils.ts +13 -0
  127. package/src/predicates/every/every.predicate.md +5 -0
  128. package/src/predicates/every/every.predicate.test.ts +186 -0
  129. package/src/predicates/every/every.predicate.ts +55 -0
  130. package/src/predicates/index.ts +8 -0
  131. package/src/predicates/is-context/is-context.predicate.md +4 -0
  132. package/src/predicates/is-context/is-context.predicate.test.ts +64 -0
  133. package/src/predicates/is-context/is-context.predicate.ts +45 -0
  134. package/src/predicates/is-multi/is-multi.predicate.md +4 -0
  135. package/src/predicates/is-multi/is-multi.predicate.test.ts +57 -0
  136. package/src/predicates/is-multi/is-multi.predicate.ts +29 -0
  137. package/src/predicates/is-paginated/is-paginated.predicate.md +5 -0
  138. package/src/predicates/is-paginated/is-paginated.predicate.test.ts +72 -0
  139. package/src/predicates/is-paginated/is-paginated.predicate.ts +19 -0
  140. package/src/predicates/is-provider/is-provider.predicate.md +4 -0
  141. package/src/predicates/is-provider/is-provider.predicate.test.ts +138 -0
  142. package/src/predicates/is-provider/is-provider.predicate.ts +27 -0
  143. package/src/predicates/not/not.predicate.md +5 -0
  144. package/src/predicates/not/not.predicate.test.ts +124 -0
  145. package/src/predicates/not/not.predicate.ts +22 -0
  146. package/src/predicates/should-skip/should-skip.predicate.md +5 -0
  147. package/src/predicates/should-skip/should-skip.predicate.test.ts +121 -0
  148. package/src/predicates/should-skip/should-skip.predicate.ts +38 -0
  149. package/src/predicates/some/some.predicate.md +5 -0
  150. package/src/predicates/some/some.predicate.test.ts +66 -0
  151. package/src/predicates/some/some.predicate.ts +58 -0
  152. package/src/resolvers/hooks/index.ts +4 -0
  153. package/src/resolvers/hooks/resolve-data.test.ts +131 -0
  154. package/src/resolvers/hooks/resolve-data.ts +20 -0
  155. package/src/resolvers/hooks/resolve-query.ts +20 -0
  156. package/src/resolvers/hooks/resolve-result.test.ts +215 -0
  157. package/src/resolvers/hooks/resolve-result.ts +22 -0
  158. package/src/resolvers/hooks/resolve.ts +55 -0
  159. package/src/resolvers/hooks/resolvers.internal.ts +118 -0
  160. package/src/resolvers/index.ts +1 -0
  161. package/src/transformers/index.ts +6 -0
  162. package/src/transformers/lowercase/lowercase.transformer.md +4 -0
  163. package/src/transformers/lowercase/lowercase.transformer.test.ts +42 -0
  164. package/src/transformers/lowercase/lowercase.transformer.ts +42 -0
  165. package/src/transformers/omit/omit.transformer.md +4 -0
  166. package/src/transformers/omit/omit.transformer.test.ts +41 -0
  167. package/src/transformers/omit/omit.transformer.ts +27 -0
  168. package/src/transformers/parse-date/parse-date.transformer.md +4 -0
  169. package/src/transformers/parse-date/parse-date.transformer.test.ts +43 -0
  170. package/src/transformers/parse-date/parse-date.transformer.ts +18 -0
  171. package/src/transformers/pick/pick.transformer.md +4 -0
  172. package/src/transformers/pick/pick.transformer.test.ts +29 -0
  173. package/src/transformers/pick/pick.transformer.ts +27 -0
  174. package/src/transformers/set-now/set-now.transformer.md +4 -0
  175. package/src/transformers/set-now/set-now.transformer.test.ts +30 -0
  176. package/src/transformers/set-now/set-now.transformer.ts +34 -0
  177. package/src/transformers/trim/trim.transformer.md +4 -0
  178. package/src/transformers/trim/trim.transformer.test.ts +42 -0
  179. package/src/transformers/trim/trim.transformer.ts +42 -0
  180. package/src/types.ts +55 -6
  181. package/src/utility-types/index.ts +1 -162
  182. package/src/utility-types/infer-service-methods.ts +190 -0
  183. package/src/utils/add-skip/add-skip.util.md +5 -0
  184. package/src/utils/add-skip/add-skip.util.test.ts +29 -0
  185. package/src/utils/add-skip/add-skip.util.ts +34 -0
  186. package/src/utils/check-context/check-context.util.md +4 -0
  187. package/src/utils/check-context/check-context.util.test.ts +107 -0
  188. package/src/utils/check-context/check-context.util.ts +24 -0
  189. package/src/utils/combine/combine.util.md +8 -0
  190. package/src/utils/combine/combine.util.test.ts +158 -0
  191. package/src/utils/combine/combine.util.ts +58 -0
  192. package/src/utils/context-to-json/context-to-json.util.md +4 -0
  193. package/src/utils/context-to-json/context-to-json.util.ts +18 -0
  194. package/src/utils/define-hooks/define-hooks.util.md +27 -0
  195. package/src/utils/define-hooks/define-hooks.util.test.ts +27 -0
  196. package/src/utils/define-hooks/define-hooks.util.ts +21 -0
  197. package/src/utils/get-data-is-array/get-data-is-array.util.md +4 -0
  198. package/src/utils/get-data-is-array/get-data-is-array.util.test.ts +31 -0
  199. package/src/utils/get-data-is-array/get-data-is-array.util.ts +25 -0
  200. package/src/utils/get-exposed-methods/get-exposed-methods.util.md +4 -0
  201. package/src/utils/get-exposed-methods/get-exposed-methods.util.test.ts +47 -0
  202. package/src/utils/get-exposed-methods/get-exposed-methods.util.ts +17 -0
  203. package/src/utils/get-paginate/get-paginate.util.md +4 -0
  204. package/src/utils/get-paginate/get-paginate.util.test.ts +73 -0
  205. package/src/utils/get-paginate/get-paginate.util.ts +29 -0
  206. package/src/utils/get-result-is-array/get-result-is-array.util.md +4 -0
  207. package/src/utils/get-result-is-array/get-result-is-array.util.test.ts +154 -0
  208. package/src/utils/get-result-is-array/get-result-is-array.util.ts +39 -0
  209. package/src/utils/index.ts +14 -17
  210. package/src/utils/iterate-find/iterate-find.util.md +4 -0
  211. package/src/utils/iterate-find/iterate-find.util.test.ts +86 -0
  212. package/src/utils/iterate-find/iterate-find.util.ts +55 -0
  213. package/src/utils/mutate-data/mutate-data.util.md +5 -0
  214. package/src/utils/mutate-data/mutate-data.util.ts +45 -0
  215. package/src/utils/mutate-result/mutate-result.util.md +5 -0
  216. package/src/utils/mutate-result/mutate-result.util.test.ts +175 -0
  217. package/src/utils/mutate-result/mutate-result.util.ts +75 -0
  218. package/src/utils/patch-batch/patch-batch.util.md +4 -0
  219. package/src/utils/patch-batch/patch-batch.util.test.ts +41 -0
  220. package/src/utils/patch-batch/patch-batch.util.ts +81 -0
  221. package/src/utils/skip-result/skip-result.util.md +4 -0
  222. package/src/utils/{setResultEmpty.ts → skip-result/skip-result.util.test.ts} +127 -158
  223. package/src/utils/skip-result/skip-result.util.ts +30 -0
  224. package/src/utils/transform-params/transform-params.util.md +4 -0
  225. package/src/utils/transform-params/transform-params.util.ts +18 -0
  226. package/dist/index.cjs +0 -1185
  227. package/dist/index.d.cts +0 -321
  228. package/dist/index.d.mts +0 -321
  229. package/dist/index.mjs +0 -1140
  230. package/src/.DS_Store +0 -0
  231. package/src/filters/array.ts +0 -30
  232. package/src/filters/index.ts +0 -2
  233. package/src/filters/object.ts +0 -27
  234. package/src/hooks/.DS_Store +0 -0
  235. package/src/hooks/checkMulti.ts +0 -177
  236. package/src/hooks/createRelated.ts +0 -62
  237. package/src/hooks/forEach.ts +0 -71
  238. package/src/hooks/from-client-for-server/common.ts +0 -1
  239. package/src/hooks/from-client-for-server/index.ts +0 -2
  240. package/src/hooks/from-client-for-server/paramsForServer.ts +0 -100
  241. package/src/hooks/from-client-for-server/paramsFromClient.ts +0 -105
  242. package/src/hooks/makeSequelizeQuery.ts_ +0 -90
  243. package/src/hooks/onDelete.ts +0 -77
  244. package/src/hooks/parseFields.ts +0 -29
  245. package/src/hooks/removeRelated.ts +0 -63
  246. package/src/hooks/runPerItem.ts +0 -47
  247. package/src/hooks/setData.ts +0 -587
  248. package/src/mixins/debounce-mixin/DebouncedStore.ts +0 -72
  249. package/src/mixins/debounce-mixin/debounceMixin.ts +0 -34
  250. package/src/mixins/debounce-mixin/index.ts +0 -3
  251. package/src/mixins/debounce-mixin/types.ts +0 -16
  252. package/src/mixins/debounce-mixin/utils.ts +0 -10
  253. package/src/mixins/index.ts +0 -1
  254. package/src/typesInternal.ts +0 -26
  255. package/src/utils/_utils.internal.ts +0 -16
  256. package/src/utils/defineHooks.ts +0 -16
  257. package/src/utils/deflattenQuery.ts +0 -109
  258. package/src/utils/filterQuery.ts +0 -170
  259. package/src/utils/flattenQuery.ts +0 -198
  260. package/src/utils/getItemsIsArray.ts +0 -322
  261. package/src/utils/getPaginate.ts +0 -102
  262. package/src/utils/isMulti.ts +0 -78
  263. package/src/utils/isPaginated.ts +0 -89
  264. package/src/utils/markHookForSkip.ts +0 -440
  265. package/src/utils/mergeQuery/index.ts +0 -3
  266. package/src/utils/mergeQuery/mergeArrays.ts +0 -118
  267. package/src/utils/mergeQuery/mergeQuery.ts +0 -562
  268. package/src/utils/mergeQuery/types.ts +0 -23
  269. package/src/utils/mergeQuery/utils.ts +0 -483
  270. package/src/utils/optimizeBatchPatch.ts +0 -98
  271. package/src/utils/pushSet.ts +0 -98
  272. package/src/utils/setQueryKeySafely.ts +0 -221
  273. package/src/utils/shouldSkip.ts +0 -161
  274. package/src/utils/toJSON.ts +0 -8
  275. 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) 2023 Frederik Schmatz
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
- # feathers-utils
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
  [![npm](https://img.shields.io/npm/v/feathers-utils)](https://www.npmjs.com/package/feathers-utils)
4
- [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/fratzinger/feathers-utils/node.js.yml?branch=main)](https://github.com/fratzinger/feathers-utils/actions/workflows/node.js.yml?query=branch%3Amain)
5
- [![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability/fratzinger/feathers-utils)](https://codeclimate.com/github/fratzinger/feathers-utils)
6
- [![Code Climate coverage](https://img.shields.io/codeclimate/coverage/fratzinger/feathers-utils)](https://codeclimate.com/github/fratzinger/feathers-utils)
90
+ [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/feathersjs/feathers-utils/CI/master)](https://github.com/feathersjs/feathers-utils/actions/workflows/nodejs.yml?query=branch%3Amaster)
91
+ [![libraries.io](https://img.shields.io/librariesio/release/npm/feathers-utils)](https://libraries.io/npm/feathers-utils)
7
92
  [![npm](https://img.shields.io/npm/dm/feathers-utils)](https://www.npmjs.com/package/feathers-utils)
8
- [![GitHub license](https://img.shields.io/github/license/fratzinger/feathers-utils)](https://github.com/fratzinger/feathers-utils/blob/main/LICENSE.md)
9
-
10
- > NOTE: This is the version for Feathers v5. For Feathers v4 use [feathers-utils v1](https://github.com/fratzinger/feathers-utils/tree/crow)
93
+ [![GitHub license](https://img.shields.io/github/license/feathersjs/feathers-utils)](https://github.com/feathersjs/feathers-utils/blob/master/LICENSE)
94
+ [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx)
11
95
 
96
+ A collection of useful hooks and utils to use with Feathers services.
12
97
 
13
- ## Installation
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
- ## Usage
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"]}