feathers-utils 10.0.0 → 10.0.2

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 (80) hide show
  1. package/dist/{hooks-DPFxxjBu.mjs → hooks-yFJ5FmU5.mjs} +115 -99
  2. package/dist/hooks-yFJ5FmU5.mjs.map +1 -0
  3. package/dist/hooks.d.mts +98 -29
  4. package/dist/hooks.mjs +4 -4
  5. package/dist/{index-CNrzxmWo.d.mts → index-CgAuzxiv.d.mts} +49 -4
  6. package/dist/index.d.mts +4 -4
  7. package/dist/index.mjs +7 -7
  8. package/dist/{internal.utils-BWQ25nOd.mjs → internal.utils-3BrB8lRY.mjs} +8 -2
  9. package/dist/internal.utils-3BrB8lRY.mjs.map +1 -0
  10. package/dist/{mutate-result.util-CCBWix-G.mjs → mutate-result.util-B6FOkwrd.mjs} +73 -11
  11. package/dist/mutate-result.util-B6FOkwrd.mjs.map +1 -0
  12. package/dist/{predicates-CT08opkD.mjs → predicates-BC8p_YLo.mjs} +27 -24
  13. package/dist/predicates-BC8p_YLo.mjs.map +1 -0
  14. package/dist/predicates.d.mts +2 -2
  15. package/dist/predicates.mjs +1 -1
  16. package/dist/{resolve-Cx9osy8O.mjs → resolve-ClHfNFlm.mjs} +3 -3
  17. package/dist/resolve-ClHfNFlm.mjs.map +1 -0
  18. package/dist/resolvers.mjs +1 -1
  19. package/dist/{transform-result.hook-BUwLePT2.d.mts → transform-result.hook-C8-4Lezj.d.mts} +8 -5
  20. package/dist/{transform-result.hook-CevWK5TA.mjs → transform-result.hook-CanJtTPV.mjs} +13 -12
  21. package/dist/transform-result.hook-CanJtTPV.mjs.map +1 -0
  22. package/dist/transformers.d.mts +1 -1
  23. package/dist/transformers.mjs +8 -4
  24. package/dist/transformers.mjs.map +1 -1
  25. package/dist/{unless.hook-BYWO9hzO.d.mts → unless.hook-BX0mOvdN.d.mts} +6 -3
  26. package/dist/{utils-1I_iPZkV.mjs → utils-BrvpblXB.mjs} +38 -19
  27. package/dist/utils-BrvpblXB.mjs.map +1 -0
  28. package/dist/utils.d.mts +2 -2
  29. package/dist/utils.mjs +4 -4
  30. package/package.json +1 -1
  31. package/src/common/clone.ts +9 -7
  32. package/src/hooks/cache/cache-utils.ts +5 -18
  33. package/src/hooks/cache/cache.hook.ts +37 -16
  34. package/src/hooks/check-multi/check-multi.hook.ts +5 -2
  35. package/src/hooks/check-required/check-required.hook.ts +6 -1
  36. package/src/hooks/create-related/create-related.hook.ts +2 -2
  37. package/src/hooks/debug/debug.hook.ts +1 -1
  38. package/src/hooks/disable-pagination/disable-pagination.hook.ts +7 -4
  39. package/src/hooks/disallow/disallow.hook.ts +10 -3
  40. package/src/hooks/on-delete/on-delete.hook.ts +61 -41
  41. package/src/hooks/params-for-server/params-for-server.hook.ts +16 -5
  42. package/src/hooks/params-from-client/params-from-client.hook.ts +10 -6
  43. package/src/hooks/rate-limit/rate-limit.hook.ts +2 -2
  44. package/src/hooks/set-data/set-data.hook.ts +8 -7
  45. package/src/hooks/set-field/set-field.hook.ts +42 -17
  46. package/src/hooks/set-result/set-result.hook.ts +16 -3
  47. package/src/hooks/set-slug/set-slug.hook.ts +8 -6
  48. package/src/hooks/skippable/skippable.hook.ts +17 -12
  49. package/src/hooks/soft-delete/soft-delete.hook.ts +4 -5
  50. package/src/hooks/stashable/stashable.hook.ts +9 -8
  51. package/src/hooks/throw-if/throw-if.hook.ts +2 -2
  52. package/src/hooks/transform-data/transform-data.hook.ts +2 -4
  53. package/src/hooks/transform-query/transform-query.hook.ts +6 -5
  54. package/src/hooks/transform-result/transform-result.hook.ts +6 -9
  55. package/src/hooks/traverse/traverse.hook.ts +30 -10
  56. package/src/internal.utils.ts +6 -1
  57. package/src/predicates/and/and.predicate.ts +5 -5
  58. package/src/predicates/is-context/is-context.predicate.ts +1 -1
  59. package/src/predicates/or/or.predicate.ts +6 -8
  60. package/src/resolvers/resolve-result/resolve-result.ts +4 -1
  61. package/src/transformers/parse-date/parse-date.transformer.ts +6 -1
  62. package/src/utils/chunk-find/chunk-find.util.ts +7 -0
  63. package/src/utils/combine/combine.util.ts +8 -15
  64. package/src/utils/get-paginate/get-paginate.util.ts +1 -3
  65. package/src/utils/index.ts +2 -0
  66. package/src/utils/iterate-find/iterate-find.util.ts +8 -0
  67. package/src/utils/mutate-data/mutate-data.util.ts +21 -4
  68. package/src/utils/mutate-result/mutate-result.util.ts +4 -10
  69. package/src/utils/patch-batch/patch-batch.util.ts +32 -14
  70. package/src/utils/replace-data/replace-data.util.ts +26 -0
  71. package/src/utils/replace-result/replace-result.util.ts +60 -0
  72. package/src/utils/sort-query-properties/sort-query-properties.util.ts +15 -8
  73. package/src/utils/walk-query/walk-query.util.ts +2 -2
  74. package/dist/hooks-DPFxxjBu.mjs.map +0 -1
  75. package/dist/internal.utils-BWQ25nOd.mjs.map +0 -1
  76. package/dist/mutate-result.util-CCBWix-G.mjs.map +0 -1
  77. package/dist/predicates-CT08opkD.mjs.map +0 -1
  78. package/dist/resolve-Cx9osy8O.mjs.map +0 -1
  79. package/dist/transform-result.hook-CevWK5TA.mjs.map +0 -1
  80. package/dist/utils-1I_iPZkV.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-yFJ5FmU5.mjs","names":["defaultError","_traverse"],"sources":["../src/hooks/cache/cache-utils.ts","../src/hooks/cache/cache.hook.ts","../src/hooks/check-multi/check-multi.hook.ts","../src/hooks/check-required/check-required.hook.ts","../src/hooks/create-related/create-related.hook.ts","../src/hooks/debug/debug.hook.ts","../src/hooks/disable-pagination/disable-pagination.hook.ts","../src/hooks/disallow/disallow.hook.ts","../src/hooks/on-delete/on-delete.hook.ts","../src/hooks/params-for-server/params-for-from-shared.ts","../src/hooks/params-for-server/params-for-server.hook.ts","../src/hooks/params-from-client/params-from-client.hook.ts","../src/hooks/prevent-changes/prevent-changes.hook.ts","../src/hooks/rate-limit/rate-limit.hook.ts","../src/hooks/set-data/set-data.hook.ts","../src/hooks/set-field/set-field.hook.ts","../src/hooks/set-result/set-result.hook.ts","../src/hooks/set-slug/set-slug.hook.ts","../src/hooks/soft-delete/soft-delete.hook.ts","../src/hooks/stashable/stashable.hook.ts","../src/hooks/throw-if-is-multi/throw-if-is-multi.hook.ts","../src/hooks/throw-if-is-provider/throw-if-is-provider.hook.ts","../src/hooks/traverse/traverse.hook.ts"],"sourcesContent":["import { sortQueryProperties } from '../../utils/sort-query-properties/sort-query-properties.util.js'\n\nexport { sortQueryProperties }\n\nexport const stableStringify = (obj: Record<string, any>) => {\n // Canonicalize the whole params object once (recursive key-sort + operator-array\n // sort). The JSON.stringify pass then only needs to reject non-JSON values\n // instead of re-sorting and re-allocating every node.\n const normalized = sortQueryProperties(obj as any)\n\n return JSON.stringify(normalized, (_key, value) => {\n if (typeof value === 'function') {\n throw new Error('Cannot stringify non JSON value')\n }\n return value\n })\n}\n","import type { HookContext, NextFunction, Params } from '@feathersjs/feathers'\nimport { stableStringify } from './cache-utils.js'\nimport { copy } from 'fast-copy'\nimport type { Promisable } from '../../internal.utils.js'\n\ntype Cache = {\n get: (key: string) => Promisable<any>\n set: (key: string, value: any) => Promisable<any>\n delete: (key: string) => Promisable<any>\n clear: () => any\n keys: () => IterableIterator<string>\n}\n\nexport type CacheEvent =\n | { type: 'hit'; method: string; key: string }\n | { type: 'miss'; method: string; key: string }\n | { type: 'set'; method: string; key: string }\n | { type: 'invalidate'; method: string; key: string }\n | { type: 'clear'; method: string }\n\nexport type CacheOptions = {\n /**\n * The cache implementation to use. It should implement the methods `get`, `set`, `delete`, `clear`, and `keys`.\n * This can be a Map, Redis client, or any other cache implementation.\n *\n * Use 'lru-cache' for an LRU cache implementation.\n */\n map: Cache\n /**\n * The id field to use for caching. Defaults to `service.options.id` and if not found, then 'id'.\n */\n id?: string\n /**\n * params are stringified for the key-value cache.\n * There are params properties you don't want to include in the cache key.\n * You can use this function to transform the params before they are stringified.\n */\n transformParams: (params: Params) => Params\n /**\n * Custom serialization function for converting params into a cache key string.\n * By default, uses `stableStringify` which sorts object keys and normalizes\n * query operator arrays (`$or`, `$and`, `$in`, etc.) for order-independent caching.\n *\n * Override this to use a custom serialization strategy.\n *\n * @example\n * ```ts\n * cache({\n * map: new Map(),\n * transformParams: (params) => ({ query: params.query }),\n * serialize: (params) => JSON.stringify(params),\n * })\n * ```\n */\n serialize?: (params: Params) => string\n /**\n * Optional logger callback for cache events (hit, miss, set, invalidate, clear).\n * Useful for debugging and monitoring cache behavior.\n *\n * @example\n * ```ts\n * cache({\n * map: new Map(),\n * transformParams: (params) => ({ query: params.query }),\n * logger: (event) => console.log(`cache ${event.type}`, event),\n * })\n * ```\n */\n logger?: (event: CacheEvent) => void\n /**\n * How to clone results on store and on hit so callers can't mutate the shared\n * cached object. Defaults to a `fast-copy` deep clone.\n *\n * Set to `false` to skip cloning entirely (fastest, but the caller MUST treat\n * results as immutable), or pass a custom clone function (e.g. `structuredClone`).\n *\n * @default true\n */\n clone?: boolean | (<T>(value: T) => T)\n}\n\n/**\n * Caches `get` and `find` results based on `params`. On mutating methods (`create`, `update`,\n * `patch`, `remove`), affected cache entries are automatically invalidated.\n * Works as a `before`, `after`, or `around` hook.\n *\n * @example\n * ```ts\n * import { cache } from 'feathers-utils/hooks'\n *\n * const myCache = new Map()\n *\n * app.service('users').hooks({\n * around: {\n * all: [cache({ map: myCache, transformParams: (params) => ({ query: params.query }) })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/cache.html\n */\nexport const cache = <H extends HookContext = HookContext>(\n options: CacheOptions,\n) => {\n const cacheMap = new ContextCacheMap(options)\n return async (context: H, next?: NextFunction): Promise<void> => {\n if (context.type === 'before') {\n return await cacheBefore(context, cacheMap)\n }\n if (context.type === 'after') {\n return await cacheAfter(context, cacheMap)\n }\n\n if (context.type === 'around' && next) {\n await cacheBefore(context, cacheMap)\n await next()\n await cacheAfter(context, cacheMap)\n return\n }\n }\n}\n\nconst cacheBefore = async (\n context: HookContext,\n cacheMap: ContextCacheMap,\n): Promise<void> => {\n if (context.method === 'get' || context.method === 'find') {\n const value = await cacheMap.get(context)\n if (value) {\n context.result = value\n }\n }\n}\n\nconst cacheAfter = async (\n context: HookContext,\n cacheMap: ContextCacheMap,\n): Promise<void> => {\n if (context.method === 'get' || context.method === 'find') {\n await cacheMap.set(context)\n } else {\n await cacheMap.clear(context)\n }\n}\n\nclass ContextCacheMap {\n map: Cache\n private delimiter = ':'\n private options: CacheOptions\n private log: ((event: CacheEvent) => void) | undefined\n private serialize: (params: Params) => string\n private clone: <T>(value: T) => T\n\n constructor(options: CacheOptions) {\n this.map = options.map\n this.options = options\n this.log = options.logger\n this.serialize = options.serialize ?? stableStringify\n this.clone =\n options.clone === false\n ? (value) => value\n : typeof options.clone === 'function'\n ? options.clone\n : copy\n }\n\n private stringifyCacheKey(context: HookContext) {\n if (context.method !== 'get' && context.method !== 'find') {\n throw new Error(\n `Cache can only be used with 'get' or 'find' methods, not '${context.method}'`,\n )\n }\n\n const stringifiedParams = this.serialize(\n this.options.transformParams(context.params ?? {}),\n )\n\n return `${context.id ?? 'null'}${this.delimiter}${stringifiedParams}`\n }\n\n private getCachedId(key: string) {\n const index = key.indexOf(this.delimiter)\n if (index === -1) {\n throw new Error(\n `Cache key '${key}' does not contain a delimiter '${this.delimiter}'`,\n )\n }\n return key.substring(0, index)\n }\n\n private getId(item: Record<string, any>, context: HookContext) {\n const idField = context.service.options?.id || this.options.id || 'id'\n const id = item[idField]\n return id && id.toString ? id.toString() : id\n }\n\n /**\n * Called before get() and find()\n *\n * returns a cached result for the given context if it exists.\n */\n async get(context: HookContext) {\n const key = this.stringifyCacheKey(context)\n const result = await this.map.get(key)\n if (result) {\n this.log?.({ type: 'hit', method: context.method, key })\n return this.clone(result) // clone to avoid mutation of the cached result\n }\n this.log?.({ type: 'miss', method: context.method, key })\n }\n\n /**\n * Called after get() and find()\n *\n * Caches the result for the given context.\n */\n async set(context: HookContext) {\n const key = this.stringifyCacheKey(context)\n this.log?.({ type: 'set', method: context.method, key })\n // clone to avoid later mutation of the cached result\n return this.map.set(key, this.clone(context.result))\n }\n\n // Called after create(), update(), patch(), and remove()\n async clear<H extends HookContext>(context: H): Promise<H> {\n const results = Array.isArray(context.result)\n ? context.result\n : [context.result]\n\n const promises: Promise<any>[] = []\n\n const itemIds = results\n .map((item: any) => this.getId(item, context))\n .filter(Boolean)\n\n // If no itemIds are found, clear the entire cache to avoid stale data\n if (!itemIds.length) {\n this.log?.({ type: 'clear', method: context.method })\n await this.map.clear()\n return context\n }\n\n // O(1) membership instead of an O(itemIds) scan per cached key.\n const idSet = new Set<string>(itemIds.map((id: any) => `${id}`))\n\n for (const key of this.map.keys()) {\n const cachedId = this.getCachedId(key)\n if (cachedId === 'null') {\n // This is a cached `find` request. Any create/patch/update/del\n // could affect the results of this query so it should be deleted\n this.log?.({ type: 'invalidate', method: context.method, key })\n promises.push(this.map.delete(key))\n continue\n }\n\n // This is a cached `get` request\n\n if (context.method === 'create') {\n // If this is a create, we don't need to delete any cached get requests\n continue\n }\n\n if (idSet.has(cachedId)) {\n // If the cached id matches a mutated item id, delete the cached get\n this.log?.({ type: 'invalidate', method: context.method, key })\n promises.push(this.map.delete(key))\n }\n }\n\n await Promise.all(promises)\n\n return context\n }\n}\n","import type { FeathersError } from '@feathersjs/errors'\nimport { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { isMulti } from '../../predicates/index.js'\n\nexport type CheckMultiOptions = {\n /**\n * Customize the error that is thrown if the service does not allow multi operations.\n *\n * If not provided, throws a `MethodNotAllowed` error with a message indicating the operation.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Checks if the `multi` option is enabled for the current method and throws a\n * `MethodNotAllowed` error if multi operations are not permitted.\n * Useful to guard against accidental bulk `create`, `patch`, or `remove` calls.\n *\n * @example\n * ```ts\n * import { checkMulti } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { create: [checkMulti()] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/check-multi.html\n */\nexport function checkMulti<H extends HookContext = HookContext>(\n options?: CheckMultiOptions,\n) {\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n const { service, method } = context\n if (\n !service.allowsMulti ||\n !isMulti(context) ||\n method === 'find' ||\n service.allowsMulti(method)\n ) {\n if (next) return next()\n return\n }\n\n throw options?.error\n ? options.error(context)\n : new MethodNotAllowed(`Can not ${method} multiple entries`)\n }\n return hook\n}\n","import _get from 'lodash/get.js'\nimport _has from 'lodash/has.js'\nimport { BadRequest } from '@feathersjs/errors'\n\nimport { checkContext, getDataIsArray } from '../../utils/index.js'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\n/**\n * Validates that the specified fields exist on `context.data` and are not falsy.\n * Numeric `0` and boolean `false` are treated as valid values.\n * Throws a `BadRequest` error if any required field is missing or null.\n *\n * @example\n * ```ts\n * import { checkRequired } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { create: [checkRequired(['email', 'password'])] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/check-required.html\n */\nexport function checkRequired<H extends HookContext = HookContext>(\n fieldNames: MaybeArray<string>,\n) {\n const fieldNamesArray = toArray(fieldNames)\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 checkContext(context, {\n type: ['before', 'around'],\n method: ['create', 'update', 'patch'],\n label: 'checkRequired',\n })\n\n const { data } = getDataIsArray(context)\n\n for (let i = 0; i < data.length; i++) {\n const item = data[i]\n\n for (let j = 0; j < fieldNamesArray.length; j++) {\n const name = fieldNamesArray[j]\n\n if (!_has(item, name)) {\n throw new BadRequest(`Field ${name} does not exist. (required)`)\n }\n\n const value = _get(item, name)\n\n if (!value && value !== 0 && value !== false) {\n throw new BadRequest(`Field ${name} is null. (required)`)\n }\n }\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { checkContext, getResultIsArray } from '../../utils/index.js'\nimport type { MaybeArray, Promisable } from '../../internal.utils.js'\nimport type { InferCreateDataSingle } from '../../utility-types/infer-service-methods.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport interface CreateRelatedOptions<\n H extends HookContext = HookContext,\n Services extends H['app']['services'] = H['app']['services'],\n S extends keyof Services = keyof Services,\n> {\n service: S\n /**\n * Is relevant when the current context result is an array.\n *\n * If true, will create multiple related records in a single call to the related service's create method.\n * If false or not provided, will create related records one by one.\n *\n * @default false\n */\n multi?: boolean\n /**\n * A function that returns the data to be created in the related service.\n *\n * Receives the current item from the context result and the full hook context as arguments.\n * Can return a single data object, an array of data objects, or a promise that resolves to either.\n *\n * If the function returns undefined, no related record will be created for that item.\n */\n data: (\n item: ResultSingleHookContext<H>,\n context: H,\n ) => Promisable<MaybeArray<InferCreateDataSingle<Services[S]>> | undefined>\n}\n\n/**\n * Creates related records in other services after a successful `create` call.\n * For each result item, a `data` function produces the record to create in the target service.\n * Supports creating records one-by-one or in a single multi-create when `multi: true`.\n *\n * @example\n * ```ts\n * import { createRelated } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * after: {\n * create: [createRelated({ service: 'profiles', data: (user) => ({ userId: user.id }) })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/create-related.html\n */\nexport function createRelated<H extends HookContext = HookContext>(\n options: MaybeArray<CreateRelatedOptions<H>>,\n) {\n return async (context: H, next?: NextFunction): Promise<void> => {\n checkContext(context, {\n type: ['after', 'around'],\n method: ['create'],\n label: 'createRelated',\n })\n\n if (next) {\n await next()\n }\n\n const { result } = getResultIsArray(context)\n\n const entries = Array.isArray(options) ? options : [options]\n\n await Promise.all(\n entries.map(async (entry) => {\n const { data, service, multi } = entry\n\n const dataToCreate = (\n await Promise.all(result.map(async (item) => data(item, context)))\n )\n .flat()\n .filter((x) => !!x)\n\n if (!dataToCreate || dataToCreate.length <= 0) {\n return\n }\n\n if (multi || dataToCreate.length === 1) {\n await context.app\n .service(service as string)\n .create(\n dataToCreate.length === 1\n ? (dataToCreate[0] as any)\n : (dataToCreate as any),\n )\n } else {\n await Promise.all(\n dataToCreate.map(async (item) =>\n context.app.service(service as string).create(item as any),\n ),\n )\n }\n }),\n )\n }\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\n\n/**\n * Logs the current hook context to the console for debugging purposes.\n * Displays timestamp, service path, method, type, id, data, query, result, and\n * any additional param fields you specify.\n *\n * @example\n * ```ts\n * import { debug } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { find: [debug('before find', 'user')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/debug.html\n */\nexport const debug =\n <H extends HookContext = HookContext>(msg: string, ...fieldNames: string[]) =>\n async (context: H, next?: NextFunction): Promise<void> => {\n if (next) {\n await next()\n }\n\n // display timestamp\n const now = new Date()\n console.log(\n `${now.getFullYear()}-${\n now.getMonth() + 1\n }-${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`,\n )\n\n if (msg) {\n console.log(msg)\n }\n\n // display service, method & type of hook (before/after/error)\n console.log(\n `${context.type} service('${context.path}').${context.method}()`,\n )\n\n // display id for get, patch, update & remove\n if (!['find', 'create'].includes(context.method) && 'id' in context) {\n console.log('id:', context.id)\n }\n\n if (context.data) {\n console.log('data:', context.data)\n }\n\n if (context.params?.query) {\n console.log('query:', context.params.query)\n }\n\n if (context.result) {\n console.log('result:', context.result)\n }\n\n // display additional params\n const params = context.params || {}\n console.log('params props:', Object.keys(params).sort())\n\n fieldNames.forEach((name) => {\n console.log(`params.${name}:`, params[name])\n })\n\n if (context.error) {\n console.log('error', context.error)\n }\n }\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { checkContext } from '../../utils/index.js'\n\n/**\n * Disables pagination when `query.$limit` is `-1` or `'-1'`.\n * Removes the `$limit` from the query and sets `params.paginate = false`.\n * Must be used as a `before` or `around` hook on the `find` method.\n *\n * @example\n * ```ts\n * import { disablePagination } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { find: [disablePagination()] }\n * })\n * // Then call: app.service('users').find({ query: { $limit: -1 } })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/disable-pagination.html\n */\nexport const disablePagination = <H extends HookContext = HookContext>() => {\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 checkContext(context, {\n type: ['before', 'around'],\n method: ['find'],\n label: 'disablePagination',\n })\n const $limit = context.params?.query?.$limit\n\n if ($limit === '-1' || $limit === -1) {\n context.params.paginate = false\n delete context.params.query.$limit\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { TransportName } from '../../types.js'\nimport { isProvider } from '../../predicates/index.js'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\n/**\n * Prevents access to a service method completely or for specific transports.\n * When called without arguments, the method is blocked for all callers.\n * When called with transport names, only those transports are blocked.\n *\n * @example\n * ```ts\n * import { disallow } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: {\n * remove: [disallow('external')], // block external access\n * update: [disallow()], // block completely\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/disallow.html\n */\nexport const disallow = <H extends HookContext = HookContext>(\n transports?: MaybeArray<TransportName>,\n) => {\n const transportsArr = toArray(transports)\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 // No transports (undefined) or an empty list means \"block completely\".\n // Fail closed for a guard hook rather than throwing a confusing internal error.\n if (!transports || transportsArr.length === 0) {\n throw new MethodNotAllowed('Method not allowed')\n }\n\n if (isProvider(...(transportsArr as TransportName[]))(context)) {\n throw new MethodNotAllowed(\n `Provider '${context.params.provider}' can not call '${context.method}' on '${context.path}'. (disallow)`,\n )\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { checkContext, getResultIsArray } from '../../utils/index.js'\nimport type { MaybeArray, NeverFallback } from '../../internal.utils.js'\nimport type {\n InferFindParams,\n InferGetResult,\n} from '../../utility-types/infer-service-methods.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type OnDeleteAction = 'cascade' | 'set null'\n\nexport interface OnDeleteOptions<\n H extends HookContext = HookContext,\n S extends keyof H['app']['services'] = keyof H['app']['services'],\n> {\n /**\n * The related service where related items should be manipulated\n */\n service: S\n /**\n * The propertyKey in the related service\n */\n keyThere: NeverFallback<keyof InferGetResult<H['app']['services'][S]>, string>\n /**\n * The propertyKey in the current service.\n */\n keyHere: keyof ResultSingleHookContext<H>\n /**\n * The action to perform on the related items.\n *\n * - `cascade`: remove related items\n * - `set null`: set the related property to null\n */\n onDelete: OnDeleteAction\n /**\n * Additional query to merge into the service call.\n * Typed based on the related service's query type.\n */\n query?: InferFindParams<H['app']['services'][S]>['query']\n /**\n * If true, the hook will wait for the service to finish before continuing\n *\n * @default false\n */\n blocking?: boolean\n /**\n * Called when a non-blocking (`blocking: false`) related-service call rejects.\n * Without this, fire-and-forget rejections are swallowed (but never leak as an\n * unhandled rejection). In `blocking` mode the error is thrown to the caller instead.\n */\n onError?: (error: any, context: H) => void\n}\n\n/**\n * Manipulates related items when a record is deleted, similar to SQL foreign key actions.\n * Supports `'cascade'` (remove related records) and `'set null'` (nullify the foreign key).\n * Unlike database-level cascades, this hook triggers service events and hooks for related items.\n *\n * @example\n * ```ts\n * import { onDelete } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * after: {\n * remove: [onDelete({ service: 'posts', keyHere: 'id', keyThere: 'userId', onDelete: 'cascade' })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/on-delete.html\n */\ntype OnDeleteOptionsDistributed<H extends HookContext> = {\n [S in keyof H['app']['services'] & string]: OnDeleteOptions<H, S>\n}[keyof H['app']['services'] & string]\n\nexport const onDelete = <H extends HookContext = HookContext>(\n options: MaybeArray<OnDeleteOptionsDistributed<H>>,\n) => {\n const optionsMulti = Array.isArray(options) ? options : [options]\n\n return async (context: H, next?: NextFunction): Promise<void> => {\n checkContext(context, {\n type: ['after', 'around'],\n method: 'remove',\n label: 'onDelete',\n })\n\n if (next) {\n await next()\n }\n\n const { result } = getResultIsArray(context)\n\n if (!result.length) {\n return\n }\n\n const blockingPromises: Promise<any>[] = []\n\n for (const {\n keyHere,\n keyThere,\n onDelete,\n service,\n blocking,\n query,\n onError,\n } of optionsMulti) {\n let ids = result.map((x) => x[keyHere]).filter((x) => !!x)\n ids = [...new Set(ids)]\n\n if (!ids || ids.length <= 0) {\n continue\n }\n\n const params = {\n query: {\n ...query,\n ...(ids.length === 1\n ? { [keyThere]: ids[0] }\n : { [keyThere]: { $in: ids } }),\n },\n paginate: false,\n }\n\n let promise: Promise<any> | undefined = undefined\n\n if (onDelete === 'cascade') {\n promise = context.app.service(service as string).remove(null, params)\n } else if (onDelete === 'set null') {\n const data = { [keyThere]: null }\n promise = context.app\n .service(service as string)\n .patch(null, data, params)\n }\n\n if (!promise) {\n continue\n }\n\n if (blocking) {\n blockingPromises.push(promise)\n } else {\n // fire-and-forget: always attach a catch so a rejection never becomes\n // an unhandled promise rejection. Surface it via `onError` if provided.\n promise.catch((error) => onError?.(error, context))\n }\n }\n\n if (blockingPromises.length) {\n await Promise.all(blockingPromises)\n }\n\n return\n }\n}\n","export const FROM_CLIENT_FOR_SERVER_DEFAULT_KEY = '_$client' as const\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\nimport { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from './params-for-from-shared.js'\n\nexport type ParamsForServerOptions = {\n /**\n * @default '_$client'\n */\n keyToHide?: string\n}\n\n/**\n * Client-side hook that moves whitelisted `params` properties into `query._$client`\n * so they survive the client-to-server transport. The server only receives `query`\n * from params — use `paramsFromClient` on the server to restore them.\n *\n * @example\n * ```ts\n * import { paramsForServer } from 'feathers-utils/hooks'\n *\n * // Client-side\n * app.service('users').hooks({\n * before: { all: [paramsForServer('populateParams')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/params-for-server.html\n */\nexport const paramsForServer = (\n whitelist: MaybeArray<string>,\n options?: ParamsForServerOptions,\n) => {\n const whitelistArr = toArray(whitelist)\n\n const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}\n\n function hook<H extends HookContext>(context: H): void\n function hook<H extends HookContext>(\n context: H,\n next: NextFunction,\n ): Promise<void>\n function hook<H extends HookContext>(\n context: H,\n next?: NextFunction,\n ): void | Promise<void> {\n // clone params on demand\n let clonedParams: any\n\n Object.keys(context.params).forEach((key) => {\n if (key === 'query') {\n return\n }\n\n if (whitelistArr.includes(key)) {\n if (!clonedParams) {\n clonedParams = {\n ...context.params,\n query: {\n ...context.params.query,\n },\n }\n }\n\n if (!clonedParams.query[keyToHide]) {\n clonedParams.query[keyToHide] = {}\n } else {\n // The shallow query copy still aliases a pre-existing key object;\n // clone it so we don't mutate the caller's original params.\n clonedParams.query[keyToHide] = { ...clonedParams.query[keyToHide] }\n }\n\n clonedParams.query[keyToHide][key] = clonedParams[key]\n delete clonedParams[key]\n }\n })\n\n if (clonedParams) {\n context.params = clonedParams\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\nimport { FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } from '../params-for-server/params-for-from-shared.js'\n\nexport type paramsFromClientOptions = {\n /**\n * @default '_$client'\n */\n keyToHide?: string\n}\n\n/**\n * Server-side hook that extracts whitelisted properties from `query._$client` back\n * into `context.params`. This is the counterpart to `paramsForServer`, which encodes\n * params on the client side for transport.\n *\n * @example\n * ```ts\n * import { paramsFromClient } from 'feathers-utils/hooks'\n *\n * // Server-side\n * app.service('users').hooks({\n * before: { all: [paramsFromClient('populateParams')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/params-from-client.html\n */\nexport const paramsFromClient = (\n whitelist: MaybeArray<string>,\n options?: paramsFromClientOptions,\n) => {\n const whitelistArr = toArray(whitelist)\n const { keyToHide = FROM_CLIENT_FOR_SERVER_DEFAULT_KEY } = options || {}\n function hook(context: HookContext): void\n function hook(context: HookContext, next: NextFunction): Promise<void>\n function hook(\n context: HookContext,\n next?: NextFunction,\n ): void | Promise<void> {\n if (\n !context.params?.query?.[keyToHide] ||\n typeof context.params.query[keyToHide] !== 'object'\n ) {\n if (next) return next()\n return\n }\n\n const params = {\n ...context.params,\n query: {\n ...context.params.query,\n [keyToHide]: {\n ...context.params.query[keyToHide],\n },\n },\n }\n\n const client = params.query[keyToHide]\n\n whitelistArr.forEach((key) => {\n if (key in client) {\n params[key] = client[key]\n delete client[key]\n }\n })\n\n if (Object.keys(client).length === 0) {\n delete params.query[keyToHide]\n }\n\n context.params = params\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import _has from 'lodash/has.js'\nimport _omit from 'lodash/omit.js'\nimport type { FeathersError } from '@feathersjs/errors'\nimport { BadRequest } from '@feathersjs/errors'\nimport { transformData } from '../transform-data/transform-data.hook.js'\nimport type { KeyOfOrDotNotation, MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type PreventChangesOptions<D, Keys extends KeyOfOrDotNotation<D>> = {\n /**\n * Customize the error that is thrown if the service tries to patch a field that is not allowed.\n *\n * If not provided, throws a `BadRequest` error with a message indicating the field that is not allowed.\n */\n error?: boolean | ((item: D, name: Keys) => FeathersError)\n}\n\n/**\n * Prevents `patch` calls from modifying certain fields. By default, the protected\n * fields are silently removed from `context.data`. When `error` is set, a `BadRequest`\n * is thrown if any protected field is present.\n *\n * Supports dot.notation for nested fields.\n *\n * @example\n * ```ts\n * import { preventChanges } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { patch: [preventChanges(['email', 'role'], { error: true })] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/prevent-changes.html\n */\nexport const preventChanges = <\n H extends HookContext = HookContext,\n D extends DataSingleHookContext<H> = DataSingleHookContext<H>,\n Keys extends KeyOfOrDotNotation<D> = KeyOfOrDotNotation<D>,\n>(\n fieldNames: MaybeArray<Keys>,\n options?: PreventChangesOptions<D, Keys>,\n) => {\n const fieldNamesArr = toArray(fieldNames)\n\n return transformData<H>((item) => {\n if (options?.error) {\n for (let i = 0; i < fieldNamesArr.length; i++) {\n const name = fieldNamesArr[i]\n\n if (_has(item, name)) {\n const error =\n typeof options.error === 'function'\n ? options.error(item as D, name)\n : new BadRequest(\n `Field ${String(name)} may not be patched. (preventChanges)`,\n )\n\n throw error\n }\n }\n } else {\n return _omit(item, fieldNamesArr)\n }\n\n return item\n })\n}\n","import { TooManyRequests } from '@feathersjs/errors'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { RateLimiterAbstract, RateLimiterRes } from 'rate-limiter-flexible'\nimport { checkContext } from '../../utils/index.js'\nimport type { Promisable } from '../../internal.utils.js'\n\nexport type RateLimitOptions<H extends HookContext = HookContext> = {\n /** Generate the rate-limiting key. Defaults to `context.path`. */\n key?: (context: H) => Promisable<string>\n /** Number of points to consume per request. Defaults to `1`. */\n points?: (context: H) => Promisable<number>\n}\n\n/**\n * Rate limits service method calls using `rate-limiter-flexible`.\n * You provide a pre-configured `RateLimiterAbstract` instance\n * (Memory, Redis, Mongo, etc.) and the hook consumes points per request.\n *\n * @example\n * ```ts\n * import { rateLimit } from 'feathers-utils/hooks'\n * import { RateLimiterMemory } from 'rate-limiter-flexible'\n *\n * const rateLimiter = new RateLimiterMemory({ points: 10, duration: 1 })\n *\n * app.service('users').hooks({\n * before: { find: [rateLimit(rateLimiter)] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/rate-limit.html\n */\nexport const rateLimit = <H extends HookContext = HookContext>(\n rateLimiter: RateLimiterAbstract,\n options?: RateLimitOptions<H>,\n) => {\n const key = options?.key ?? ((context: HookContext) => context.path)\n const points = options?.points ?? (() => 1)\n\n return async (context: H, next?: NextFunction): Promise<void> => {\n checkContext(context, { type: ['before', 'around'], label: 'rateLimit' })\n\n const resolvedKey = await key(context)\n const resolvedPoints = await points(context)\n\n try {\n const res = await rateLimiter.consume(resolvedKey, resolvedPoints)\n context.params.rateLimit = res\n } catch (res) {\n context.params.rateLimit = res as RateLimiterRes\n throw new TooManyRequests('Too many requests', {\n rateLimitRes: res as RateLimiterRes,\n })\n }\n\n if (next) await next()\n }\n}\n","import _get from 'lodash/get.js'\nimport _set from 'lodash/set.js'\nimport _has from 'lodash/has.js'\n\nimport type { FeathersError } from '@feathersjs/errors'\nimport { Forbidden } from '@feathersjs/errors'\n\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PropertyPath } from 'lodash'\nimport { contextToJson } from '../../utils/context-to-json/context-to-json.util.js'\nimport { getDataIsArray } from '../../utils/index.js'\nimport type { PredicateItemWithContext } from '../../types.js'\n\nexport interface HookSetDataOptions {\n /**\n * Wether to throw if the context[from] is undefined.\n *\n * @default false\n */\n allowUndefined?: boolean\n /**\n * @default true\n */\n overwrite?: boolean | PredicateItemWithContext\n /**\n * Customize the error that is thrown if the context[from] is not available.\n * If not provided, throws a `Forbidden` error with a message indicating the missing field.\n */\n error?: (context: HookContext, from: PropertyPath) => FeathersError\n}\n\n/**\n * Sets a property on each item in `context.data` from another property on the hook context.\n * Supports dot-notation paths for both source and target. Throws a `Forbidden` error\n * if the source field is missing (unless `allowUndefined` is `true`).\n *\n * @example\n * ```ts\n * import { setData } from 'feathers-utils/hooks'\n *\n * app.service('posts').hooks({\n * before: { create: [setData('params.user.id', 'userId')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/set-data.html\n */\nexport function setData<H extends HookContext = HookContext>(\n /**\n * The property path of the context to set the value from. 'dot.notation' is supported.\n *\n * If the property does not exist, the hook will throw an error unless `allowUndefined` is set to true.\n * If the property exists, it will be set to the value of the `to` property path of the data item.\n *\n * @example 'params.user.id'\n */\n from: PropertyPath,\n /**\n * The property path of the data item to set the value to. 'dot.notation' is supported.\n *\n * If the property does not exist, it will be created.\n * If the property exists, it will be overwritten unless `overwrite` is set to false.\n *\n * @example 'userId'\n */\n to: PropertyPath,\n options?: HookSetDataOptions,\n) {\n const { allowUndefined = false, overwrite = true } = options ?? {}\n\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n const { data } = getDataIsArray(context)\n\n const contextJson = contextToJson(context)\n\n if (!_has(contextJson, from)) {\n if (!context.params?.provider || allowUndefined === true) {\n if (next) return next()\n return\n }\n\n if (\n !overwrite &&\n data.every((item: Record<string, unknown>) => _has(item, to))\n ) {\n if (next) return next()\n return\n }\n\n throw options?.error\n ? options.error(context, from)\n : new Forbidden(`Expected field ${from.toString()} not available`)\n }\n\n const val = _get(contextJson, from)\n\n for (let i = 0, len = data.length; i < len; i++) {\n const item: Record<string, unknown> = data[i]\n\n const currentOverwrite =\n typeof overwrite === 'function' ? overwrite(item, context) : overwrite\n\n if (!currentOverwrite && _has(item, to)) {\n continue\n }\n\n _set(item, to, val)\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import _get from 'lodash/get.js'\nimport _setWith from 'lodash/setWith.js'\nimport _clone from 'lodash/clone.js'\nimport { checkContext } from '../../utils/index.js'\nimport type { FeathersError } from '@feathersjs/errors'\nimport { Forbidden } from '@feathersjs/errors'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\n\nexport interface SetFieldOptions<H extends HookContext = HookContext> {\n /**\n * The target path(s) to set. Pass an array to write the same value to several\n * paths (e.g. multiple query keys).\n *\n * @example 'params.query.userId'\n * @example ['params.query.userId', 'params.query.ownerId']\n */\n as: string | string[]\n /**\n * The source of the value: a `dot.notation` path on the context, or a function\n * that derives the value from the context.\n *\n * @example 'params.user.id'\n * @example (context) => context.params.user?.id\n */\n from: string | ((context: H) => unknown)\n /**\n * If set to `true`, allows the field to be undefined.\n * If the field is not available and this is `true`, the hook will not throw an error.\n *\n * If set to `false`, the hook will throw an error if the field is not available.\n *\n * @default false\n */\n allowUndefined?: boolean\n /**\n * Customize the error that is thrown if the field is not available.\n *\n * If not provided, throws a `Forbidden` error with a message indicating the missing field.\n */\n error?: (\n context: H,\n from: string | ((context: H) => unknown),\n ) => FeathersError\n}\n\n/**\n * Sets a field on the hook context (e.g. `params.query`) based on the value of another\n * context field (e.g. `params.user.id`). Useful for scoping queries to the authenticated user.\n * Throws a `Forbidden` error if the source field is missing (unless `allowUndefined` is `true`).\n *\n * @example\n * ```ts\n * import { setField } from 'feathers-utils/hooks'\n *\n * app.service('posts').hooks({\n * before: { all: [setField({ from: 'params.user.id', as: 'params.query.userId' })] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/set-field.html\n */\nexport const setField = <H extends HookContext = HookContext>({\n as,\n from,\n allowUndefined = false,\n error,\n}: SetFieldOptions<H>) => {\n const targets = Array.isArray(as) ? as : [as]\n\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n const { params } = context\n\n checkContext(context, { type: ['before', 'around'], label: 'setField' })\n\n const value =\n typeof from === 'function' ? from(context) : _get(context, from)\n\n if (value === undefined) {\n if (!params.provider || allowUndefined) {\n if (next) return next()\n return\n }\n\n throw error\n ? error(context, from)\n : new Forbidden(`Expected field ${targets.join(', ')} not available`)\n }\n\n for (const target of targets) {\n _setWith(context, target, value, _clone)\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import _get from 'lodash/get.js'\nimport _set from 'lodash/set.js'\nimport _has from 'lodash/has.js'\nimport { copy } from 'fast-copy'\n\nimport type { FeathersError } from '@feathersjs/errors'\nimport { Forbidden } from '@feathersjs/errors'\n\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PropertyPath } from 'lodash'\nimport { contextToJson } from '../../utils/context-to-json/context-to-json.util.js'\nimport { getResultIsArray } from '../../utils/index.js'\nimport type { DispatchOption, PredicateItemWithContext } from '../../types.js'\n\nexport interface SetResultOptions {\n /**\n * Wether to throw if the context[from] is undefined.\n *\n * @default false\n */\n allowUndefined?: boolean\n /**\n * @default true\n */\n overwrite?: boolean | PredicateItemWithContext\n /**\n * Customize the error that is thrown if the context[from] is not available.\n * If not provided, throws a `Forbidden` error with a message indicating the missing field.\n */\n error?: (context: HookContext, from: PropertyPath) => FeathersError\n dispatch?: DispatchOption\n}\n\n/**\n * Sets a property on each item in `context.result` from another property on the hook context.\n * Supports dot-notation paths for both source and target, and can optionally\n * operate on `context.dispatch` as well.\n *\n * @example\n * ```ts\n * import { setResult } from 'feathers-utils/hooks'\n *\n * app.service('posts').hooks({\n * after: { all: [setResult('params.user.id', 'currentUserId')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/set-result.html\n */\nexport function setResult<H extends HookContext = HookContext>(\n /**\n * The property path of the context to set the value from. 'dot.notation' is supported.\n *\n * If the property does not exist, the hook will throw an error unless `allowUndefined` is set to true.\n * If the property exists, it will be set to the value of the `to` property path of the data item.\n *\n * @example 'params.user.id'\n */\n from: PropertyPath,\n /**\n * The property path of the data item to set the value to. 'dot.notation' is supported.\n *\n * If the property does not exist, it will be created.\n * If the property exists, it will be overwritten unless `overwrite` is set to false.\n *\n * @example 'userId'\n */\n to: PropertyPath,\n options?: SetResultOptions,\n) {\n const { allowUndefined = false, overwrite = true } = options ?? {}\n\n const forResultOrDispatch = (context: H, dispatch: boolean) => {\n const { result } = getResultIsArray(context, { dispatch })\n\n const contextJson = contextToJson(context)\n\n if (!_has(contextJson, from)) {\n if (!context.params?.provider || allowUndefined === true) {\n return context\n }\n\n if (\n !overwrite &&\n result.every((item: Record<string, unknown>) => _has(item, to))\n ) {\n return context\n }\n\n throw options?.error\n ? options.error(context, from)\n : new Forbidden(`Expected field ${from.toString()} not available`)\n }\n\n const val = _get(contextJson, from)\n\n for (let i = 0; i < result.length; i++) {\n const item: Record<string, unknown> = result[i]\n\n const currentOverwrite =\n typeof overwrite === 'function' ? overwrite(item, context) : overwrite\n\n if (!currentOverwrite && _has(item, to)) {\n continue\n }\n\n _set(item, to, val)\n }\n\n return context\n }\n\n const fn = (context: H) => {\n // Seed context.dispatch from result so the dispatch branch mutates (and\n // persists to) a real object instead of a throwaway copy. Mirrors mutateResult.\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result)\n }\n\n if (options?.dispatch === 'both') {\n forResultOrDispatch(context, true)\n return forResultOrDispatch(context, false)\n }\n\n return forResultOrDispatch(context, !!options?.dispatch)\n }\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 if (next) {\n return next().then(() => {\n fn(context)\n })\n }\n\n fn(context)\n return\n }\n return hook\n}\n","import _set from 'lodash/set.js'\nimport type { HookContext, NextFunction } from '@feathersjs/feathers'\n\n/**\n * Extracts URL route parameters (slugs) and sets them on `params.query`.\n * For example, given a route `/stores/:storeId`, this hook copies the resolved\n * `storeId` value from `params.route` into the query. Only applies to the `rest` provider.\n *\n * @example\n * ```ts\n * import { setSlug } from 'feathers-utils/hooks'\n *\n * app.service('stores/:storeId/products').hooks({\n * before: { all: [setSlug('storeId')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/set-slug.html\n */\nexport const setSlug = <H extends HookContext = HookContext>(\n slug: string,\n fieldName?: string,\n) => {\n const targetField: string =\n typeof fieldName === 'string' ? fieldName : `query.${slug}`\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 if (context.params && context.params.provider === 'rest') {\n const value = context.params.route[slug]\n if (typeof value === 'string' && value[0] !== ':') {\n _set(context.params, targetField, value)\n }\n }\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { addToQuery, checkContext } from '../../utils/index.js'\nimport type { TransformParamsFn } from '../../types.js'\nimport { transformParams } from '../../utils/transform-params/transform-params.util.js'\nimport { early, type Promisable } from '../../internal.utils.js'\nimport { isPromise } from '../../common/index.js'\n\nexport type SoftDeleteOptionFunction<H extends HookContext = HookContext> = (\n context?: H,\n) => Promisable<{ [key: string]: any }>\n\nexport interface SoftDeleteOptions<H extends HookContext = HookContext> {\n /**\n * @example { deletedAt: null }\n */\n deletedQuery: { [key: string]: any } | SoftDeleteOptionFunction<H>\n /**\n * @example { deletedAt: new Date() }\n */\n removeData: { [key: string]: any } | SoftDeleteOptionFunction<H>\n /**\n * Transform the params before calling the service method. E.g. remove 'params.provider' or add custom params.\n */\n transformParams?: TransformParamsFn\n\n /**\n * Key in `params` to disable the soft delete functionality.\n *\n * @default 'disableSoftDelete'\n */\n disableSoftDeleteKey?: string\n\n /**\n * `softDelete` uses `._patch()` internally to mark items as deleted.\n *\n * If you set this option to `true`, it will use the `.patch()` method with hooks instead.\n */\n usePatchWithHooks?: boolean\n}\n\n/**\n * Marks items as deleted instead of physically removing them. On `remove`, the hook\n * patches the record with `removeData` (e.g. `{ deletedAt: new Date() }`). On all other\n * methods, it appends `deletedQuery` (e.g. `{ deletedAt: null }`) to filter out soft-deleted items.\n *\n * @example\n * ```ts\n * import { softDelete } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * around: {\n * all: [softDelete({ deletedQuery: { deletedAt: null }, removeData: { deletedAt: new Date() } })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/soft-delete.html\n */\nexport const softDelete = <H extends HookContext = HookContext>(\n options: SoftDeleteOptions<H>,\n) => {\n if (!options?.deletedQuery || !options?.removeData) {\n throw new Error(\n 'You must provide `deletedQuery` and `removeData` options to the softDelete hook.',\n )\n }\n\n return async (context: H, next?: NextFunction): Promise<void> => {\n checkContext(context, { type: ['before', 'around'], label: 'softDelete' })\n\n const { disableSoftDeleteKey = 'disableSoftDelete' } = options\n\n if (context.params[disableSoftDeleteKey]) {\n await early(context, next)\n return\n }\n\n const { deletedQuery, removeData } = options\n\n let deleteQuery = getValue(deletedQuery, context)\n if (isPromise(deleteQuery)) {\n deleteQuery = await deleteQuery\n }\n\n const query = addToQuery(context.params.query, deleteQuery)\n\n const params = transformParams(\n {\n ...context.params,\n query,\n },\n options.transformParams,\n )\n\n context.params = params\n\n if (context.method === 'remove') {\n let data = getValue(removeData, context)\n if (isPromise(data)) {\n data = await data\n }\n const method = options.usePatchWithHooks ? 'patch' : '_patch'\n const result = await context.service[method](context.id, data, params)\n\n context.result = result\n }\n\n if (next) {\n await next()\n }\n }\n}\n\nconst getValue = (value: any, ...args: any[]) => {\n if (typeof value === 'function') {\n return value(...args)\n }\n return value\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { checkContext } from '../../utils/index.js'\n\nexport type StashableOptions = {\n /** The property name on `context.params` to store the stash function. @default 'stashed' */\n propName?: string\n /** Custom function to fetch the pre-mutation state. Defaults to `service.get` or `service.find`. */\n stashFunc?: (context: HookContext) => Promise<any>\n}\n\nconst defaultStashFunc = (context: HookContext) => {\n const isMulti = context.id == null\n\n const params = {\n ...context.params,\n _stashable: true,\n ...(isMulti ? { paginate: false } : {}),\n }\n\n return isMulti\n ? context.service.find(params)\n : context.service.get(context.id, params)\n}\n\n/**\n * Stashes the pre-mutation state of a record into `context.params`.\n * Eagerly starts the fetch but exposes a memoized function — calling it\n * multiple times only hits the database once.\n * Use in `before` hooks on `update`, `patch`, or `remove` methods.\n *\n * @example\n * ```ts\n * import { stashable } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { patch: [stashable()] }\n * })\n *\n * // In a later hook (before or after):\n * const before = await context.params.stashed()\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/stashable.html\n */\nexport function stashable<H extends HookContext = HookContext>(\n options?: StashableOptions,\n) {\n const propName = options?.propName ?? 'stashed'\n const stashFunc = options?.stashFunc ?? defaultStashFunc\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 if (context.params._stashable) {\n if (next) return next()\n return\n }\n\n checkContext(context, {\n type: ['before', 'around'],\n method: ['update', 'patch', 'remove'],\n label: 'stashable',\n })\n\n const promise = stashFunc(context).catch(() => undefined)\n\n context.params[propName] = () => promise\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { BadRequest, type FeathersError } from '@feathersjs/errors'\nimport { every, isMulti } from '../../predicates/index.js'\nimport { throwIf } from '../throw-if/throw-if.hook.js'\n\nexport type ThrowIfIsMultiOptions = {\n /**\n * A predicate function to filter the contexts that should be checked for multi operations.\n * If provided, only contexts that pass this predicate will be checked for multi operations.\n */\n filter?: PredicateFn\n /**\n * Customize the error that is thrown if the context is multi and the service does not allow it.\n * If not provided, throws a `BadRequest` error.\n */\n error?: (context: HookContext) => FeathersError\n}\n\nconst defaultError = (context: HookContext) =>\n new BadRequest(`Cannot perform multi operation on method '${context.method}'`)\n\n/**\n * Throws a `BadRequest` error when the current operation is a multi operation\n * (array data on `create`, or `id === null` on `patch`/`remove`).\n * Useful to prevent bulk operations on services that should only handle single items.\n *\n * @example\n * ```ts\n * import { throwIfIsMulti } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { all: [throwIfIsMulti()] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if-is-multi.html\n */\nexport const throwIfIsMulti = <H extends HookContext = HookContext>(\n options?: ThrowIfIsMultiOptions,\n) =>\n throwIf<H>(\n every(\n every(isMulti, (context) => context.method !== 'find'),\n options?.filter,\n ),\n {\n error: options?.error ?? defaultError,\n },\n )\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn, TransportName } from '../../types.js'\nimport { throwIf } from '../throw-if/throw-if.hook.js'\nimport { every, isProvider } from '../../predicates/index.js'\nimport type { FeathersError } from '@feathersjs/errors'\nimport { MethodNotAllowed } from '@feathersjs/errors'\nimport { toArray } from '../../internal.utils.js'\n\nconst defaultError = (context: HookContext) =>\n new MethodNotAllowed(\n `Provider '${context.params.provider}' can not call '${context.method}'.`,\n )\n\nexport type ThrowIfIsIsProviderOptions = {\n filter?: PredicateFn\n /**\n * Customize the error that is thrown if the context is a provider and the service does not allow it.\n * If not provided, throws a `MethodNotAllowed` error.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Throws a `MethodNotAllowed` error when the request comes from one of the specified transports.\n * Combines `throwIf` with the `isProvider` predicate for a convenient one-liner.\n * Use this to restrict methods to server-only or specific transport types.\n *\n * @example\n * ```ts\n * import { throwIfIsProvider } from 'feathers-utils/hooks'\n *\n * app.service('internal').hooks({\n * before: { all: [throwIfIsProvider('external')] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if-is-provider.html\n */\nexport const throwIfIsProvider = <H extends HookContext = HookContext>(\n transports: TransportName | TransportName[],\n options?: ThrowIfIsIsProviderOptions,\n) => {\n const disallowTransports = toArray(transports)\n\n return throwIf<H>(\n every(isProvider(...(disallowTransports as any)), options?.filter),\n {\n error: options?.error ?? defaultError,\n },\n )\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { traverse as _traverse } from '../../common/index.js'\n\nexport type TraverseOptions = {\n transformer: (transformContext: any) => any\n getObject: (\n context: HookContext,\n ) => Record<string, any> | Record<string, any>[]\n /**\n * For `around` hooks only: run the traversal *after* `next()` instead of before.\n * Required when `getObject` targets `context.result`, which is only populated\n * once the service method has run. Defaults to `false` (run before `next()`),\n * which is correct for `context.data`/`context.params.query` targets.\n *\n * @default false\n */\n runAfter?: boolean\n}\n\n/**\n * Recursively walks and transforms fields in record(s) using `neotraverse`.\n * The `getObject` function extracts the target from the context, and `transformer`\n * is called for every node during traversal --- ideal for deep, structural transformations.\n *\n * @example\n * ```ts\n * import { traverse } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * after: {\n * all: [traverse({ getObject: (ctx) => ctx.result, transformer: function () { if (this.key === 'password') this.remove() } })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/traverse.html\n */\nexport const traverse = <H extends HookContext = HookContext>({\n transformer,\n getObject,\n runAfter = false,\n}: TraverseOptions) => {\n const runTraverse = (context: H) => _traverse(getObject(context), transformer)\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 if (next && runAfter) {\n // around hook targeting context.result: transform after the method ran\n return next().then(() => {\n runTraverse(context)\n })\n }\n\n runTraverse(context)\n\n if (next) return next()\n\n return\n }\n return hook\n}\n"],"mappings":"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"}
package/dist/hooks.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { A as Promisable, D as KeyOfOrDotNotation, O as MaybeArray, S as TransportName, _ as PredicateItemWithContext, d as HookFunction, g as PredicateFn, k as NeverFallback, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { d as InferFindParams, h as InferGetResult, i as InferCreateDataSingle } from "./infer-service-methods-D7zRVQeJ.mjs";
3
- import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BYWO9hzO.mjs";
4
- import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-BUwLePT2.mjs";
3
+ import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BX0mOvdN.mjs";
4
+ import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-C8-4Lezj.mjs";
5
5
  import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-CA7-EaTw.mjs";
6
6
  import { FeathersError } from "@feathersjs/errors";
7
7
  import * as _$_feathersjs_feathers0 from "@feathersjs/feathers";
@@ -104,6 +104,16 @@ type CacheOptions = {
104
104
  * ```
105
105
  */
106
106
  logger?: (event: CacheEvent) => void;
107
+ /**
108
+ * How to clone results on store and on hit so callers can't mutate the shared
109
+ * cached object. Defaults to a `fast-copy` deep clone.
110
+ *
111
+ * Set to `false` to skip cloning entirely (fastest, but the caller MUST treat
112
+ * results as immutable), or pass a custom clone function (e.g. `structuredClone`).
113
+ *
114
+ * @default true
115
+ */
116
+ clone?: boolean | (<T>(value: T) => T);
107
117
  };
108
118
  /**
109
119
  * Caches `get` and `find` results based on `params`. On mutating methods (`create`, `update`,
@@ -125,7 +135,7 @@ type CacheOptions = {
125
135
  *
126
136
  * @see https://utils.feathersjs.com/hooks/cache.html
127
137
  */
128
- declare const cache: <H extends HookContext = HookContext>(options: CacheOptions) => (context: H, next?: NextFunction) => Promise<HookContext<_$_feathersjs_feathers0.Application<any, any>, any> | undefined>;
138
+ declare const cache: <H extends HookContext = HookContext>(options: CacheOptions) => (context: H, next?: NextFunction) => Promise<void>;
129
139
  //#endregion
130
140
  //#region src/hooks/check-multi/check-multi.hook.d.ts
131
141
  type CheckMultiOptions = {
@@ -152,7 +162,10 @@ type CheckMultiOptions = {
152
162
  *
153
163
  * @see https://utils.feathersjs.com/hooks/check-multi.html
154
164
  */
155
- declare function checkMulti<H extends HookContext = HookContext>(options?: CheckMultiOptions): (context: H, next?: NextFunction) => Promise<any> | H;
165
+ declare function checkMulti<H extends HookContext = HookContext>(options?: CheckMultiOptions): {
166
+ (context: H): void;
167
+ (context: H, next: NextFunction): Promise<void>;
168
+ };
156
169
  //#endregion
157
170
  //#region src/hooks/check-required/check-required.hook.d.ts
158
171
  /**
@@ -171,7 +184,10 @@ declare function checkMulti<H extends HookContext = HookContext>(options?: Check
171
184
  *
172
185
  * @see https://utils.feathersjs.com/hooks/check-required.html
173
186
  */
174
- declare function checkRequired<H extends HookContext = HookContext>(fieldNames: MaybeArray<string>): (context: H, next?: NextFunction) => Promise<any> | undefined;
187
+ declare function checkRequired<H extends HookContext = HookContext>(fieldNames: MaybeArray<string>): {
188
+ (context: H): void;
189
+ (context: H, next: NextFunction): Promise<void>;
190
+ };
175
191
  //#endregion
176
192
  //#region src/hooks/create-related/create-related.hook.d.ts
177
193
  interface CreateRelatedOptions<H extends HookContext = HookContext, Services extends H['app']['services'] = H['app']['services'], S extends keyof Services = keyof Services> {
@@ -252,11 +268,10 @@ declare const debug: <H extends HookContext = HookContext>(msg: string, ...field
252
268
  *
253
269
  * @see https://utils.feathersjs.com/hooks/disable-pagination.html
254
270
  */
255
- declare const disablePagination: <H extends HookContext = HookContext>() => (context: H, next?: NextFunction) => Promise<any> | (H & {
256
- type: "around" | "before";
257
- } & {
258
- method: "find";
259
- });
271
+ declare const disablePagination: <H extends HookContext = HookContext>() => {
272
+ (context: H): void;
273
+ (context: H, next: NextFunction): Promise<void>;
274
+ };
260
275
  //#endregion
261
276
  //#region src/hooks/disallow/disallow.hook.d.ts
262
277
  /**
@@ -278,7 +293,10 @@ declare const disablePagination: <H extends HookContext = HookContext>() => (con
278
293
  *
279
294
  * @see https://utils.feathersjs.com/hooks/disallow.html
280
295
  */
281
- declare const disallow: <H extends HookContext = HookContext>(transports?: MaybeArray<TransportName>) => (context: H, next?: NextFunction) => Promise<H> | undefined;
296
+ declare const disallow: <H extends HookContext = HookContext>(transports?: MaybeArray<TransportName>) => {
297
+ (context: H): void;
298
+ (context: H, next: NextFunction): Promise<void>;
299
+ };
282
300
  //#endregion
283
301
  //#region src/hooks/on-delete/on-delete.hook.d.ts
284
302
  type OnDeleteAction = 'cascade' | 'set null';
@@ -313,6 +331,12 @@ interface OnDeleteOptions<H extends HookContext = HookContext, S extends keyof H
313
331
  * @default false
314
332
  */
315
333
  blocking?: boolean;
334
+ /**
335
+ * Called when a non-blocking (`blocking: false`) related-service call rejects.
336
+ * Without this, fire-and-forget rejections are swallowed (but never leak as an
337
+ * unhandled rejection). In `blocking` mode the error is thrown to the caller instead.
338
+ */
339
+ onError?: (error: any, context: H) => void;
316
340
  }
317
341
  /**
318
342
  * Manipulates related items when a record is deleted, similar to SQL foreign key actions.
@@ -359,7 +383,10 @@ type ParamsForServerOptions = {
359
383
  *
360
384
  * @see https://utils.feathersjs.com/hooks/params-for-server.html
361
385
  */
362
- declare const paramsForServer: (whitelist: MaybeArray<string>, options?: ParamsForServerOptions) => <H extends HookContext>(context: H, next?: NextFunction) => Promise<any> | H;
386
+ declare const paramsForServer: (whitelist: MaybeArray<string>, options?: ParamsForServerOptions) => {
387
+ <H extends HookContext>(context: H): void;
388
+ <H extends HookContext>(context: H, next: NextFunction): Promise<void>;
389
+ };
363
390
  //#endregion
364
391
  //#region src/hooks/params-from-client/params-from-client.hook.d.ts
365
392
  type paramsFromClientOptions = {
@@ -385,7 +412,10 @@ type paramsFromClientOptions = {
385
412
  *
386
413
  * @see https://utils.feathersjs.com/hooks/params-from-client.html
387
414
  */
388
- declare const paramsFromClient: (whitelist: MaybeArray<string>, options?: paramsFromClientOptions) => (context: HookContext, next?: NextFunction) => HookContext<_$_feathersjs_feathers0.Application<any, any>, any> | Promise<any>;
415
+ declare const paramsFromClient: (whitelist: MaybeArray<string>, options?: paramsFromClientOptions) => {
416
+ (context: HookContext): void;
417
+ (context: HookContext, next: NextFunction): Promise<void>;
418
+ };
389
419
  //#endregion
390
420
  //#region src/hooks/prevent-changes/prevent-changes.hook.d.ts
391
421
  type PreventChangesOptions<D, Keys extends KeyOfOrDotNotation<D>> = {
@@ -414,7 +444,7 @@ type PreventChangesOptions<D, Keys extends KeyOfOrDotNotation<D>> = {
414
444
  *
415
445
  * @see https://utils.feathersjs.com/hooks/prevent-changes.html
416
446
  */
417
- declare const preventChanges: <H extends HookContext = HookContext, D extends DataSingleHookContext<H> = DataSingleHookContext<H>, Keys extends KeyOfOrDotNotation<D> = KeyOfOrDotNotation<D>>(fieldNames: MaybeArray<Keys>, options?: PreventChangesOptions<D, Keys>) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
447
+ declare const preventChanges: <H extends HookContext = HookContext, D extends DataSingleHookContext<H> = DataSingleHookContext<H>, Keys extends KeyOfOrDotNotation<D> = KeyOfOrDotNotation<D>>(fieldNames: MaybeArray<Keys>, options?: PreventChangesOptions<D, Keys>) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
418
448
  //#endregion
419
449
  //#region src/hooks/rate-limit/rate-limit.hook.d.ts
420
450
  type RateLimitOptions<H extends HookContext = HookContext> = {
@@ -440,7 +470,7 @@ type RateLimitOptions<H extends HookContext = HookContext> = {
440
470
  *
441
471
  * @see https://utils.feathersjs.com/hooks/rate-limit.html
442
472
  */
443
- declare const rateLimit: <H extends HookContext = HookContext>(rateLimiter: RateLimiterAbstract, options?: RateLimitOptions<H>) => (context: H, next?: NextFunction) => Promise<any>;
473
+ declare const rateLimit: <H extends HookContext = HookContext>(rateLimiter: RateLimiterAbstract, options?: RateLimitOptions<H>) => (context: H, next?: NextFunction) => Promise<void>;
444
474
  //#endregion
445
475
  //#region src/hooks/set-data/set-data.hook.d.ts
446
476
  interface HookSetDataOptions {
@@ -496,12 +526,29 @@ from: PropertyPath,
496
526
  * @example 'userId'
497
527
  */
498
528
 
499
- to: PropertyPath, options?: HookSetDataOptions): (context: H, next?: NextFunction) => Promise<any> | H;
529
+ to: PropertyPath, options?: HookSetDataOptions): {
530
+ (context: H): void;
531
+ (context: H, next: NextFunction): Promise<void>;
532
+ };
500
533
  //#endregion
501
534
  //#region src/hooks/set-field/set-field.hook.d.ts
502
- interface SetFieldOptions {
503
- as: string;
504
- from: string;
535
+ interface SetFieldOptions<H extends HookContext = HookContext> {
536
+ /**
537
+ * The target path(s) to set. Pass an array to write the same value to several
538
+ * paths (e.g. multiple query keys).
539
+ *
540
+ * @example 'params.query.userId'
541
+ * @example ['params.query.userId', 'params.query.ownerId']
542
+ */
543
+ as: string | string[];
544
+ /**
545
+ * The source of the value: a `dot.notation` path on the context, or a function
546
+ * that derives the value from the context.
547
+ *
548
+ * @example 'params.user.id'
549
+ * @example (context) => context.params.user?.id
550
+ */
551
+ from: string | ((context: H) => unknown);
505
552
  /**
506
553
  * If set to `true`, allows the field to be undefined.
507
554
  * If the field is not available and this is `true`, the hook will not throw an error.
@@ -516,7 +563,7 @@ interface SetFieldOptions {
516
563
  *
517
564
  * If not provided, throws a `Forbidden` error with a message indicating the missing field.
518
565
  */
519
- error?: (context: HookContext, from: string) => FeathersError;
566
+ error?: (context: H, from: string | ((context: H) => unknown)) => FeathersError;
520
567
  }
521
568
  /**
522
569
  * Sets a field on the hook context (e.g. `params.query`) based on the value of another
@@ -539,7 +586,10 @@ declare const setField: <H extends HookContext = HookContext>({
539
586
  from,
540
587
  allowUndefined,
541
588
  error
542
- }: SetFieldOptions) => (context: H, next?: NextFunction) => Promise<any> | H;
589
+ }: SetFieldOptions<H>) => {
590
+ (context: H): void;
591
+ (context: H, next: NextFunction): Promise<void>;
592
+ };
543
593
  //#endregion
544
594
  //#region src/hooks/set-result/set-result.hook.d.ts
545
595
  interface SetResultOptions {
@@ -596,7 +646,10 @@ from: PropertyPath,
596
646
  * @example 'userId'
597
647
  */
598
648
 
599
- to: PropertyPath, options?: SetResultOptions): (context: H, next?: NextFunction) => H | Promise<H>;
649
+ to: PropertyPath, options?: SetResultOptions): {
650
+ (context: H): void;
651
+ (context: H, next: NextFunction): Promise<void>;
652
+ };
600
653
  //#endregion
601
654
  //#region src/hooks/set-slug/set-slug.hook.d.ts
602
655
  /**
@@ -615,7 +668,10 @@ to: PropertyPath, options?: SetResultOptions): (context: H, next?: NextFunction)
615
668
  *
616
669
  * @see https://utils.feathersjs.com/hooks/set-slug.html
617
670
  */
618
- declare const setSlug: <H extends HookContext = HookContext>(slug: string, fieldName?: string) => (context: H, next?: NextFunction) => Promise<any> | H;
671
+ declare const setSlug: <H extends HookContext = HookContext>(slug: string, fieldName?: string) => {
672
+ (context: H): void;
673
+ (context: H, next: NextFunction): Promise<void>;
674
+ };
619
675
  //#endregion
620
676
  //#region src/hooks/soft-delete/soft-delete.hook.d.ts
621
677
  type SoftDeleteOptionFunction<H extends HookContext = HookContext> = (context?: H) => Promisable<{
@@ -669,7 +725,7 @@ interface SoftDeleteOptions<H extends HookContext = HookContext> {
669
725
  *
670
726
  * @see https://utils.feathersjs.com/hooks/soft-delete.html
671
727
  */
672
- declare const softDelete: <H extends HookContext = HookContext>(options: SoftDeleteOptions<H>) => (context: H, next?: NextFunction) => Promise<any>;
728
+ declare const softDelete: <H extends HookContext = HookContext>(options: SoftDeleteOptions<H>) => (context: H, next?: NextFunction) => Promise<void>;
673
729
  //#endregion
674
730
  //#region src/hooks/stashable/stashable.hook.d.ts
675
731
  type StashableOptions = {
@@ -697,8 +753,8 @@ type StashableOptions = {
697
753
  * @see https://utils.feathersjs.com/hooks/stashable.html
698
754
  */
699
755
  declare function stashable<H extends HookContext = HookContext>(options?: StashableOptions): {
756
+ (context: H): void;
700
757
  (context: H, next: NextFunction): Promise<void>;
701
- (context: H): H;
702
758
  };
703
759
  //#endregion
704
760
  //#region src/hooks/throw-if-is-multi/throw-if-is-multi.hook.d.ts
@@ -730,7 +786,7 @@ type ThrowIfIsMultiOptions = {
730
786
  *
731
787
  * @see https://utils.feathersjs.com/hooks/throw-if-is-multi.html
732
788
  */
733
- declare const throwIfIsMulti: <H extends HookContext = HookContext>(options?: ThrowIfIsMultiOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
789
+ declare const throwIfIsMulti: <H extends HookContext = HookContext>(options?: ThrowIfIsMultiOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
734
790
  //#endregion
735
791
  //#region src/hooks/throw-if-is-provider/throw-if-is-provider.hook.d.ts
736
792
  type ThrowIfIsIsProviderOptions = {
@@ -757,12 +813,21 @@ type ThrowIfIsIsProviderOptions = {
757
813
  *
758
814
  * @see https://utils.feathersjs.com/hooks/throw-if-is-provider.html
759
815
  */
760
- declare const throwIfIsProvider: <H extends HookContext = HookContext>(transports: TransportName | TransportName[], options?: ThrowIfIsIsProviderOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<any>;
816
+ declare const throwIfIsProvider: <H extends HookContext = HookContext>(transports: TransportName | TransportName[], options?: ThrowIfIsIsProviderOptions) => (context: H, next?: _$_feathersjs_feathers0.NextFunction) => Promise<void>;
761
817
  //#endregion
762
818
  //#region src/hooks/traverse/traverse.hook.d.ts
763
819
  type TraverseOptions = {
764
820
  transformer: (transformContext: any) => any;
765
821
  getObject: (context: HookContext) => Record<string, any> | Record<string, any>[];
822
+ /**
823
+ * For `around` hooks only: run the traversal *after* `next()` instead of before.
824
+ * Required when `getObject` targets `context.result`, which is only populated
825
+ * once the service method has run. Defaults to `false` (run before `next()`),
826
+ * which is correct for `context.data`/`context.params.query` targets.
827
+ *
828
+ * @default false
829
+ */
830
+ runAfter?: boolean;
766
831
  };
767
832
  /**
768
833
  * Recursively walks and transforms fields in record(s) using `neotraverse`.
@@ -784,8 +849,12 @@ type TraverseOptions = {
784
849
  */
785
850
  declare const traverse: <H extends HookContext = HookContext>({
786
851
  transformer,
787
- getObject
788
- }: TraverseOptions) => (context: H, next?: NextFunction) => Promise<any> | H;
852
+ getObject,
853
+ runAfter
854
+ }: TraverseOptions) => {
855
+ (context: H): void;
856
+ (context: H, next: NextFunction): Promise<void>;
857
+ };
789
858
  //#endregion
790
859
  export { CacheEvent, CacheOptions, CheckMultiOptions, CreateRelatedOptions, HookSetDataOptions, IffHook, OnDeleteAction, OnDeleteOptions, ParamsForServerOptions, PreventChangesOptions, RateLimitOptions, SetFieldOptions, SetResultOptions, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, ThrowIfOptions, TransformResultOptions, TraverseOptions, cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, iff, iff as when, iffElse, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, preventChanges, rateLimit, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skippable, softDelete, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, transformData, transformQuery, transformResult, traverse, unless };
791
860
  //# sourceMappingURL=hooks.d.mts.map
package/dist/hooks.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { _ as combine, a as iffElse, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-CT08opkD.mjs";
2
- import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-DPFxxjBu.mjs";
3
- import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-CevWK5TA.mjs";
4
- import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-Cx9osy8O.mjs";
1
+ import { _ as combine, a as iffElse, i as iff, n as skippable, r as unless, t as throwIf } from "./predicates-BC8p_YLo.mjs";
2
+ import { _ as debug, a as softDelete, b as checkMulti, c as setField, d as preventChanges, f as paramsFromClient, g as disablePagination, h as disallow, i as stashable, l as setData, m as onDelete, n as throwIfIsProvider, o as setSlug, p as paramsForServer, r as throwIfIsMulti, s as setResult, t as traverse, u as rateLimit, v as createRelated, x as cache, y as checkRequired } from "./hooks-yFJ5FmU5.mjs";
3
+ import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-CanJtTPV.mjs";
4
+ import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-ClHfNFlm.mjs";
5
5
  export { cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, iff, iff as when, iffElse, onDelete, paramsForServer, paramsFromClient, preventChanges, rateLimit, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skippable, softDelete, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, transformData, transformQuery, transformResult, traverse, unless };
@@ -1,4 +1,4 @@
1
- import { E as KeyOf, O as MaybeArray, f as HookType$1, j as UnpackMaybeArray, n as ResultSingleHookContext, p as MethodName, t as DataSingleHookContext, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
1
+ import { E as KeyOf, O as MaybeArray, f as HookType$1, j as UnpackMaybeArray, l as DispatchOption, n as ResultSingleHookContext, p as MethodName, t as DataSingleHookContext, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { d as InferFindParams, m as InferFindResultSingle } from "./infer-service-methods-D7zRVQeJ.mjs";
3
3
  import * as _$_feathersjs_feathers0 from "@feathersjs/feathers";
4
4
  import { Application, HookContext, HookOptions, HookType, Id, Paginated, Params, Query, Service } from "@feathersjs/feathers";
@@ -341,6 +341,51 @@ type PatchBatchResultItem<T = Record<string, unknown>, P = Params> = [Id | null,
341
341
  */
342
342
  declare function patchBatch<T extends Record<string, any>, IdKey extends KeyOf<T>, P extends Params, R extends Omit<T, IdKey> = Omit<T, IdKey>>(items: T[], options?: PatchBatchOptions<IdKey>): PatchBatchResultItem<R, P>[];
343
343
  //#endregion
344
+ //#region src/utils/replace-data/replace-data.util.d.ts
345
+ /**
346
+ * Replaces `context.data` wholesale with the given items, preserving the original
347
+ * single-vs-array shape. This is the explicit inverse of `getDataIsArray`: get the
348
+ * data as an array, modify or replace the items, then write them back.
349
+ *
350
+ * @example
351
+ * ```ts
352
+ * import { getDataIsArray, replaceData } from 'feathers-utils/utils'
353
+ *
354
+ * const { data } = getDataIsArray(context)
355
+ * const next = data.map((item) => ({ ...item, slug: slugify(item.name) }))
356
+ * replaceData(context, next)
357
+ * ```
358
+ *
359
+ * @see https://utils.feathersjs.com/utils/replace-data.html
360
+ */
361
+ declare function replaceData<H extends HookContext = HookContext>(context: H, data: DataSingleHookContext<H>[]): H;
362
+ //#endregion
363
+ //#region src/utils/replace-result/replace-result.util.d.ts
364
+ type ReplaceResultOptions = {
365
+ /**
366
+ * Also (or only) write to `context.dispatch`. `true` writes dispatch, `'both'`
367
+ * writes both `result` and `dispatch`. When dispatch is requested and not yet
368
+ * present, it is seeded from a clone of `context.result`.
369
+ */
370
+ dispatch?: DispatchOption;
371
+ };
372
+ /**
373
+ * Replaces `context.result` (and/or `context.dispatch`) wholesale with the given
374
+ * items, preserving the original shape: single item, array, or paginated `{ data }`.
375
+ * This is the explicit inverse of `getResultIsArray`.
376
+ *
377
+ * @example
378
+ * ```ts
379
+ * import { getResultIsArray, replaceResult } from 'feathers-utils/utils'
380
+ *
381
+ * const { result } = getResultIsArray(context)
382
+ * replaceResult(context, result.filter((item) => item.public))
383
+ * ```
384
+ *
385
+ * @see https://utils.feathersjs.com/utils/replace-result.html
386
+ */
387
+ declare function replaceResult<H extends HookContext = HookContext>(context: H, result: ResultSingleHookContext<H>[], options?: ReplaceResultOptions): H;
388
+ //#endregion
344
389
  //#region src/utils/skip-result/skip-result.util.d.ts
345
390
  /**
346
391
  * Sets `context.result` to an appropriate empty value based on the hook method.
@@ -429,7 +474,7 @@ type WalkQueryOptions = {
429
474
  };
430
475
  type WalkQueryCallback = (options: WalkQueryOptions) => any;
431
476
  /**
432
- * Walks every property of a Feathers query (including nested `$and`/`$or`/`$nor`/`$not` arrays)
477
+ * Walks every property of a Feathers query (including nested `$and`/`$or`/`$nor` arrays)
433
478
  * and calls the `walker` function for each one. The walker receives the property name, operator,
434
479
  * value, and path, and can return a replacement value. Returns a new query only if changes were made.
435
480
  *
@@ -472,5 +517,5 @@ type ZipDataResultItem<D, R> = {
472
517
  */
473
518
  declare function zipDataResult<H extends HookContext, D extends DataSingleHookContext<H> = DataSingleHookContext<H>, R extends ResultSingleHookContext<H> = ResultSingleHookContext<H>>(context: H, options?: ZipDataResultOptions): ZipDataResultItem<D, R>[];
474
519
  //#endregion
475
- export { SkipHookName as A, contextToJson as C, isContext as D, IsContextOptions as E, addToQuery as O, defineHooks as S, checkContext as T, getResultIsArray as _, WalkQueryOptions as a, GetDataIsArrayReturn as b, transformParams as c, PatchBatchOptions as d, PatchBatchResultItem as f, GetResultIsArrayReturn as g, GetResultIsArrayOptions as h, WalkQueryCallback as i, addSkip as j, chunkFind as k, toPaginated as l, iterateFind as m, ZipDataResultOptions as n, walkQuery as o, patchBatch as p, zipDataResult as r, sortQueryProperties as s, ZipDataResultItem as t, skipResult as u, getPaginate as v, CheckContextOptions as w, getDataIsArray as x, getExposedMethods as y };
476
- //# sourceMappingURL=index-CNrzxmWo.d.mts.map
520
+ export { isContext as A, GetDataIsArrayReturn as C, CheckContextOptions as D, contextToJson as E, chunkFind as M, SkipHookName as N, checkContext as O, addSkip as P, getExposedMethods as S, defineHooks as T, iterateFind as _, WalkQueryOptions as a, getResultIsArray as b, transformParams as c, ReplaceResultOptions as d, replaceResult as f, patchBatch as g, PatchBatchResultItem as h, WalkQueryCallback as i, addToQuery as j, IsContextOptions as k, toPaginated as l, PatchBatchOptions as m, ZipDataResultOptions as n, walkQuery as o, replaceData as p, zipDataResult as r, sortQueryProperties as s, ZipDataResultItem as t, skipResult as u, GetResultIsArrayOptions as v, getDataIsArray as w, getPaginate as x, GetResultIsArrayReturn as y };
521
+ //# sourceMappingURL=index-CgAuzxiv.d.mts.map
package/dist/index.d.mts CHANGED
@@ -1,10 +1,10 @@
1
1
  import { C as hookTypes, S as TransportName, _ as PredicateItemWithContext, a as ContextFunction, b as TransformerFn, c as DefaultsInput, d as HookFunction, f as HookType, g as PredicateFn, h as PredicateContextSync, i as UnwrapPaginatedOrArray, l as DispatchOption, m as PredicateContextAsync, n as ResultSingleHookContext, o as ContextFunctionAsync, p as MethodName, r as UnwrapPaginated, s as ContextFunctionSync, t as DataSingleHookContext, u as FieldKey, v as StringFieldKey, w as methodNames, x as TransformerInputFn, y as TransformParamsFn } from "./hook-context-aHkq1h0N.mjs";
2
2
  import { C as InferResultFromPath, D as InferUpdateResultFromPath, E as InferUpdateResult, S as InferRemoveResultFromPath, T as InferUpdateDataFromPath, _ as InferPatchData, a as InferCreateDataSingleFromPath, b as InferPatchResultFromPath, c as InferCreateResultSingle, d as InferFindParams, f as InferFindResult, g as InferGetResultFromPath, h as InferGetResult, i as InferCreateDataSingle, l as InferCreateResultSingleFromPath, m as InferFindResultSingle, n as InferCreateData, o as InferCreateResult, p as InferFindResultFromPath, r as InferCreateDataFromPath, s as InferCreateResultFromPath, t as GetService, u as InferDataFromPath, v as InferPatchDataFromPath, w as InferUpdateData, x as InferRemoveResult, y as InferPatchResult } from "./infer-service-methods-D7zRVQeJ.mjs";
3
- import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BYWO9hzO.mjs";
4
- import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-BUwLePT2.mjs";
3
+ import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-BX0mOvdN.mjs";
4
+ import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-C8-4Lezj.mjs";
5
5
  import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-CA7-EaTw.mjs";
6
6
  import { CacheEvent, CacheOptions, CheckMultiOptions, CreateRelatedOptions, HookSetDataOptions, OnDeleteAction, OnDeleteOptions, ParamsForServerOptions, PreventChangesOptions, RateLimitOptions, SetFieldOptions, SetResultOptions, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, TraverseOptions, cache, checkMulti, checkRequired, combine, createRelated, debug, disablePagination, disallow, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, preventChanges, rateLimit, setData, setField, setResult, setSlug, softDelete, stashable, throwIfIsMulti, throwIfIsProvider, traverse } from "./hooks.mjs";
7
- import { A as SkipHookName, C as contextToJson, O as addToQuery, S as defineHooks, T as checkContext, _ as getResultIsArray, a as WalkQueryOptions, b as GetDataIsArrayReturn, c as transformParams, d as PatchBatchOptions, f as PatchBatchResultItem, g as GetResultIsArrayReturn, h as GetResultIsArrayOptions, i as WalkQueryCallback, j as addSkip, k as chunkFind, l as toPaginated, m as iterateFind, n as ZipDataResultOptions, o as walkQuery, p as patchBatch, r as zipDataResult, s as sortQueryProperties, t as ZipDataResultItem, u as skipResult, v as getPaginate, w as CheckContextOptions, x as getDataIsArray, y as getExposedMethods } from "./index-CNrzxmWo.mjs";
7
+ import { C as GetDataIsArrayReturn, D as CheckContextOptions, E as contextToJson, M as chunkFind, N as SkipHookName, O as checkContext, P as addSkip, S as getExposedMethods, T as defineHooks, _ as iterateFind, a as WalkQueryOptions, b as getResultIsArray, c as transformParams, d as ReplaceResultOptions, f as replaceResult, g as patchBatch, h as PatchBatchResultItem, i as WalkQueryCallback, j as addToQuery, l as toPaginated, m as PatchBatchOptions, n as ZipDataResultOptions, o as walkQuery, p as replaceData, r as zipDataResult, s as sortQueryProperties, t as ZipDataResultItem, u as skipResult, v as GetResultIsArrayOptions, w as getDataIsArray, x as getPaginate, y as GetResultIsArrayReturn } from "./index-CgAuzxiv.mjs";
8
8
  import { n as mutateResult, r as mutateData, t as MutateResultOptions } from "./mutate-result.util-BIeYlqqT.mjs";
9
9
  import { Paginated, PaginationOptions } from "@feathersjs/feathers";
10
10
 
@@ -15,5 +15,5 @@ type PaginatedOrArray<R, P = undefined> = P extends {
15
15
  paginate: PaginationOptions;
16
16
  } ? Paginated<R> : Paginated<R> | R[];
17
17
  //#endregion
18
- export { CacheEvent, CacheOptions, CheckContextOptions, CheckMultiOptions, ContextFunction, ContextFunctionAsync, ContextFunctionSync, CreateRelatedOptions, DataSingleHookContext, DefaultsInput, DispatchOption, FieldKey, GetDataIsArrayReturn, GetResultIsArrayOptions, GetResultIsArrayReturn, GetService, HookFunction, HookSetDataOptions, HookType, IffHook, InferCreateData, InferCreateDataFromPath, InferCreateDataSingle, InferCreateDataSingleFromPath, InferCreateResult, InferCreateResultFromPath, InferCreateResultSingle, InferCreateResultSingleFromPath, InferDataFromPath, InferFindParams, InferFindResult, InferFindResultFromPath, InferFindResultSingle, InferGetResult, InferGetResultFromPath, InferPatchData, InferPatchDataFromPath, InferPatchResult, InferPatchResultFromPath, InferRemoveResult, InferRemoveResultFromPath, InferResultFromPath, InferUpdateData, InferUpdateDataFromPath, InferUpdateResult, InferUpdateResultFromPath, MethodName, MutateResultOptions, OnDeleteAction, OnDeleteOptions, PaginatedOrArray, ParamsForServerOptions, PatchBatchOptions, PatchBatchResultItem, PredicateContextAsync, PredicateContextSync, PredicateFn, PredicateItemWithContext, PreventChangesOptions, RateLimitOptions, ResultSingleHookContext, SetFieldOptions, SetResultOptions, SkipHookName, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, StringFieldKey, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, ThrowIfOptions, TransformParamsFn, TransformResultOptions, TransformerFn, TransformerInputFn, TransportName, TraverseOptions, UnwrapPaginated, UnwrapPaginatedOrArray, WalkQueryCallback, WalkQueryOptions, ZipDataResultItem, ZipDataResultOptions, addSkip, addToQuery, cache, checkContext, checkMulti, checkRequired, chunkFind, combine, contextToJson, createRelated, debug, defineHooks, disablePagination, disallow, getDataIsArray, getExposedMethods, getPaginate, getResultIsArray, hookTypes, iff, iff as when, iffElse, iterateFind, methodNames, mutateData, mutateResult, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, patchBatch, preventChanges, rateLimit, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skipResult, skippable, softDelete, sortQueryProperties, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, toPaginated, transformData, transformParams, transformQuery, transformResult, traverse, unless, walkQuery, zipDataResult };
18
+ export { CacheEvent, CacheOptions, CheckContextOptions, CheckMultiOptions, ContextFunction, ContextFunctionAsync, ContextFunctionSync, CreateRelatedOptions, DataSingleHookContext, DefaultsInput, DispatchOption, FieldKey, GetDataIsArrayReturn, GetResultIsArrayOptions, GetResultIsArrayReturn, GetService, HookFunction, HookSetDataOptions, HookType, IffHook, InferCreateData, InferCreateDataFromPath, InferCreateDataSingle, InferCreateDataSingleFromPath, InferCreateResult, InferCreateResultFromPath, InferCreateResultSingle, InferCreateResultSingleFromPath, InferDataFromPath, InferFindParams, InferFindResult, InferFindResultFromPath, InferFindResultSingle, InferGetResult, InferGetResultFromPath, InferPatchData, InferPatchDataFromPath, InferPatchResult, InferPatchResultFromPath, InferRemoveResult, InferRemoveResultFromPath, InferResultFromPath, InferUpdateData, InferUpdateDataFromPath, InferUpdateResult, InferUpdateResultFromPath, MethodName, MutateResultOptions, OnDeleteAction, OnDeleteOptions, PaginatedOrArray, ParamsForServerOptions, PatchBatchOptions, PatchBatchResultItem, PredicateContextAsync, PredicateContextSync, PredicateFn, PredicateItemWithContext, PreventChangesOptions, RateLimitOptions, ReplaceResultOptions, ResultSingleHookContext, SetFieldOptions, SetResultOptions, SkipHookName, SoftDeleteOptionFunction, SoftDeleteOptions, StashableOptions, StringFieldKey, ThrowIfIsIsProviderOptions, ThrowIfIsMultiOptions, ThrowIfOptions, TransformParamsFn, TransformResultOptions, TransformerFn, TransformerInputFn, TransportName, TraverseOptions, UnwrapPaginated, UnwrapPaginatedOrArray, WalkQueryCallback, WalkQueryOptions, ZipDataResultItem, ZipDataResultOptions, addSkip, addToQuery, cache, checkContext, checkMulti, checkRequired, chunkFind, combine, contextToJson, createRelated, debug, defineHooks, disablePagination, disallow, getDataIsArray, getExposedMethods, getPaginate, getResultIsArray, hookTypes, iff, iff as when, iffElse, iterateFind, methodNames, mutateData, mutateResult, onDelete, paramsForServer, paramsFromClient, paramsFromClientOptions, patchBatch, preventChanges, rateLimit, replaceData, replaceResult, resolve, resolveData, resolveQuery, resolveResult, setData, setField, setResult, setSlug, skipResult, skippable, softDelete, sortQueryProperties, stashable, throwIf, throwIfIsMulti, throwIfIsProvider, toPaginated, transformData, transformParams, transformQuery, transformResult, traverse, unless, walkQuery, zipDataResult };
19
19
  //# sourceMappingURL=index.d.mts.map