feathers-utils 10.2.0 → 10.4.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 (50) hide show
  1. package/dist/{hooks-tfw03iVM.mjs → hooks-D_u2QFhM.mjs} +65 -65
  2. package/dist/{hooks-tfw03iVM.mjs.map → hooks-D_u2QFhM.mjs.map} +1 -1
  3. package/dist/hooks.d.mts +48 -48
  4. package/dist/hooks.mjs +4 -4
  5. package/dist/{index-CKAzIogj.d.mts → index-H1zXVhff.d.mts} +209 -105
  6. package/dist/index.d.mts +2 -2
  7. package/dist/index.mjs +7 -7
  8. package/dist/internal.utils-CWuBYzpQ.mjs +120 -0
  9. package/dist/internal.utils-CWuBYzpQ.mjs.map +1 -0
  10. package/dist/{mutate-result.util-Dqzepn1M.mjs → mutate-result.util-mxvMl6bw.mjs} +2 -2
  11. package/dist/mutate-result.util-mxvMl6bw.mjs.map +1 -0
  12. package/dist/{predicates-puYa4nkf.mjs → predicates-CR4O2nSr.mjs} +53 -53
  13. package/dist/{predicates-puYa4nkf.mjs.map → predicates-CR4O2nSr.mjs.map} +1 -1
  14. package/dist/predicates.d.mts +18 -18
  15. package/dist/predicates.mjs +1 -1
  16. package/dist/{resolve-B9hRleHY.mjs → resolve-BbbdWdlO.mjs} +2 -2
  17. package/dist/{resolve-B9hRleHY.mjs.map → resolve-BbbdWdlO.mjs.map} +1 -1
  18. package/dist/resolvers.mjs +1 -1
  19. package/dist/{transform-result.hook-B65pTRJO.mjs → transform-result.hook-0D676rcY.mjs} +2 -2
  20. package/dist/{transform-result.hook-B65pTRJO.mjs.map → transform-result.hook-0D676rcY.mjs.map} +1 -1
  21. package/dist/transformers.mjs +3 -3
  22. package/dist/{utils-BAIcSl7u.mjs → utils-sTvj8-Jy.mjs} +467 -209
  23. package/dist/utils-sTvj8-Jy.mjs.map +1 -0
  24. package/dist/utils.d.mts +2 -2
  25. package/dist/utils.mjs +4 -4
  26. package/package.json +1 -1
  27. package/src/common/dedupe-branches.ts +42 -0
  28. package/src/common/flatten-and-branches.ts +56 -0
  29. package/src/common/flatten-or-branches.ts +52 -0
  30. package/src/common/index.ts +4 -0
  31. package/src/common/is-empty-object.ts +38 -0
  32. package/src/hooks/index.ts +1 -1
  33. package/src/predicates/index.ts +3 -3
  34. package/src/utils/add-to-query/add-to-query.util.ts +19 -1
  35. package/src/utils/index.ts +6 -4
  36. package/src/utils/merge-query/extract-query-filters.ts +80 -0
  37. package/src/utils/merge-query/has-conflict.ts +39 -0
  38. package/src/utils/merge-query/logical-branches.ts +39 -0
  39. package/src/utils/merge-query/merge-query-bodies.ts +152 -0
  40. package/src/utils/merge-query/merge-query.util.ts +105 -0
  41. package/src/utils/merge-query/merge-select.ts +64 -0
  42. package/src/utils/replace-data/replace-data.util.ts +4 -4
  43. package/src/utils/replace-result/replace-result.util.ts +18 -18
  44. package/src/utils/simplify-query/merge-and-branches-up.ts +86 -0
  45. package/src/utils/simplify-query/merge-or-branch-up.ts +74 -0
  46. package/src/utils/simplify-query/simplify-query.util.ts +98 -0
  47. package/dist/internal.utils-BMzV_-xp.mjs +0 -55
  48. package/dist/internal.utils-BMzV_-xp.mjs.map +0 -1
  49. package/dist/mutate-result.util-Dqzepn1M.mjs.map +0 -1
  50. package/dist/utils-BAIcSl7u.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { r as mutateData, t as mutateResult } from "./mutate-result.util-Dqzepn1M.mjs";
1
+ import { r as mutateData, t as mutateResult } from "./mutate-result.util-mxvMl6bw.mjs";
2
2
  //#region src/hooks/transform-data/transform-data.hook.ts
3
3
  /**
4
4
  * Transforms each item in `context.data` using the provided transformer function.
@@ -75,4 +75,4 @@ const transformResult = (transformer, options) => async (context, next) => {
75
75
  //#endregion
76
76
  export { transformQuery as n, transformData as r, transformResult as t };
77
77
 
78
- //# sourceMappingURL=transform-result.hook-B65pTRJO.mjs.map
78
+ //# sourceMappingURL=transform-result.hook-0D676rcY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform-result.hook-B65pTRJO.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,WAAW;CAErC,IAAI,MACF,MAAM,KAAK;AAEf;;;;;;;;;;;;;;;;;;;AClBF,MAAa,kBAIX,gBACG;CAGH,SAAS,KAAK,SAAY,MAA2C;EACnE,QAAQ,OAAO,QAAQ,YAAY,QAAQ,OAAO,SAAS,CAAC,GAAG;GAC7D;GACA,GAAG;EACL,CAAC;EAED,IAAI,MAAM,OAAO,KAAK;CAGxB;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACPA,MAAa,mBAET,aACA,YAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,aAAa,SAAS,aAAa;EACvC;EACA,UAAU,SAAS;CACrB,CAAC;AACH"}
1
+ {"version":3,"file":"transform-result.hook-0D676rcY.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,WAAW;CAErC,IAAI,MACF,MAAM,KAAK;AAEf;;;;;;;;;;;;;;;;;;;AClBF,MAAa,kBAIX,gBACG;CAGH,SAAS,KAAK,SAAY,MAA2C;EACnE,QAAQ,OAAO,QAAQ,YAAY,QAAQ,OAAO,SAAS,CAAC,GAAG;GAC7D;GACA,GAAG;EACL,CAAC;EAED,IAAI,MAAM,OAAO,KAAK;CAGxB;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACPA,MAAa,mBAET,aACA,YAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,aAAa,SAAS,aAAa;EACvC;EACA,UAAU,SAAS;CACrB,CAAC;AACH"}
@@ -1,6 +1,6 @@
1
- import { r as toArray } from "./internal.utils-BMzV_-xp.mjs";
2
- import { r as mutateData, t as mutateResult } from "./mutate-result.util-Dqzepn1M.mjs";
3
- import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-B65pTRJO.mjs";
1
+ import { r as toArray } from "./internal.utils-CWuBYzpQ.mjs";
2
+ import { r as mutateData, t as mutateResult } from "./mutate-result.util-mxvMl6bw.mjs";
3
+ import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-0D676rcY.mjs";
4
4
  import { BadRequest } from "@feathersjs/errors";
5
5
  import _get from "lodash/get.js";
6
6
  import _set from "lodash/set.js";