feathers-utils 10.0.3 → 10.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/guards.mjs.map +1 -1
- package/dist/{hook-context-aHkq1h0N.d.mts → hook-context-BsxU1vfN.d.mts} +1 -1
- package/dist/{hooks-DnnG02nv.mjs → hooks-DzXD-3FR.mjs} +6 -6
- package/dist/{hooks-DnnG02nv.mjs.map → hooks-DzXD-3FR.mjs.map} +1 -1
- package/dist/hooks.d.mts +8 -9
- package/dist/hooks.mjs +4 -4
- package/dist/{index-CgAuzxiv.d.mts → index-DXXeX7lF.d.mts} +4 -5
- package/dist/index.d.mts +7 -7
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/{infer-service-methods-D7zRVQeJ.d.mts → infer-service-methods-C-9x7P40.d.mts} +2 -2
- package/dist/{internal.utils-BLvFEJa8.mjs → internal.utils-BMzV_-xp.mjs} +1 -1
- package/dist/{internal.utils-BLvFEJa8.mjs.map → internal.utils-BMzV_-xp.mjs.map} +1 -1
- package/dist/{mutate-result.util-BIeYlqqT.d.mts → mutate-result.util-DR9JMsvl.d.mts} +2 -2
- package/dist/{mutate-result.util-B4r7WRvK.mjs → mutate-result.util-Dqzepn1M.mjs} +2 -2
- package/dist/{mutate-result.util-B4r7WRvK.mjs.map → mutate-result.util-Dqzepn1M.mjs.map} +1 -1
- package/dist/{predicates-EsfMD2Yp.mjs → predicates-puYa4nkf.mjs} +2 -2
- package/dist/{predicates-EsfMD2Yp.mjs.map → predicates-puYa4nkf.mjs.map} +1 -1
- package/dist/predicates.d.mts +5 -6
- package/dist/predicates.mjs +1 -1
- package/dist/{resolve-83Oiyb_b.mjs → resolve-B9hRleHY.mjs} +2 -2
- package/dist/{resolve-83Oiyb_b.mjs.map → resolve-B9hRleHY.mjs.map} +1 -1
- package/dist/{resolve-CA7-EaTw.d.mts → resolve-Cmxskunj.d.mts} +2 -2
- package/dist/resolvers.d.mts +2 -2
- package/dist/resolvers.mjs +1 -1
- package/dist/resolvers.mjs.map +1 -1
- package/dist/{transform-result.hook-DYDF8wod.mjs → transform-result.hook-B65pTRJO.mjs} +2 -2
- package/dist/{transform-result.hook-DYDF8wod.mjs.map → transform-result.hook-B65pTRJO.mjs.map} +1 -1
- package/dist/{transform-result.hook-C8-4Lezj.d.mts → transform-result.hook-C9wMLWs2.d.mts} +2 -2
- package/dist/transformers.d.mts +3 -3
- package/dist/transformers.mjs +3 -3
- package/dist/transformers.mjs.map +1 -1
- package/dist/{unless.hook-BX0mOvdN.d.mts → unless.hook-CVw1wX_x.d.mts} +4 -5
- package/dist/{utils-j3XwDon2.mjs → utils-C2GLf_mV.mjs} +3 -3
- package/dist/{utils-j3XwDon2.mjs.map → utils-C2GLf_mV.mjs.map} +1 -1
- package/dist/utils.d.mts +2 -2
- package/dist/utils.mjs +3 -3
- package/package.json +24 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.utils-
|
|
1
|
+
{"version":3,"file":"internal.utils-BMzV_-xp.mjs","names":[],"sources":["../src/common/traverse.ts","../src/common/index.ts","../src/internal.utils.ts"],"sourcesContent":["import _traverse from 'neotraverse'\n\n/**\n * Recursively traverses items (or an array of items) and applies a converter function\n * to every node using `neotraverse`. Modifications happen in place.\n *\n * @example\n * ```ts\n * traverse(items, function () { if (this.key === 'secret') this.remove() })\n * ```\n */\nexport function traverse<T extends Record<string, any>>(\n items: T | T[],\n converter: (item: T) => void,\n) {\n ;(Array.isArray(items) ? items : [items]).forEach((item) => {\n _traverse(item).forEach(converter) // replacement is in place\n })\n}\n","/**\n * Type guard that checks if a value is a `Promise` instance.\n *\n * @example\n * ```ts\n * const result = maybeSyncFn()\n * if (isPromise(result)) {\n * await result\n * }\n * ```\n */\nexport function isPromise(p: any): p is Promise<any> {\n return p instanceof Promise\n}\n\nexport { traverse } from './traverse.js'\nexport { clone } from './clone.js'\n","import type { HookContext } from '@feathersjs/feathers'\n\nexport const hasOwnProperty = (\n obj: Record<string, unknown>,\n ...keys: string[]\n): boolean => {\n return keys.some((x) => Object.prototype.hasOwnProperty.call(obj, x))\n}\n\nexport type MaybeArray<T> = T | readonly T[]\nexport type UnpackMaybeArray<T> = T extends readonly (infer E)[] ? E : T\n/**\n * Normalizes a value or array into an array. The returned array MUST be treated\n * as read-only — when the input is already an array it is returned as-is (no copy)\n * to avoid a per-call allocation on hook hot paths.\n */\nexport const toArray = <T>(value: T | readonly T[]): T[] =>\n Array.isArray(value) ? (value as T[]) : [value as T]\n\nexport type Promisable<T> = T | Promise<T>\nexport type KeyOf<T> = Extract<keyof T, string>\n\nexport type UnwrapArray<T> = T extends Array<infer U> ? U : T\n\nexport type IsAny<T> = 0 extends 1 & T ? true : false\n\nexport type AnyFallback<T, Fallback> = IsAny<T> extends true ? Fallback : T\n\nexport type NeverFallback<Never, Fallback> = [Never] extends [never]\n ? Fallback\n : Never\n\nexport type KeyOfOrDotNotation<D> = KeyOf<D> | `${KeyOf<D>}.${string}`\n\n/**+\n * Can be used to early return a hook.\n *\n * If it's an around hook, it will call `next` if provided.\n */\nexport const early = <H extends HookContext>(\n context: H,\n next?: (context: H) => Promisable<void>,\n): Promisable<void> => {\n if (next) {\n return next(context)\n }\n return\n}\n"],"mappings":";;;;;;;;;;;AAWA,SAAgB,SACd,OACA,WACA;CACC,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAA,CAAG,SAAS,SAAS;EAC1D,UAAU,IAAI,CAAC,CAAC,QAAQ,SAAS;CACnC,CAAC;AACH;;;;;;;;;;;;;;ACPA,SAAgB,UAAU,GAA2B;CACnD,OAAO,aAAa;AACtB;;;ACXA,MAAa,kBACX,KACA,GAAG,SACS;CACZ,OAAO,KAAK,MAAM,MAAM,OAAO,UAAU,eAAe,KAAK,KAAK,CAAC,CAAC;AACtE;;;;;;AASA,MAAa,WAAc,UACzB,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC,KAAU;;;;;;AAsBrD,MAAa,SACX,SACA,SACqB;CACrB,IAAI,MACF,OAAO,KAAK,OAAO;AAGvB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as Promisable, l as DispatchOption, x as TransformerInputFn } from "./hook-context-
|
|
1
|
+
import { A as Promisable, l as DispatchOption, x as TransformerInputFn } from "./hook-context-BsxU1vfN.mjs";
|
|
2
2
|
import { HookContext, NextFunction } from "@feathersjs/feathers";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/mutate-data/mutate-data.util.d.ts
|
|
@@ -41,4 +41,4 @@ type MutateResultOptions = {
|
|
|
41
41
|
declare function mutateResult<H extends HookContext = HookContext>(context: H, transformer: TransformerInputFn<any, H>, options?: MutateResultOptions): Promisable<H>;
|
|
42
42
|
//#endregion
|
|
43
43
|
export { mutateResult as n, mutateData as r, MutateResultOptions as t };
|
|
44
|
-
//# sourceMappingURL=mutate-result.util-
|
|
44
|
+
//# sourceMappingURL=mutate-result.util-DR9JMsvl.d.mts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as isPromise } from "./internal.utils-
|
|
1
|
+
import { i as isPromise } from "./internal.utils-BMzV_-xp.mjs";
|
|
2
2
|
import { copy } from "fast-copy";
|
|
3
3
|
//#region src/utils/get-data-is-array/get-data-is-array.util.ts
|
|
4
4
|
/**
|
|
@@ -220,4 +220,4 @@ function mutateResult(context, transformer, options) {
|
|
|
220
220
|
//#endregion
|
|
221
221
|
export { getResultIsArray as a, replaceData as i, replaceResult as n, getDataIsArray as o, mutateData as r, mutateResult as t };
|
|
222
222
|
|
|
223
|
-
//# sourceMappingURL=mutate-result.util-
|
|
223
|
+
//# sourceMappingURL=mutate-result.util-Dqzepn1M.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutate-result.util-B4r7WRvK.mjs","names":[],"sources":["../src/utils/get-data-is-array/get-data-is-array.util.ts","../src/utils/get-result-is-array/get-result-is-array.util.ts","../src/utils/replace-data/replace-data.util.ts","../src/utils/mutate-data/mutate-data.util.ts","../src/utils/replace-result/replace-result.util.ts","../src/utils/mutate-result/mutate-result.util.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type GetDataIsArrayReturn<H extends HookContext = HookContext> = {\n isArray: boolean\n data: DataSingleHookContext<H>[]\n}\n\n/**\n * Normalizes `context.data` into an array for uniform processing.\n * Returns `{ data, isArray }` where `data` is always an array and `isArray` indicates\n * whether the original value was already an array.\n *\n * @example\n * ```ts\n * import { getDataIsArray } from 'feathers-utils/utils'\n *\n * const { data, isArray } = getDataIsArray(context)\n * data.forEach(item => { /* process each item *\\/ })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-data-is-array.html\n */\nexport function getDataIsArray<H extends HookContext = HookContext>(\n context: H,\n): GetDataIsArrayReturn<H> {\n if (!context.data) {\n return {\n isArray: false,\n data: [],\n }\n }\n\n const isArray = Array.isArray(context.data)\n\n return {\n isArray,\n data: isArray ? context.data : [context.data],\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { copy } from 'fast-copy'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type GetResultIsArrayOptions = {\n dispatch?: boolean\n}\n\nexport type GetResultIsArrayReturn<H extends HookContext = HookContext> = {\n isArray: boolean\n result: ResultSingleHookContext<H>[]\n key: 'dispatch' | 'result'\n}\n\n/**\n * Normalizes `context.result` (or `context.dispatch`) into an array for uniform processing.\n * Handles paginated results by extracting the `data` array. Returns `{ result, isArray, key }`\n * where `key` indicates whether `'result'` or `'dispatch'` was used.\n *\n * @example\n * ```ts\n * import { getResultIsArray } from 'feathers-utils/utils'\n *\n * const { result, isArray } = getResultIsArray(context)\n * result.forEach(item => { /* process each item *\\/ })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-result-is-array.html\n */\nexport function getResultIsArray<H extends HookContext = HookContext>(\n context: H,\n options?: GetResultIsArrayOptions,\n): GetResultIsArrayReturn<H> {\n const { dispatch = false } = options || {}\n\n const isDispatch: boolean = dispatch && context.dispatch !== undefined\n\n const result = dispatch\n ? isDispatch\n ? context.dispatch\n : copy(context.result)\n : context.result\n\n if (!result) {\n return {\n isArray: false,\n result: [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n }\n\n const items = context.method === 'find' ? result.data || result : result\n\n const isArray = Array.isArray(items)\n\n return {\n isArray,\n result: isArray ? items : items ? [items] : [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n}\n","import type { HookContext } from \"@feathersjs/feathers\";\nimport type { DataSingleHookContext } from \"../../utility-types/hook-context.js\";\n\n/**\n * Replaces `context.data` wholesale with the given items, preserving the original\n * single-vs-array shape. This is the explicit inverse of `getDataIsArray`: get the\n * data as an array, modify or replace the items, then write them back.\n *\n * @example\n * ```ts\n * import { getDataIsArray, replaceData } from 'feathers-utils/utils'\n *\n * const { data } = getDataIsArray(context)\n * const next = data.map((item) => ({ ...item, slug: slugify(item.name) }))\n * replaceData(context, next)\n * ```\n *\n * @see https://utils.feathersjs.com/utils/replace-data.html\n */\nexport function replaceData<H extends HookContext = HookContext>(\n context: H,\n data: DataSingleHookContext<H>[],\n): H {\n context.data = Array.isArray(context.data) ? data : data[0];\n return context;\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getDataIsArray } from '../get-data-is-array/get-data-is-array.util.js'\nimport { replaceData } from '../replace-data/replace-data.util.js'\nimport { isPromise } from '../../common/index.js'\nimport type { Promisable } from '../../internal.utils.js'\nimport type { TransformerInputFn } from '../../types.js'\n\n/**\n * Applies a transformer function to each item in `context.data`, updating it in place.\n * If the transformer returns a new object, it replaces the original item.\n * Correctly handles both single-item and array data, preserving the original shape.\n *\n * @example\n * ```ts\n * import { mutateData } from 'feathers-utils/utils'\n *\n * await mutateData(context, (item) => { item.name = item.name.trim() })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/mutate-data.html\n */\nexport function mutateData<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerInputFn<any, H>,\n): Promisable<H> {\n if (!context.data) {\n return context\n }\n\n // single-item fast path: avoid allocating a wrapper array + a mapped array\n // for the common single create/update/patch case.\n if (!Array.isArray(context.data)) {\n const item = context.data\n const result = transformer(item, { context, i: 0 })\n\n if (isPromise(result)) {\n return result.then((res: any) => {\n context.data = res ?? item\n return context\n })\n }\n\n context.data = result ?? item\n return context\n }\n\n const { data } = getDataIsArray(context)\n\n if (!data.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = data.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(data: any) {\n // delegate the array writeback (single is handled by the fast path above)\n return replaceData(context, data)\n }\n\n if (hasPromises) {\n return Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n}\n","import type { HookContext } from \"@feathersjs/feathers\";\nimport { copy } from \"fast-copy\";\nimport { getResultIsArray } from \"../get-result-is-array/get-result-is-array.util.js\";\nimport type { DispatchOption } from \"../../types.js\";\nimport type { ResultSingleHookContext } from \"../../utility-types/hook-context.js\";\n\nexport type ReplaceResultOptions = {\n /**\n * Also (or only) write to `context.dispatch`. `true` writes dispatch, `'both'`\n * writes both `result` and `dispatch`. When dispatch is requested and not yet\n * present, it is seeded from a clone of `context.result`.\n */\n dispatch?: DispatchOption;\n};\n\n/**\n * Replaces `context.result` (and/or `context.dispatch`) wholesale with the given\n * items, preserving the original shape: single item, array, or paginated `{ data }`.\n * This is the explicit inverse of `getResultIsArray`.\n *\n * @example\n * ```ts\n * import { getResultIsArray, replaceResult } from 'feathers-utils/utils'\n *\n * const { result } = getResultIsArray(context)\n * replaceResult(context, result.filter((item) => item.public))\n * ```\n *\n * @see https://utils.feathersjs.com/utils/replace-result.html\n */\nexport function replaceResult<H extends HookContext = HookContext>(\n context: H,\n result: ResultSingleHookContext<H>[],\n options?: ReplaceResultOptions,\n): H {\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result);\n }\n\n const write = (dispatch: boolean) => {\n const { isArray, key } = getResultIsArray(context, { dispatch });\n\n if (!isArray) {\n context[key] = result[0];\n } else if (!Array.isArray(context[key]) && context[key]?.data) {\n context[key].data = result;\n } else {\n context[key] = result;\n }\n };\n\n if (options?.dispatch === \"both\") {\n write(true);\n write(false);\n } else {\n write(!!options?.dispatch);\n }\n\n return context;\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { getResultIsArray } from '../get-result-is-array/get-result-is-array.util.js'\nimport { replaceResult } from '../replace-result/replace-result.util.js'\nimport { isPromise } from '../../common/index.js'\nimport { copy } from 'fast-copy'\nimport type { Promisable } from '../../internal.utils.js'\nimport type { DispatchOption, TransformerInputFn } from '../../types.js'\n\nexport type MutateResultOptions = {\n next?: NextFunction\n transform?: (items: any[]) => any[]\n dispatch?: DispatchOption\n}\n\n/**\n * Applies a transformer function to each item in `context.result` (and optionally `context.dispatch`).\n * Handles paginated results, single items, and arrays transparently.\n * Use the `dispatch` option to control whether result, dispatch, or both are transformed.\n *\n * @example\n * ```ts\n * import { mutateResult } from 'feathers-utils/utils'\n *\n * await mutateResult(context, (item) => { delete item.password })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/mutate-result.html\n */\nexport function mutateResult<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerInputFn<any, H>,\n options?: MutateResultOptions,\n): Promisable<H> {\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result)\n }\n\n function forResult(dispatch: boolean): Promisable<H> {\n const { result } = getResultIsArray(context, { dispatch })\n\n if (!result.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = result.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(r: any) {\n if (options?.transform) {\n r = options.transform(r)\n }\n\n // delegate the single/array/paginated writeback to replaceResult\n return replaceResult(context, r, { dispatch })\n }\n\n if (hasPromises) {\n return Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n }\n\n function run(): Promisable<H> {\n if (options?.dispatch === 'both') {\n const a = forResult(true)\n const b = forResult(false)\n\n if (isPromise(a) || isPromise(b)) {\n return Promise.all([a, b]).then(() => context)\n }\n\n return context\n }\n\n return forResult(options?.dispatch ?? false)\n }\n\n if (options?.next) {\n return options.next().then(run)\n }\n\n return run()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mutate-result.util-Dqzepn1M.mjs","names":[],"sources":["../src/utils/get-data-is-array/get-data-is-array.util.ts","../src/utils/get-result-is-array/get-result-is-array.util.ts","../src/utils/replace-data/replace-data.util.ts","../src/utils/mutate-data/mutate-data.util.ts","../src/utils/replace-result/replace-result.util.ts","../src/utils/mutate-result/mutate-result.util.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type GetDataIsArrayReturn<H extends HookContext = HookContext> = {\n isArray: boolean\n data: DataSingleHookContext<H>[]\n}\n\n/**\n * Normalizes `context.data` into an array for uniform processing.\n * Returns `{ data, isArray }` where `data` is always an array and `isArray` indicates\n * whether the original value was already an array.\n *\n * @example\n * ```ts\n * import { getDataIsArray } from 'feathers-utils/utils'\n *\n * const { data, isArray } = getDataIsArray(context)\n * data.forEach(item => { /* process each item *\\/ })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-data-is-array.html\n */\nexport function getDataIsArray<H extends HookContext = HookContext>(\n context: H,\n): GetDataIsArrayReturn<H> {\n if (!context.data) {\n return {\n isArray: false,\n data: [],\n }\n }\n\n const isArray = Array.isArray(context.data)\n\n return {\n isArray,\n data: isArray ? context.data : [context.data],\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { copy } from 'fast-copy'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\n\nexport type GetResultIsArrayOptions = {\n dispatch?: boolean\n}\n\nexport type GetResultIsArrayReturn<H extends HookContext = HookContext> = {\n isArray: boolean\n result: ResultSingleHookContext<H>[]\n key: 'dispatch' | 'result'\n}\n\n/**\n * Normalizes `context.result` (or `context.dispatch`) into an array for uniform processing.\n * Handles paginated results by extracting the `data` array. Returns `{ result, isArray, key }`\n * where `key` indicates whether `'result'` or `'dispatch'` was used.\n *\n * @example\n * ```ts\n * import { getResultIsArray } from 'feathers-utils/utils'\n *\n * const { result, isArray } = getResultIsArray(context)\n * result.forEach(item => { /* process each item *\\/ })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-result-is-array.html\n */\nexport function getResultIsArray<H extends HookContext = HookContext>(\n context: H,\n options?: GetResultIsArrayOptions,\n): GetResultIsArrayReturn<H> {\n const { dispatch = false } = options || {}\n\n const isDispatch: boolean = dispatch && context.dispatch !== undefined\n\n const result = dispatch\n ? isDispatch\n ? context.dispatch\n : copy(context.result)\n : context.result\n\n if (!result) {\n return {\n isArray: false,\n result: [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n }\n\n const items = context.method === 'find' ? result.data || result : result\n\n const isArray = Array.isArray(items)\n\n return {\n isArray,\n result: isArray ? items : items ? [items] : [],\n key: isDispatch ? 'dispatch' : 'result',\n }\n}\n","import type { HookContext } from \"@feathersjs/feathers\";\nimport type { DataSingleHookContext } from \"../../utility-types/hook-context.js\";\n\n/**\n * Replaces `context.data` wholesale with the given items, preserving the original\n * single-vs-array shape. This is the explicit inverse of `getDataIsArray`: get the\n * data as an array, modify or replace the items, then write them back.\n *\n * @example\n * ```ts\n * import { getDataIsArray, replaceData } from 'feathers-utils/utils'\n *\n * const { data } = getDataIsArray(context)\n * const next = data.map((item) => ({ ...item, slug: slugify(item.name) }))\n * replaceData(context, next)\n * ```\n *\n * @see https://utils.feathersjs.com/utils/replace-data.html\n */\nexport function replaceData<H extends HookContext = HookContext>(\n context: H,\n data: DataSingleHookContext<H>[],\n): H {\n context.data = Array.isArray(context.data) ? data : data[0];\n return context;\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getDataIsArray } from '../get-data-is-array/get-data-is-array.util.js'\nimport { replaceData } from '../replace-data/replace-data.util.js'\nimport { isPromise } from '../../common/index.js'\nimport type { Promisable } from '../../internal.utils.js'\nimport type { TransformerInputFn } from '../../types.js'\n\n/**\n * Applies a transformer function to each item in `context.data`, updating it in place.\n * If the transformer returns a new object, it replaces the original item.\n * Correctly handles both single-item and array data, preserving the original shape.\n *\n * @example\n * ```ts\n * import { mutateData } from 'feathers-utils/utils'\n *\n * await mutateData(context, (item) => { item.name = item.name.trim() })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/mutate-data.html\n */\nexport function mutateData<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerInputFn<any, H>,\n): Promisable<H> {\n if (!context.data) {\n return context\n }\n\n // single-item fast path: avoid allocating a wrapper array + a mapped array\n // for the common single create/update/patch case.\n if (!Array.isArray(context.data)) {\n const item = context.data\n const result = transformer(item, { context, i: 0 })\n\n if (isPromise(result)) {\n return result.then((res: any) => {\n context.data = res ?? item\n return context\n })\n }\n\n context.data = result ?? item\n return context\n }\n\n const { data } = getDataIsArray(context)\n\n if (!data.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = data.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(data: any) {\n // delegate the array writeback (single is handled by the fast path above)\n return replaceData(context, data)\n }\n\n if (hasPromises) {\n return Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n}\n","import type { HookContext } from \"@feathersjs/feathers\";\nimport { copy } from \"fast-copy\";\nimport { getResultIsArray } from \"../get-result-is-array/get-result-is-array.util.js\";\nimport type { DispatchOption } from \"../../types.js\";\nimport type { ResultSingleHookContext } from \"../../utility-types/hook-context.js\";\n\nexport type ReplaceResultOptions = {\n /**\n * Also (or only) write to `context.dispatch`. `true` writes dispatch, `'both'`\n * writes both `result` and `dispatch`. When dispatch is requested and not yet\n * present, it is seeded from a clone of `context.result`.\n */\n dispatch?: DispatchOption;\n};\n\n/**\n * Replaces `context.result` (and/or `context.dispatch`) wholesale with the given\n * items, preserving the original shape: single item, array, or paginated `{ data }`.\n * This is the explicit inverse of `getResultIsArray`.\n *\n * @example\n * ```ts\n * import { getResultIsArray, replaceResult } from 'feathers-utils/utils'\n *\n * const { result } = getResultIsArray(context)\n * replaceResult(context, result.filter((item) => item.public))\n * ```\n *\n * @see https://utils.feathersjs.com/utils/replace-result.html\n */\nexport function replaceResult<H extends HookContext = HookContext>(\n context: H,\n result: ResultSingleHookContext<H>[],\n options?: ReplaceResultOptions,\n): H {\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result);\n }\n\n const write = (dispatch: boolean) => {\n const { isArray, key } = getResultIsArray(context, { dispatch });\n\n if (!isArray) {\n context[key] = result[0];\n } else if (!Array.isArray(context[key]) && context[key]?.data) {\n context[key].data = result;\n } else {\n context[key] = result;\n }\n };\n\n if (options?.dispatch === \"both\") {\n write(true);\n write(false);\n } else {\n write(!!options?.dispatch);\n }\n\n return context;\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { getResultIsArray } from '../get-result-is-array/get-result-is-array.util.js'\nimport { replaceResult } from '../replace-result/replace-result.util.js'\nimport { isPromise } from '../../common/index.js'\nimport { copy } from 'fast-copy'\nimport type { Promisable } from '../../internal.utils.js'\nimport type { DispatchOption, TransformerInputFn } from '../../types.js'\n\nexport type MutateResultOptions = {\n next?: NextFunction\n transform?: (items: any[]) => any[]\n dispatch?: DispatchOption\n}\n\n/**\n * Applies a transformer function to each item in `context.result` (and optionally `context.dispatch`).\n * Handles paginated results, single items, and arrays transparently.\n * Use the `dispatch` option to control whether result, dispatch, or both are transformed.\n *\n * @example\n * ```ts\n * import { mutateResult } from 'feathers-utils/utils'\n *\n * await mutateResult(context, (item) => { delete item.password })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/mutate-result.html\n */\nexport function mutateResult<H extends HookContext = HookContext>(\n context: H,\n transformer: TransformerInputFn<any, H>,\n options?: MutateResultOptions,\n): Promisable<H> {\n if (!!options?.dispatch && !context.dispatch) {\n context.dispatch = copy(context.result)\n }\n\n function forResult(dispatch: boolean): Promisable<H> {\n const { result } = getResultIsArray(context, { dispatch })\n\n if (!result.length) {\n return context\n }\n\n let hasPromises = false\n\n const results = result.map((item, i) => {\n const result = transformer(item, { context, i })\n\n if (isPromise(result)) {\n hasPromises = true\n return result.then((res: any) => res ?? item)\n }\n\n return result ?? item\n })\n\n function mutate(r: any) {\n if (options?.transform) {\n r = options.transform(r)\n }\n\n // delegate the single/array/paginated writeback to replaceResult\n return replaceResult(context, r, { dispatch })\n }\n\n if (hasPromises) {\n return Promise.all(results).then(mutate)\n } else {\n return mutate(results)\n }\n }\n\n function run(): Promisable<H> {\n if (options?.dispatch === 'both') {\n const a = forResult(true)\n const b = forResult(false)\n\n if (isPromise(a) || isPromise(b)) {\n return Promise.all([a, b]).then(() => context)\n }\n\n return context\n }\n\n return forResult(options?.dispatch ?? false)\n }\n\n if (options?.next) {\n return options.next().then(run)\n }\n\n return run()\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as isPromise, n as hasOwnProperty, r as toArray } from "./internal.utils-
|
|
1
|
+
import { i as isPromise, n as hasOwnProperty, r as toArray } from "./internal.utils-BMzV_-xp.mjs";
|
|
2
2
|
import { BadRequest, GeneralError, MethodNotAllowed } from "@feathersjs/errors";
|
|
3
3
|
//#region src/utils/combine/combine.util.ts
|
|
4
4
|
/**
|
|
@@ -438,4 +438,4 @@ const throwIf = (predicate, options) => {
|
|
|
438
438
|
//#endregion
|
|
439
439
|
export { combine as _, iffElse as a, shouldSkip as c, isPaginated as d, getPaginate as f, every as g, and as h, iff as i, not as l, isContext as m, skippable as n, or as o, isMulti as p, unless as r, some as s, throwIf as t, isProvider as u };
|
|
440
440
|
|
|
441
|
-
//# sourceMappingURL=predicates-
|
|
441
|
+
//# sourceMappingURL=predicates-puYa4nkf.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"predicates-EsfMD2Yp.mjs","names":[],"sources":["../src/utils/combine/combine.util.ts","../src/predicates/and/and.predicate.ts","../src/predicates/is-context/is-context.predicate.ts","../src/predicates/is-multi/is-multi.predicate.ts","../src/utils/get-paginate/get-paginate.util.ts","../src/predicates/is-paginated/is-paginated.predicate.ts","../src/predicates/is-provider/is-provider.predicate.ts","../src/predicates/not/not.predicate.ts","../src/predicates/should-skip/should-skip.predicate.ts","../src/predicates/or/or.predicate.ts","../src/hooks/iff-else/iff-else.hook.ts","../src/hooks/iff/iff.hook.ts","../src/hooks/unless/unless.hook.ts","../src/hooks/skippable/skippable.hook.ts","../src/hooks/throw-if/throw-if.hook.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { HookFunction } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Sequentially executes multiple hooks, passing the updated context from one to the next.\n * Returns a single hook function that runs the entire chain. If any hook throws,\n * the error is annotated with the current hook context.\n *\n * @example\n * ```ts\n * import { combine } from 'feathers-utils/hooks'\n *\n * const combinedHook = combine(hookA(), hookB(), hookC())\n * app.service('users').hooks({ before: { create: [combinedHook] } })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/combine.html\n */\nexport function combine<H extends HookContext = HookContext>(\n ...serviceHooks: HookFunction<H>[]\n) {\n const isContext = function (ctx: H) {\n return typeof ctx?.method === 'string' && typeof ctx?.type === 'string'\n }\n\n return async function (context: H) {\n let ctx = context\n\n const updateCurrentHook = (current: void | H) => {\n // Either use the returned hook object or the current\n // hook object from the chain if the hook returned undefined\n if (current) {\n if (!isContext(current)) {\n throw new Error(\n `${ctx.type} hook for '${ctx.method}' method returned invalid hook object`,\n )\n }\n\n ctx = current\n }\n\n return ctx\n }\n\n // Run the hooks sequentially, only awaiting when a hook is actually async.\n // Avoids a microtask hop per hook and a per-hook `bind` allocation.\n try {\n for (const fn of serviceHooks) {\n // @ts-expect-error `this` is the bound service-hook context\n const currentCtx = fn.call(this, ctx)\n updateCurrentHook(isPromise(currentCtx) ? await currentCtx : currentCtx)\n }\n return ctx\n } catch (error: any) {\n // Add the hook information to any errors\n error.hook = ctx\n throw error\n }\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` only when **all** given predicates are `true` (logical AND).\n * Supports both sync and async predicates. Short-circuits on the first `false` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, and, isProvider, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(and(isProvider('external'), isMulti), checkMulti())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/and.html\n */\nexport const and = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // The identity element of logical AND is `true` (an empty AND is true).\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n if (isPromise(result)) {\n promises.push(result)\n } else if (!result) {\n // any falsy sync result short-circuits to false\n return false\n }\n }\n\n if (!promises.length) {\n return true\n }\n\n return Promise.all(promises).then((results) =>\n results.every((result) => !!result),\n )\n }\n}\n\n// Alias for 'every'\nexport const every = and\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\nexport type IsContextOptions<H extends HookContext = HookContext> = {\n path?: MaybeArray<H['path']>\n type?: MaybeArray<H['type']>\n method?: MaybeArray<H['method']>\n}\n\n/**\n * Returns a predicate that checks whether the hook context matches the given criteria.\n * You can filter by `path` (service name), `type` (before/after/around/error),\n * and/or `method` (find/get/create/update/patch/remove).\n *\n * @example\n * ```ts\n * import { iff, isContext } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isContext({ method: 'create', type: 'before' }), validateHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-context.html\n */\nexport const isContext = <H extends HookContext = HookContext>(\n options: IsContextOptions<H>,\n) => {\n const path = options.path != null ? toArray(options.path) : undefined\n const type = options.type != null ? toArray(options.type) : undefined\n const method = options.method != null ? toArray(options.method) : undefined\n\n return (context: any): boolean => {\n if (path && !path.some((x) => context.path === x)) {\n return false\n }\n\n if (type && !type.some((x) => context.type === x)) {\n return false\n }\n\n if (method && !method.some((x) => context.method === x)) {\n return false\n }\n\n return true\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Checks if the current hook context represents a multi operation.\n * Returns `true` for `find`, for `create` with array data, and for `patch`/`remove`\n * with `id === null`. Returns `false` for `get` and `update`.\n *\n * @example\n * ```ts\n * import { iff, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isMulti, rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-multi.html\n */\nexport const isMulti = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n const { method } = context\n if (method === 'find') {\n return true\n } else if (method === 'patch' || method === 'remove') {\n return context.id == null\n } else if (method === 'create') {\n return Array.isArray(context.data)\n } else if (method === 'get' || method === 'update') {\n return false\n }\n\n return false\n}\n","import type { PaginationOptions } from '@feathersjs/adapter-commons'\nimport type { HookContext } from '@feathersjs/feathers'\nimport { hasOwnProperty } from '../../internal.utils.js'\n\n/**\n * Resolves the active pagination options for the current hook context.\n * Checks (in order): `context.params.paginate`, `service.options.paginate`,\n * and `context.params.adapter.paginate`. Returns `undefined` if pagination is disabled.\n *\n * @example\n * ```ts\n * import { getPaginate } from 'feathers-utils/utils'\n *\n * const paginate = getPaginate(context)\n * if (paginate) {\n * console.log('Max items:', paginate.max)\n * }\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-paginate.html\n */\nexport const getPaginate = <H extends HookContext = HookContext>(\n context: H,\n): PaginationOptions | undefined => {\n if (hasOwnProperty(context.params, 'paginate')) {\n // covers `paginate: false` too (`false || undefined` -> undefined)\n return (context.params.paginate as PaginationOptions) || undefined\n }\n\n let options = context.service?.options || {}\n\n options = {\n ...options,\n ...context.params.adapter,\n }\n\n return options.paginate || undefined\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getPaginate } from '../../utils/get-paginate/get-paginate.util.js'\n\n/**\n * Checks if the current `find` operation is paginated by inspecting\n * `params.paginate` and the service's pagination options via `getPaginate`.\n * Returns `false` for all methods other than `find` or when pagination is disabled.\n *\n * @example\n * ```ts\n * import { iff, isPaginated } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * after: { find: [iff(isPaginated, addTotalCountHeader())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-paginated.html\n */\nexport const isPaginated = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n if (context.params.paginate === false || context.method !== 'find') {\n return false\n }\n\n const paginate = getPaginate(context)\n\n return !!paginate\n}\n","import { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { TransportName } from '../../types.js'\n\n/**\n * Returns a predicate that checks the transport provider of the service call.\n * Matches against `'rest'`, `'socketio'`, `'external'` (any external provider),\n * or `'server'` (internal call without a provider).\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isProvider('external'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-provider.html\n */\nexport function isProvider<H extends HookContext = HookContext>(\n ...providers: TransportName[]\n) {\n if (!providers.length) {\n throw new MethodNotAllowed('Calling isProvider predicate incorrectly.')\n }\n\n return (context: H): boolean => {\n const hookProvider = context.params.provider\n\n return providers.some(\n (provider) =>\n provider === hookProvider ||\n (provider === 'server' && !hookProvider) ||\n (provider === 'external' && !!hookProvider),\n )\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport type { PredicateFn } from '../../types.js'\n\n/**\n * Negates a sync or async predicate function, inverting its boolean result.\n * Useful for composing conditions like \"not external\" or \"not multi\".\n *\n * @example\n * ```ts\n * import { iff, not, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(not(isProvider('server')), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/not.html\n */\nexport const not =\n <H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n ): PredicateFn<H> =>\n (context: H) => {\n const result = predicate(context)\n\n if (!isPromise(result)) {\n return !result\n }\n\n return result.then((result1) => !result1)\n }\n","import { GeneralError } from '@feathersjs/errors'\n\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { SkipHookName } from '../../utils/index.js'\n\n/**\n * Returns a predicate that checks `params.skipHooks` to determine if a hook should be skipped.\n * Matches by hook name, hook type (e.g. `'before'`), prefixed name (e.g. `'before:myHook'`),\n * or `'all'` to skip everything. Designed to be used with `skippable` and `addSkip`.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(actualHook(), shouldSkip('myHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/should-skip.html\n */\nexport const shouldSkip = <H extends HookContext = HookContext>(\n hookName: SkipHookName,\n) => {\n return (context: H): boolean => {\n if (!context.params?.skipHooks) {\n return false\n }\n\n const { skipHooks } = context.params\n if (!Array.isArray(skipHooks)) {\n throw new GeneralError(\n 'The `skipHooks` param must be an Array of Strings',\n )\n }\n const { type } = context\n if (skipHooks.includes(hookName)) {\n return true\n } else if (skipHooks.includes('all')) {\n return true\n } else if (skipHooks.includes(type)) {\n return true\n } else if (skipHooks.includes(`${type}:${hookName}`)) {\n return true\n }\n\n return false\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` when **any** of the given predicates is `true` (logical OR).\n * Supports both sync and async predicates. Short-circuits on the first `true` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, or, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(or(isProvider('rest'), isProvider('socketio')), rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/or.html\n */\nexport const or = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // The identity element of logical OR is `false` (an empty OR is false).\n if (!filtered.length) {\n return false\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n\n if (isPromise(result)) {\n promises.push(result)\n } else if (result) {\n // any truthy sync result short-circuits to true\n return true\n }\n }\n\n if (!promises.length) {\n return false\n }\n\n return Promise.all(promises).then((results) =>\n results.some((result) => !!result),\n )\n }\n}\n\n// Alias for 'some'\nexport const some = or\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport { combine } from '../../utils/combine/combine.util.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Executes one array of hooks when the predicate is truthy, or another array when it is falsy.\n * The predicate can be a boolean or a sync/async function.\n * Unlike `iff`, both branches are provided upfront without chaining.\n *\n * @example\n * ```ts\n * import { iffElse, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iffElse(isProvider('external'), [hook1()], [hook2()])]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff-else.html\n */\nexport function iffElse<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n trueHook: HookFunction<H> | HookFunction<H>[] | undefined,\n falseHook?: HookFunction<H> | HookFunction<H>[] | undefined,\n) {\n // fnArgs is [context] for service & permission hooks, [data, connection, context] for event filters\n return function (this: any, ctx: H, next?: NextFunction) {\n const trueHooks = Array.isArray(trueHook)\n ? trueHook\n : typeof trueHook === 'function'\n ? [trueHook]\n : undefined\n\n const falseHooks = Array.isArray(falseHook)\n ? falseHook\n : typeof falseHook === 'function'\n ? [falseHook]\n : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const check =\n typeof predicate === 'function'\n ? predicate.apply(that, [ctx])\n : !!predicate\n\n if (!isPromise(check)) {\n return callHooks.call(\n that,\n ctx,\n (check ? trueHooks : falseHooks) as any,\n next,\n )\n }\n\n return check.then((check1: any) => {\n const hooks = check1 ? trueHooks : falseHooks\n return callHooks.call(that, ctx, hooks as any, next)\n })\n }\n}\n\nfunction callHooks<H extends HookContext = HookContext>(\n this: any,\n ctx: H,\n serviceHooks: HookFunction<H>[],\n next?: NextFunction,\n) {\n if (!serviceHooks) {\n if (next) return next()\n return ctx\n }\n\n const result = combine(...serviceHooks).call(this, ctx)\n\n if (!next) return result\n\n return Promise.resolve(result).then(() => next())\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\nexport interface IffHook<\n H extends HookContext = HookContext,\n> extends HookFunction<H> {\n else(...hooks: HookFunction<H>[]): HookFunction<H>\n}\n\n/**\n * Conditionally executes a series of hooks when the predicate is truthy.\n * The predicate can be a boolean value or a sync/async function.\n * Supports an `.else(...)` chain for the falsy branch. Also exported as `when`.\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iff(isProvider('external'), authenticate('jwt'))]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff.html\n */\nexport function iff<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n ...hooks: HookFunction<H>[]\n): IffHook<H> {\n if (hooks.length && Array.isArray(hooks[0])) {\n hooks = hooks[0]\n }\n\n const iffWithoutElse = function (context: H, next?: NextFunction) {\n return iffElse(predicate, hooks.slice())(context, next)\n }\n\n iffWithoutElse.else =\n (...falseHooks: any[]) =>\n (context: H, next?: NextFunction) =>\n iffElse(predicate, hooks.slice(), falseHooks.slice())(context, next)\n\n return iffWithoutElse as IffHook<H>\n}\n\nexport { iff as when }\n","import type { HookContext } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { PredicateFn, HookFunction } from '../../types.js'\n\n/**\n * Executes a series of hooks when the predicate is falsy --- the inverse of `iff`.\n * The predicate can be a boolean or a sync/async function.\n * Useful for applying hooks to all contexts except those matching a condition.\n *\n * @example\n * ```ts\n * import { unless, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [unless(isProvider('server'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/unless.html\n */\nexport function unless<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn,\n ...hooks: HookFunction<H>[]\n) {\n return iffElse(predicate, undefined, [...hooks])\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Wraps a hook so it can be conditionally skipped based on a predicate.\n * When the predicate returns `true`, the wrapped hook is skipped entirely.\n * Commonly used with `shouldSkip` and `addSkip` for runtime hook control.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(someHook(), shouldSkip('someHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/skippable.html\n */\nexport const skippable = <H extends HookContext = HookContext>(\n innerHook: HookFunction<H>,\n predicate: PredicateFn<H>,\n) => {\n function hook(context: H): H | void | Promise<H | void>\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): H | void | Promise<H | void> {\n const skip = predicate(context)\n\n const skipOrRun = (shouldSkip: boolean): H | void | Promise<H | void> => {\n if (shouldSkip) {\n if (next) return next()\n return\n }\n if (next) return innerHook(context, next) as Promise<void>\n // before/after mode: return the inner hook's result so an async hook is\n // awaited and a returned/modified context is propagated to the pipeline.\n return innerHook(context)\n }\n\n if (!skip || typeof skip === 'boolean') {\n return skipOrRun(skip)\n }\n\n return skip.then(skipOrRun) as Promise<void>\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { BadRequest } from '@feathersjs/errors'\nimport type { FeathersError } from '@feathersjs/errors'\n\nexport type ThrowIfOptions = {\n /**\n * Customize the error that is thrown if the predicate returns true.\n *\n * If not provided, throws a `BadRequest` error with 'Invalid operation'.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Throws a `BadRequest` error when the given predicate function returns `true`.\n * The predicate receives the hook context and can be async.\n * Useful for validating conditions before proceeding with a request.\n *\n * @example\n * ```ts\n * import { throwIf } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { remove: [throwIf((context) => context.id === context.params.user?.id)] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if.html\n */\nexport const throwIf = <H extends HookContext = HookContext>(\n predicate: PredicateFn,\n options?: ThrowIfOptions,\n) => {\n return async (context: H, next?: NextFunction): Promise<void> => {\n const result = await predicate(context)\n\n if (result) {\n throw options?.error\n ? options.error(context)\n : new BadRequest('Invalid operation')\n }\n\n if (next) {\n await next()\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"predicates-puYa4nkf.mjs","names":[],"sources":["../src/utils/combine/combine.util.ts","../src/predicates/and/and.predicate.ts","../src/predicates/is-context/is-context.predicate.ts","../src/predicates/is-multi/is-multi.predicate.ts","../src/utils/get-paginate/get-paginate.util.ts","../src/predicates/is-paginated/is-paginated.predicate.ts","../src/predicates/is-provider/is-provider.predicate.ts","../src/predicates/not/not.predicate.ts","../src/predicates/should-skip/should-skip.predicate.ts","../src/predicates/or/or.predicate.ts","../src/hooks/iff-else/iff-else.hook.ts","../src/hooks/iff/iff.hook.ts","../src/hooks/unless/unless.hook.ts","../src/hooks/skippable/skippable.hook.ts","../src/hooks/throw-if/throw-if.hook.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { HookFunction } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Sequentially executes multiple hooks, passing the updated context from one to the next.\n * Returns a single hook function that runs the entire chain. If any hook throws,\n * the error is annotated with the current hook context.\n *\n * @example\n * ```ts\n * import { combine } from 'feathers-utils/hooks'\n *\n * const combinedHook = combine(hookA(), hookB(), hookC())\n * app.service('users').hooks({ before: { create: [combinedHook] } })\n * ```\n *\n * @see https://utils.feathersjs.com/utils/combine.html\n */\nexport function combine<H extends HookContext = HookContext>(\n ...serviceHooks: HookFunction<H>[]\n) {\n const isContext = function (ctx: H) {\n return typeof ctx?.method === 'string' && typeof ctx?.type === 'string'\n }\n\n return async function (context: H) {\n let ctx = context\n\n const updateCurrentHook = (current: void | H) => {\n // Either use the returned hook object or the current\n // hook object from the chain if the hook returned undefined\n if (current) {\n if (!isContext(current)) {\n throw new Error(\n `${ctx.type} hook for '${ctx.method}' method returned invalid hook object`,\n )\n }\n\n ctx = current\n }\n\n return ctx\n }\n\n // Run the hooks sequentially, only awaiting when a hook is actually async.\n // Avoids a microtask hop per hook and a per-hook `bind` allocation.\n try {\n for (const fn of serviceHooks) {\n // @ts-expect-error `this` is the bound service-hook context\n const currentCtx = fn.call(this, ctx)\n updateCurrentHook(isPromise(currentCtx) ? await currentCtx : currentCtx)\n }\n return ctx\n } catch (error: any) {\n // Add the hook information to any errors\n error.hook = ctx\n throw error\n }\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` only when **all** given predicates are `true` (logical AND).\n * Supports both sync and async predicates. Short-circuits on the first `false` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, and, isProvider, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(and(isProvider('external'), isMulti), checkMulti())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/and.html\n */\nexport const and = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // The identity element of logical AND is `true` (an empty AND is true).\n if (!filtered.length) {\n return true\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n if (isPromise(result)) {\n promises.push(result)\n } else if (!result) {\n // any falsy sync result short-circuits to false\n return false\n }\n }\n\n if (!promises.length) {\n return true\n }\n\n return Promise.all(promises).then((results) =>\n results.every((result) => !!result),\n )\n }\n}\n\n// Alias for 'every'\nexport const every = and\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { MaybeArray } from '../../internal.utils.js'\nimport { toArray } from '../../internal.utils.js'\n\nexport type IsContextOptions<H extends HookContext = HookContext> = {\n path?: MaybeArray<H['path']>\n type?: MaybeArray<H['type']>\n method?: MaybeArray<H['method']>\n}\n\n/**\n * Returns a predicate that checks whether the hook context matches the given criteria.\n * You can filter by `path` (service name), `type` (before/after/around/error),\n * and/or `method` (find/get/create/update/patch/remove).\n *\n * @example\n * ```ts\n * import { iff, isContext } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isContext({ method: 'create', type: 'before' }), validateHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-context.html\n */\nexport const isContext = <H extends HookContext = HookContext>(\n options: IsContextOptions<H>,\n) => {\n const path = options.path != null ? toArray(options.path) : undefined\n const type = options.type != null ? toArray(options.type) : undefined\n const method = options.method != null ? toArray(options.method) : undefined\n\n return (context: any): boolean => {\n if (path && !path.some((x) => context.path === x)) {\n return false\n }\n\n if (type && !type.some((x) => context.type === x)) {\n return false\n }\n\n if (method && !method.some((x) => context.method === x)) {\n return false\n }\n\n return true\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\n\n/**\n * Checks if the current hook context represents a multi operation.\n * Returns `true` for `find`, for `create` with array data, and for `patch`/`remove`\n * with `id === null`. Returns `false` for `get` and `update`.\n *\n * @example\n * ```ts\n * import { iff, isMulti } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isMulti, rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-multi.html\n */\nexport const isMulti = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n const { method } = context\n if (method === 'find') {\n return true\n } else if (method === 'patch' || method === 'remove') {\n return context.id == null\n } else if (method === 'create') {\n return Array.isArray(context.data)\n } else if (method === 'get' || method === 'update') {\n return false\n }\n\n return false\n}\n","import type { PaginationOptions } from '@feathersjs/adapter-commons'\nimport type { HookContext } from '@feathersjs/feathers'\nimport { hasOwnProperty } from '../../internal.utils.js'\n\n/**\n * Resolves the active pagination options for the current hook context.\n * Checks (in order): `context.params.paginate`, `service.options.paginate`,\n * and `context.params.adapter.paginate`. Returns `undefined` if pagination is disabled.\n *\n * @example\n * ```ts\n * import { getPaginate } from 'feathers-utils/utils'\n *\n * const paginate = getPaginate(context)\n * if (paginate) {\n * console.log('Max items:', paginate.max)\n * }\n * ```\n *\n * @see https://utils.feathersjs.com/utils/get-paginate.html\n */\nexport const getPaginate = <H extends HookContext = HookContext>(\n context: H,\n): PaginationOptions | undefined => {\n if (hasOwnProperty(context.params, 'paginate')) {\n // covers `paginate: false` too (`false || undefined` -> undefined)\n return (context.params.paginate as PaginationOptions) || undefined\n }\n\n let options = context.service?.options || {}\n\n options = {\n ...options,\n ...context.params.adapter,\n }\n\n return options.paginate || undefined\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { getPaginate } from '../../utils/get-paginate/get-paginate.util.js'\n\n/**\n * Checks if the current `find` operation is paginated by inspecting\n * `params.paginate` and the service's pagination options via `getPaginate`.\n * Returns `false` for all methods other than `find` or when pagination is disabled.\n *\n * @example\n * ```ts\n * import { iff, isPaginated } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * after: { find: [iff(isPaginated, addTotalCountHeader())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-paginated.html\n */\nexport const isPaginated = <H extends HookContext = HookContext>(\n context: H,\n): boolean => {\n if (context.params.paginate === false || context.method !== 'find') {\n return false\n }\n\n const paginate = getPaginate(context)\n\n return !!paginate\n}\n","import { MethodNotAllowed } from '@feathersjs/errors'\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { TransportName } from '../../types.js'\n\n/**\n * Returns a predicate that checks the transport provider of the service call.\n * Matches against `'rest'`, `'socketio'`, `'external'` (any external provider),\n * or `'server'` (internal call without a provider).\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(isProvider('external'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/is-provider.html\n */\nexport function isProvider<H extends HookContext = HookContext>(\n ...providers: TransportName[]\n) {\n if (!providers.length) {\n throw new MethodNotAllowed('Calling isProvider predicate incorrectly.')\n }\n\n return (context: H): boolean => {\n const hookProvider = context.params.provider\n\n return providers.some(\n (provider) =>\n provider === hookProvider ||\n (provider === 'server' && !hookProvider) ||\n (provider === 'external' && !!hookProvider),\n )\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport type { PredicateFn } from '../../types.js'\n\n/**\n * Negates a sync or async predicate function, inverting its boolean result.\n * Useful for composing conditions like \"not external\" or \"not multi\".\n *\n * @example\n * ```ts\n * import { iff, not, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(not(isProvider('server')), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/not.html\n */\nexport const not =\n <H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n ): PredicateFn<H> =>\n (context: H) => {\n const result = predicate(context)\n\n if (!isPromise(result)) {\n return !result\n }\n\n return result.then((result1) => !result1)\n }\n","import { GeneralError } from '@feathersjs/errors'\n\nimport type { HookContext } from '@feathersjs/feathers'\nimport type { SkipHookName } from '../../utils/index.js'\n\n/**\n * Returns a predicate that checks `params.skipHooks` to determine if a hook should be skipped.\n * Matches by hook name, hook type (e.g. `'before'`), prefixed name (e.g. `'before:myHook'`),\n * or `'all'` to skip everything. Designed to be used with `skippable` and `addSkip`.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(actualHook(), shouldSkip('myHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/should-skip.html\n */\nexport const shouldSkip = <H extends HookContext = HookContext>(\n hookName: SkipHookName,\n) => {\n return (context: H): boolean => {\n if (!context.params?.skipHooks) {\n return false\n }\n\n const { skipHooks } = context.params\n if (!Array.isArray(skipHooks)) {\n throw new GeneralError(\n 'The `skipHooks` param must be an Array of Strings',\n )\n }\n const { type } = context\n if (skipHooks.includes(hookName)) {\n return true\n } else if (skipHooks.includes('all')) {\n return true\n } else if (skipHooks.includes(type)) {\n return true\n } else if (skipHooks.includes(`${type}:${hookName}`)) {\n return true\n }\n\n return false\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { isPromise } from '../../common/index.js'\n\n/**\n * Returns a predicate that is `true` when **any** of the given predicates is `true` (logical OR).\n * Supports both sync and async predicates. Short-circuits on the first `true` result.\n * Undefined predicates in the list are skipped.\n *\n * @example\n * ```ts\n * import { iff, or, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [iff(or(isProvider('rest'), isProvider('socketio')), rateLimitHook())] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/predicates/or.html\n */\nexport const or = <H extends HookContext = HookContext>(\n ...predicates: (PredicateFn<H> | undefined)[]\n): PredicateFn<H> => {\n const filtered = predicates.filter(\n (p): p is PredicateFn<H> => p !== undefined,\n )\n\n return (context: H): boolean | Promise<boolean> => {\n // The identity element of logical OR is `false` (an empty OR is false).\n if (!filtered.length) {\n return false\n }\n\n const promises: Promise<boolean>[] = []\n\n for (const predicate of filtered) {\n const result = predicate(context)\n\n if (isPromise(result)) {\n promises.push(result)\n } else if (result) {\n // any truthy sync result short-circuits to true\n return true\n }\n }\n\n if (!promises.length) {\n return false\n }\n\n return Promise.all(promises).then((results) =>\n results.some((result) => !!result),\n )\n }\n}\n\n// Alias for 'some'\nexport const some = or\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { isPromise } from '../../common/index.js'\nimport { combine } from '../../utils/combine/combine.util.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Executes one array of hooks when the predicate is truthy, or another array when it is falsy.\n * The predicate can be a boolean or a sync/async function.\n * Unlike `iff`, both branches are provided upfront without chaining.\n *\n * @example\n * ```ts\n * import { iffElse, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iffElse(isProvider('external'), [hook1()], [hook2()])]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff-else.html\n */\nexport function iffElse<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n trueHook: HookFunction<H> | HookFunction<H>[] | undefined,\n falseHook?: HookFunction<H> | HookFunction<H>[] | undefined,\n) {\n // fnArgs is [context] for service & permission hooks, [data, connection, context] for event filters\n return function (this: any, ctx: H, next?: NextFunction) {\n const trueHooks = Array.isArray(trueHook)\n ? trueHook\n : typeof trueHook === 'function'\n ? [trueHook]\n : undefined\n\n const falseHooks = Array.isArray(falseHook)\n ? falseHook\n : typeof falseHook === 'function'\n ? [falseHook]\n : undefined\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const check =\n typeof predicate === 'function'\n ? predicate.apply(that, [ctx])\n : !!predicate\n\n if (!isPromise(check)) {\n return callHooks.call(\n that,\n ctx,\n (check ? trueHooks : falseHooks) as any,\n next,\n )\n }\n\n return check.then((check1: any) => {\n const hooks = check1 ? trueHooks : falseHooks\n return callHooks.call(that, ctx, hooks as any, next)\n })\n }\n}\n\nfunction callHooks<H extends HookContext = HookContext>(\n this: any,\n ctx: H,\n serviceHooks: HookFunction<H>[],\n next?: NextFunction,\n) {\n if (!serviceHooks) {\n if (next) return next()\n return ctx\n }\n\n const result = combine(...serviceHooks).call(this, ctx)\n\n if (!next) return result\n\n return Promise.resolve(result).then(() => next())\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\nexport interface IffHook<\n H extends HookContext = HookContext,\n> extends HookFunction<H> {\n else(...hooks: HookFunction<H>[]): HookFunction<H>\n}\n\n/**\n * Conditionally executes a series of hooks when the predicate is truthy.\n * The predicate can be a boolean value or a sync/async function.\n * Supports an `.else(...)` chain for the falsy branch. Also exported as `when`.\n *\n * @example\n * ```ts\n * import { iff, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: {\n * find: [iff(isProvider('external'), authenticate('jwt'))]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/iff.html\n */\nexport function iff<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn<H>,\n ...hooks: HookFunction<H>[]\n): IffHook<H> {\n if (hooks.length && Array.isArray(hooks[0])) {\n hooks = hooks[0]\n }\n\n const iffWithoutElse = function (context: H, next?: NextFunction) {\n return iffElse(predicate, hooks.slice())(context, next)\n }\n\n iffWithoutElse.else =\n (...falseHooks: any[]) =>\n (context: H, next?: NextFunction) =>\n iffElse(predicate, hooks.slice(), falseHooks.slice())(context, next)\n\n return iffWithoutElse as IffHook<H>\n}\n\nexport { iff as when }\n","import type { HookContext } from '@feathersjs/feathers'\nimport { iffElse } from '../iff-else/iff-else.hook.js'\nimport type { PredicateFn, HookFunction } from '../../types.js'\n\n/**\n * Executes a series of hooks when the predicate is falsy --- the inverse of `iff`.\n * The predicate can be a boolean or a sync/async function.\n * Useful for applying hooks to all contexts except those matching a condition.\n *\n * @example\n * ```ts\n * import { unless, isProvider } from 'feathers-utils/predicates'\n *\n * app.service('users').hooks({\n * before: { all: [unless(isProvider('server'), authenticate('jwt'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/unless.html\n */\nexport function unless<H extends HookContext = HookContext>(\n predicate: boolean | PredicateFn,\n ...hooks: HookFunction<H>[]\n) {\n return iffElse(predicate, undefined, [...hooks])\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { HookFunction, PredicateFn } from '../../types.js'\n\n/**\n * Wraps a hook so it can be conditionally skipped based on a predicate.\n * When the predicate returns `true`, the wrapped hook is skipped entirely.\n * Commonly used with `shouldSkip` and `addSkip` for runtime hook control.\n *\n * @example\n * ```ts\n * import { skippable, shouldSkip } from 'feathers-utils/predicates'\n *\n * const myHook = skippable(someHook(), shouldSkip('someHook'))\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/skippable.html\n */\nexport const skippable = <H extends HookContext = HookContext>(\n innerHook: HookFunction<H>,\n predicate: PredicateFn<H>,\n) => {\n function hook(context: H): H | void | Promise<H | void>\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): H | void | Promise<H | void> {\n const skip = predicate(context)\n\n const skipOrRun = (shouldSkip: boolean): H | void | Promise<H | void> => {\n if (shouldSkip) {\n if (next) return next()\n return\n }\n if (next) return innerHook(context, next) as Promise<void>\n // before/after mode: return the inner hook's result so an async hook is\n // awaited and a returned/modified context is propagated to the pipeline.\n return innerHook(context)\n }\n\n if (!skip || typeof skip === 'boolean') {\n return skipOrRun(skip)\n }\n\n return skip.then(skipOrRun) as Promise<void>\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport { BadRequest } from '@feathersjs/errors'\nimport type { FeathersError } from '@feathersjs/errors'\n\nexport type ThrowIfOptions = {\n /**\n * Customize the error that is thrown if the predicate returns true.\n *\n * If not provided, throws a `BadRequest` error with 'Invalid operation'.\n */\n error?: (context: HookContext) => FeathersError\n}\n\n/**\n * Throws a `BadRequest` error when the given predicate function returns `true`.\n * The predicate receives the hook context and can be async.\n * Useful for validating conditions before proceeding with a request.\n *\n * @example\n * ```ts\n * import { throwIf } from 'feathers-utils/hooks'\n *\n * app.service('users').hooks({\n * before: { remove: [throwIf((context) => context.id === context.params.user?.id)] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/throw-if.html\n */\nexport const throwIf = <H extends HookContext = HookContext>(\n predicate: PredicateFn,\n options?: ThrowIfOptions,\n) => {\n return async (context: H, next?: NextFunction): Promise<void> => {\n const result = await predicate(context)\n\n if (result) {\n throw options?.error\n ? options.error(context)\n : new BadRequest('Invalid operation')\n }\n\n if (next) {\n await next()\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,SAAgB,QACd,GAAG,cACH;CACA,MAAM,YAAY,SAAU,KAAQ;EAClC,OAAO,OAAO,KAAK,WAAW,YAAY,OAAO,KAAK,SAAS;CACjE;CAEA,OAAO,eAAgB,SAAY;EACjC,IAAI,MAAM;EAEV,MAAM,qBAAqB,YAAsB;GAG/C,IAAI,SAAS;IACX,IAAI,CAAC,UAAU,OAAO,GACpB,MAAM,IAAI,MACR,GAAG,IAAI,KAAK,aAAa,IAAI,OAAO,sCACtC;IAGF,MAAM;GACR;GAEA,OAAO;EACT;EAIA,IAAI;GACF,KAAK,MAAM,MAAM,cAAc;IAE7B,MAAM,aAAa,GAAG,KAAK,MAAM,GAAG;IACpC,kBAAkB,UAAU,UAAU,IAAI,MAAM,aAAa,UAAU;GACzE;GACA,OAAO;EACT,SAAS,OAAY;GAEnB,MAAM,OAAO;GACb,MAAM;EACR;CACF;AACF;;;;;;;;;;;;;;;;;;;ACxCA,MAAa,OACX,GAAG,eACgB;CACnB,MAAM,WAAW,WAAW,QACzB,MAA2B,MAAM,KAAA,CACpC;CAEA,QAAQ,YAA2C;EAEjD,IAAI,CAAC,SAAS,QACZ,OAAO;EAGT,MAAM,WAA+B,CAAC;EAEtC,KAAK,MAAM,aAAa,UAAU;GAChC,MAAM,SAAS,UAAU,OAAO;GAChC,IAAI,UAAU,MAAM,GAClB,SAAS,KAAK,MAAM;QACf,IAAI,CAAC,QAEV,OAAO;EAEX;EAEA,IAAI,CAAC,SAAS,QACZ,OAAO;EAGT,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,MAAM,YACjC,QAAQ,OAAO,WAAW,CAAC,CAAC,MAAM,CACpC;CACF;AACF;AAGA,MAAa,QAAQ;;;;;;;;;;;;;;;;;;;AC9BrB,MAAa,aACX,YACG;CACH,MAAM,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,IAAI,IAAI,KAAA;CAC5D,MAAM,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,IAAI,IAAI,KAAA;CAC5D,MAAM,SAAS,QAAQ,UAAU,OAAO,QAAQ,QAAQ,MAAM,IAAI,KAAA;CAElE,QAAQ,YAA0B;EAChC,IAAI,QAAQ,CAAC,KAAK,MAAM,MAAM,QAAQ,SAAS,CAAC,GAC9C,OAAO;EAGT,IAAI,QAAQ,CAAC,KAAK,MAAM,MAAM,QAAQ,SAAS,CAAC,GAC9C,OAAO;EAGT,IAAI,UAAU,CAAC,OAAO,MAAM,MAAM,QAAQ,WAAW,CAAC,GACpD,OAAO;EAGT,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;AC9BA,MAAa,WACX,YACY;CACZ,MAAM,EAAE,WAAW;CACnB,IAAI,WAAW,QACb,OAAO;MACF,IAAI,WAAW,WAAW,WAAW,UAC1C,OAAO,QAAQ,MAAM;MAChB,IAAI,WAAW,UACpB,OAAO,MAAM,QAAQ,QAAQ,IAAI;MAC5B,IAAI,WAAW,SAAS,WAAW,UACxC,OAAO;CAGT,OAAO;AACT;;;;;;;;;;;;;;;;;;;;ACZA,MAAa,eACX,YACkC;CAClC,IAAI,eAAe,QAAQ,QAAQ,UAAU,GAE3C,OAAQ,QAAQ,OAAO,YAAkC,KAAA;CAG3D,IAAI,UAAU,QAAQ,SAAS,WAAW,CAAC;CAE3C,UAAU;EACR,GAAG;EACH,GAAG,QAAQ,OAAO;CACpB;CAEA,OAAO,QAAQ,YAAY,KAAA;AAC7B;;;;;;;;;;;;;;;;;;;AClBA,MAAa,eACX,YACY;CACZ,IAAI,QAAQ,OAAO,aAAa,SAAS,QAAQ,WAAW,QAC1D,OAAO;CAKT,OAAO,CAAC,CAFS,YAAY,OAEb;AAClB;;;;;;;;;;;;;;;;;;;ACTA,SAAgB,WACd,GAAG,WACH;CACA,IAAI,CAAC,UAAU,QACb,MAAM,IAAI,iBAAiB,2CAA2C;CAGxE,QAAQ,YAAwB;EAC9B,MAAM,eAAe,QAAQ,OAAO;EAEpC,OAAO,UAAU,MACd,aACC,aAAa,gBACZ,aAAa,YAAY,CAAC,gBAC1B,aAAa,cAAc,CAAC,CAAC,YAClC;CACF;AACF;;;;;;;;;;;;;;;;;;AClBA,MAAa,OAET,eAED,YAAe;CACd,MAAM,SAAS,UAAU,OAAO;CAEhC,IAAI,CAAC,UAAU,MAAM,GACnB,OAAO,CAAC;CAGV,OAAO,OAAO,MAAM,YAAY,CAAC,OAAO;AAC1C;;;;;;;;;;;;;;;;;ACZF,MAAa,cACX,aACG;CACH,QAAQ,YAAwB;EAC9B,IAAI,CAAC,QAAQ,QAAQ,WACnB,OAAO;EAGT,MAAM,EAAE,cAAc,QAAQ;EAC9B,IAAI,CAAC,MAAM,QAAQ,SAAS,GAC1B,MAAM,IAAI,aACR,mDACF;EAEF,MAAM,EAAE,SAAS;EACjB,IAAI,UAAU,SAAS,QAAQ,GAC7B,OAAO;OACF,IAAI,UAAU,SAAS,KAAK,GACjC,OAAO;OACF,IAAI,UAAU,SAAS,IAAI,GAChC,OAAO;OACF,IAAI,UAAU,SAAS,GAAG,KAAK,GAAG,UAAU,GACjD,OAAO;EAGT,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;AC1BA,MAAa,MACX,GAAG,eACgB;CACnB,MAAM,WAAW,WAAW,QACzB,MAA2B,MAAM,KAAA,CACpC;CAEA,QAAQ,YAA2C;EAEjD,IAAI,CAAC,SAAS,QACZ,OAAO;EAGT,MAAM,WAA+B,CAAC;EAEtC,KAAK,MAAM,aAAa,UAAU;GAChC,MAAM,SAAS,UAAU,OAAO;GAEhC,IAAI,UAAU,MAAM,GAClB,SAAS,KAAK,MAAM;QACf,IAAI,QAET,OAAO;EAEX;EAEA,IAAI,CAAC,SAAS,QACZ,OAAO;EAGT,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,MAAM,YACjC,QAAQ,MAAM,WAAW,CAAC,CAAC,MAAM,CACnC;CACF;AACF;AAGA,MAAa,OAAO;;;;;;;;;;;;;;;;;;;;;AClCpB,SAAgB,QACd,WACA,UACA,WACA;CAEA,OAAO,SAAqB,KAAQ,MAAqB;EACvD,MAAM,YAAY,MAAM,QAAQ,QAAQ,IACpC,WACA,OAAO,aAAa,aAClB,CAAC,QAAQ,IACT,KAAA;EAEN,MAAM,aAAa,MAAM,QAAQ,SAAS,IACtC,YACA,OAAO,cAAc,aACnB,CAAC,SAAS,IACV,KAAA;EAGN,MAAM,OAAO;EACb,MAAM,QACJ,OAAO,cAAc,aACjB,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC,IAC3B,CAAC,CAAC;EAER,IAAI,CAAC,UAAU,KAAK,GAClB,OAAO,UAAU,KACf,MACA,KACC,QAAQ,YAAY,YACrB,IACF;EAGF,OAAO,MAAM,MAAM,WAAgB;GACjC,MAAM,QAAQ,SAAS,YAAY;GACnC,OAAO,UAAU,KAAK,MAAM,KAAK,OAAc,IAAI;EACrD,CAAC;CACH;AACF;AAEA,SAAS,UAEP,KACA,cACA,MACA;CACA,IAAI,CAAC,cAAc;EACjB,IAAI,MAAM,OAAO,KAAK;EACtB,OAAO;CACT;CAEA,MAAM,SAAS,QAAQ,GAAG,YAAY,CAAC,CAAC,KAAK,MAAM,GAAG;CAEtD,IAAI,CAAC,MAAM,OAAO;CAElB,OAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,WAAW,KAAK,CAAC;AAClD;;;;;;;;;;;;;;;;;;;;;ACrDA,SAAgB,IACd,WACA,GAAG,OACS;CACZ,IAAI,MAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,GACxC,QAAQ,MAAM;CAGhB,MAAM,iBAAiB,SAAU,SAAY,MAAqB;EAChE,OAAO,QAAQ,WAAW,MAAM,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI;CACxD;CAEA,eAAe,QACZ,GAAG,gBACH,SAAY,SACX,QAAQ,WAAW,MAAM,MAAM,GAAG,WAAW,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI;CAEvE,OAAO;AACT;;;;;;;;;;;;;;;;;;;AC1BA,SAAgB,OACd,WACA,GAAG,OACH;CACA,OAAO,QAAQ,WAAW,KAAA,GAAW,CAAC,GAAG,KAAK,CAAC;AACjD;;;;;;;;;;;;;;;;;ACRA,MAAa,aACX,WACA,cACG;CAGH,SAAS,KAAK,SAAY,MAAmD;EAC3E,MAAM,OAAO,UAAU,OAAO;EAE9B,MAAM,aAAa,eAAsD;GACvE,IAAI,YAAY;IACd,IAAI,MAAM,OAAO,KAAK;IACtB;GACF;GACA,IAAI,MAAM,OAAO,UAAU,SAAS,IAAI;GAGxC,OAAO,UAAU,OAAO;EAC1B;EAEA,IAAI,CAAC,QAAQ,OAAO,SAAS,WAC3B,OAAO,UAAU,IAAI;EAGvB,OAAO,KAAK,KAAK,SAAS;CAC5B;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACdA,MAAa,WACX,WACA,YACG;CACH,OAAO,OAAO,SAAY,SAAuC;EAG/D,IAAI,MAFiB,UAAU,OAAO,GAGpC,MAAM,SAAS,QACX,QAAQ,MAAM,OAAO,IACrB,IAAI,WAAW,mBAAmB;EAGxC,IAAI,MACF,MAAM,KAAK;CAEf;AACF"}
|
package/dist/predicates.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { S as TransportName, g as PredicateFn } from "./hook-context-
|
|
2
|
-
import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-
|
|
3
|
-
import { A as isContext, N as SkipHookName, k as IsContextOptions } from "./index-
|
|
4
|
-
import * as _$_feathersjs_feathers0 from "@feathersjs/feathers";
|
|
1
|
+
import { S as TransportName, g as PredicateFn } from "./hook-context-BsxU1vfN.mjs";
|
|
2
|
+
import { a as IffHook, i as skippable, n as ThrowIfOptions, o as iff, r as throwIf, s as iffElse, t as unless } from "./unless.hook-CVw1wX_x.mjs";
|
|
3
|
+
import { A as isContext, N as SkipHookName, k as IsContextOptions } from "./index-DXXeX7lF.mjs";
|
|
5
4
|
import { HookContext } from "@feathersjs/feathers";
|
|
6
5
|
|
|
7
6
|
//#region src/predicates/and/and.predicate.d.ts
|
|
@@ -22,7 +21,7 @@ import { HookContext } from "@feathersjs/feathers";
|
|
|
22
21
|
* @see https://utils.feathersjs.com/predicates/and.html
|
|
23
22
|
*/
|
|
24
23
|
declare const and: <H extends HookContext = HookContext>(...predicates: (PredicateFn<H> | undefined)[]) => PredicateFn<H>;
|
|
25
|
-
declare const every: <H extends HookContext = HookContext<
|
|
24
|
+
declare const every: <H extends HookContext = HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...predicates: (PredicateFn<H> | undefined)[]) => PredicateFn<H>;
|
|
26
25
|
//#endregion
|
|
27
26
|
//#region src/predicates/is-multi/is-multi.predicate.d.ts
|
|
28
27
|
/**
|
|
@@ -134,7 +133,7 @@ declare const shouldSkip: <H extends HookContext = HookContext>(hookName: SkipHo
|
|
|
134
133
|
* @see https://utils.feathersjs.com/predicates/or.html
|
|
135
134
|
*/
|
|
136
135
|
declare const or: <H extends HookContext = HookContext>(...predicates: (PredicateFn<H> | undefined)[]) => PredicateFn<H>;
|
|
137
|
-
declare const some: <H extends HookContext = HookContext<
|
|
136
|
+
declare const some: <H extends HookContext = HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...predicates: (PredicateFn<H> | undefined)[]) => PredicateFn<H>;
|
|
138
137
|
//#endregion
|
|
139
138
|
export { IffHook, IsContextOptions, ThrowIfOptions, and, every, iff, iff as when, iffElse, isContext, isMulti, isPaginated, isProvider, not, or, shouldSkip, skippable, some, throwIf, unless };
|
|
140
139
|
//# sourceMappingURL=predicates.d.mts.map
|
package/dist/predicates.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as iffElse, c as shouldSkip, d as isPaginated, g as every, h as and, i as iff, l as not, m as isContext, n as skippable, o as or, p as isMulti, r as unless, s as some, t as throwIf, u as isProvider } from "./predicates-
|
|
1
|
+
import { a as iffElse, c as shouldSkip, d as isPaginated, g as every, h as and, i as iff, l as not, m as isContext, n as skippable, o as or, p as isMulti, r as unless, s as some, t as throwIf, u as isProvider } from "./predicates-puYa4nkf.mjs";
|
|
2
2
|
export { and, every, iff, iff as when, iffElse, isContext, isMulti, isPaginated, isProvider, not, or, shouldSkip, skippable, some, throwIf, unless };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as mutateData, t as mutateResult } from "./mutate-result.util-
|
|
1
|
+
import { r as mutateData, t as mutateResult } from "./mutate-result.util-Dqzepn1M.mjs";
|
|
2
2
|
import { BadRequest } from "@feathersjs/errors";
|
|
3
3
|
//#region src/resolvers/resolvers.internal.ts
|
|
4
4
|
const toError = (error) => typeof error.toJSON === "function" ? error.toJSON() : { message: error.message || error };
|
|
@@ -211,4 +211,4 @@ const resolve = (resolverProperties) => {
|
|
|
211
211
|
//#endregion
|
|
212
212
|
export { resolveData as i, resolveQuery as n, resolveResult as r, resolve as t };
|
|
213
213
|
|
|
214
|
-
//# sourceMappingURL=resolve-
|
|
214
|
+
//# sourceMappingURL=resolve-B9hRleHY.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-83Oiyb_b.mjs","names":["resolve","resolve","resolve","resolve"],"sources":["../src/resolvers/resolvers.internal.ts","../src/resolvers/resolve-data/resolve-data.ts","../src/resolvers/resolve-result/resolve-result.ts","../src/resolvers/resolve-query/resolve-query.ts","../src/resolvers/resolve/resolve.ts"],"sourcesContent":["import { BadRequest } from '@feathersjs/errors'\nimport type { Promisable } from '../internal.utils.js'\n\nexport interface ResolverPropertyOptions<T, V, C> {\n value: V | undefined\n data: T\n context: C\n properties: ResolverStatus<T, C>\n i: number\n}\n\nexport type ResolverProperty<T, V, C, R = V> = (\n options: ResolverPropertyOptions<T, V, C>,\n) => Promisable<R | undefined>\n\nexport type ResolverObject<T, C> = {\n [K in keyof T & string]?: ResolverProperty<T, T[K], C, T[K]>\n}\n\nexport interface ResolverStatus<T, C> {\n path: string[]\n stack: ResolverProperty<T, any, C>[]\n}\n\nexport interface ResolveOptions<T, D extends Record<string, any>, C> {\n resolvers: ResolverObject<T, C>\n data: D\n context: C\n status?: Partial<ResolverStatus<T, C>>\n propertyNames?: (keyof T)[]\n i?: number\n}\n\nconst toError = (error: any) =>\n typeof error.toJSON === 'function'\n ? error.toJSON()\n : { message: error.message || error }\n\nexport const resolve = <T, D extends Record<string, any>, C>(\n options: ResolveOptions<T, D, C>,\n): Promise<T> | T => {\n const {\n resolvers,\n data,\n context,\n status,\n propertyNames = Object.keys(resolvers) as any as (keyof T)[],\n i = 0,\n } = options\n\n if (!propertyNames.length) {\n return data as any as T\n }\n\n const propertyList = [\n ...new Set(Object.keys(data).concat(propertyNames as string[])),\n ]\n\n const result: any = {}\n const errors: any = {}\n let hasErrors = false\n const { path = [], stack = [] } = status || {}\n const promises: Promise<void>[] = []\n\n for (const name of propertyList) {\n const value = (data as any)[name]\n\n if (!(name in resolvers)) {\n if (value !== undefined) {\n result[name] = value\n }\n continue\n }\n\n const resolver = (resolvers as any)[name] as ResolverProperty<T, any, C>\n\n if (stack.includes(resolver)) {\n continue\n }\n\n const properties: ResolverStatus<T, C> = {\n ...status,\n path: [...path, name],\n stack: [...stack, resolver],\n }\n\n try {\n const resolved = resolver({\n value,\n data: data as any,\n context,\n properties,\n i,\n })\n\n if (resolved instanceof Promise) {\n promises.push(\n resolved\n .then((val) => {\n if (val !== undefined) {\n result[name] = val\n }\n })\n .catch((error: any) => {\n errors[name] = toError(error)\n hasErrors = true\n }),\n )\n } else if (resolved !== undefined) {\n result[name] = resolved\n }\n } catch (error: any) {\n errors[name] = toError(error)\n hasErrors = true\n }\n }\n\n const finalize = () => {\n if (hasErrors) {\n throw new BadRequest('Error resolving data', errors)\n }\n return result as T\n }\n\n if (promises.length) {\n return Promise.all(promises).then(finalize)\n }\n\n return finalize()\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolve } from '../resolvers.internal.js'\nimport { mutateData } from '../../utils/index.js'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.data` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveData, lowercase } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * create: [resolveData({ email: lowercase() })]\n * }\n * })\n * ```\n */\nexport const resolveData = <H extends HookContext = HookContext, D = Data<H>>(\n resolvers: ResolverObject<D, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof D)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const result = mutateData(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n\n if (result instanceof Promise) {\n return next ? result.then(() => next()).then(() => context) : result\n }\n\n if (next) return next().then(() => context)\n return result\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { resolve, type ResolverObject } from '../resolvers.internal.js'\nimport { mutateResult } from '../../utils/index.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.result` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs after `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveResult, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * after: {\n * all: [resolveResult({ password: omit() })]\n * }\n * })\n * ```\n */\nexport const resolveResult = <\n H extends HookContext = HookContext,\n R = Result<H>,\n>(\n resolvers: ResolverObject<R, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<void>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof R)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next()\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n function run(): Promisable<void> {\n const result = mutateResult(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n if (result instanceof Promise) return result.then(() => {})\n return\n }\n\n if (next) {\n return next().then(run)\n }\n\n return run()\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { type ResolverObject, resolve } from '../resolvers.internal.js'\nimport type { Promisable } from '../../internal.utils.js'\n\n/**\n * Resolves and transforms `context.params.query` using a map of resolver functions.\n * Each property in the resolver object receives the current query value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveQuery, defaults } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * find: [resolveQuery({ active: defaults(true) })]\n * }\n * })\n * ```\n */\nexport const resolveQuery = <H extends HookContext>(\n resolvers: ResolverObject<any, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof any)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const queryIngoing = context?.params?.query || {}\n const result = resolve({\n resolvers,\n data: queryIngoing,\n context,\n propertyNames,\n })\n\n function assign(query: any) {\n context.params = { ...context.params, query }\n if (next) return next().then(() => context)\n return context\n }\n\n if (result instanceof Promise) {\n return result.then(assign)\n }\n\n return assign(result)\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolveData } from '../resolve-data/resolve-data.js'\nimport { resolveQuery } from '../resolve-query/resolve-query.js'\nimport { resolveResult } from '../resolve-result/resolve-result.js'\nimport type {\n DataSingleHookContext,\n ResultSingleHookContext,\n} from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Combines `data`, `query`, and `result` resolvers into a single around hook.\n * Data and query resolvers run before `next()`, while the result resolver runs after.\n * At least one resolver must be provided.\n *\n * @example\n * ```ts\n * import { resolve, lowercase, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * around: {\n * all: [resolve({\n * data: { email: lowercase() },\n * result: { password: omit() },\n * })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/resolvers/resolve.html\n */\nexport const resolve = <\n H extends HookContext = HookContext,\n D = Data<H>,\n R = Result<H>,\n>(resolverProperties: {\n data?: ResolverObject<D, H>\n query?: ResolverObject<any, H>\n result?: ResolverObject<R, H>\n}) => {\n const dataResolver = resolverProperties.data\n ? resolveData(resolverProperties.data)\n : undefined\n const queryResolver = resolverProperties.query\n ? resolveQuery(resolverProperties.query)\n : undefined\n const resultResolver = resolverProperties.result\n ? resolveResult(resolverProperties.result)\n : undefined\n\n if (!dataResolver && !queryResolver && !resultResolver) {\n throw new Error(\n 'At least one resolver must be provided (data, query, or result)',\n )\n }\n\n return async (context: H, next?: NextFunction) => {\n if (queryResolver || dataResolver) {\n const promisesBefore: Promise<any>[] = []\n\n if (queryResolver) {\n promisesBefore.push(Promise.resolve(queryResolver(context)))\n }\n\n if (dataResolver) {\n promisesBefore.push(Promise.resolve(dataResolver(context)))\n }\n\n await Promise.all(promisesBefore)\n }\n\n if (next) {\n await next()\n }\n\n if (resultResolver) {\n await resultResolver(context)\n }\n\n return\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"resolve-B9hRleHY.mjs","names":["resolve","resolve","resolve","resolve"],"sources":["../src/resolvers/resolvers.internal.ts","../src/resolvers/resolve-data/resolve-data.ts","../src/resolvers/resolve-result/resolve-result.ts","../src/resolvers/resolve-query/resolve-query.ts","../src/resolvers/resolve/resolve.ts"],"sourcesContent":["import { BadRequest } from '@feathersjs/errors'\nimport type { Promisable } from '../internal.utils.js'\n\nexport interface ResolverPropertyOptions<T, V, C> {\n value: V | undefined\n data: T\n context: C\n properties: ResolverStatus<T, C>\n i: number\n}\n\nexport type ResolverProperty<T, V, C, R = V> = (\n options: ResolverPropertyOptions<T, V, C>,\n) => Promisable<R | undefined>\n\nexport type ResolverObject<T, C> = {\n [K in keyof T & string]?: ResolverProperty<T, T[K], C, T[K]>\n}\n\nexport interface ResolverStatus<T, C> {\n path: string[]\n stack: ResolverProperty<T, any, C>[]\n}\n\nexport interface ResolveOptions<T, D extends Record<string, any>, C> {\n resolvers: ResolverObject<T, C>\n data: D\n context: C\n status?: Partial<ResolverStatus<T, C>>\n propertyNames?: (keyof T)[]\n i?: number\n}\n\nconst toError = (error: any) =>\n typeof error.toJSON === 'function'\n ? error.toJSON()\n : { message: error.message || error }\n\nexport const resolve = <T, D extends Record<string, any>, C>(\n options: ResolveOptions<T, D, C>,\n): Promise<T> | T => {\n const {\n resolvers,\n data,\n context,\n status,\n propertyNames = Object.keys(resolvers) as any as (keyof T)[],\n i = 0,\n } = options\n\n if (!propertyNames.length) {\n return data as any as T\n }\n\n const propertyList = [\n ...new Set(Object.keys(data).concat(propertyNames as string[])),\n ]\n\n const result: any = {}\n const errors: any = {}\n let hasErrors = false\n const { path = [], stack = [] } = status || {}\n const promises: Promise<void>[] = []\n\n for (const name of propertyList) {\n const value = (data as any)[name]\n\n if (!(name in resolvers)) {\n if (value !== undefined) {\n result[name] = value\n }\n continue\n }\n\n const resolver = (resolvers as any)[name] as ResolverProperty<T, any, C>\n\n if (stack.includes(resolver)) {\n continue\n }\n\n const properties: ResolverStatus<T, C> = {\n ...status,\n path: [...path, name],\n stack: [...stack, resolver],\n }\n\n try {\n const resolved = resolver({\n value,\n data: data as any,\n context,\n properties,\n i,\n })\n\n if (resolved instanceof Promise) {\n promises.push(\n resolved\n .then((val) => {\n if (val !== undefined) {\n result[name] = val\n }\n })\n .catch((error: any) => {\n errors[name] = toError(error)\n hasErrors = true\n }),\n )\n } else if (resolved !== undefined) {\n result[name] = resolved\n }\n } catch (error: any) {\n errors[name] = toError(error)\n hasErrors = true\n }\n }\n\n const finalize = () => {\n if (hasErrors) {\n throw new BadRequest('Error resolving data', errors)\n }\n return result as T\n }\n\n if (promises.length) {\n return Promise.all(promises).then(finalize)\n }\n\n return finalize()\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolve } from '../resolvers.internal.js'\nimport { mutateData } from '../../utils/index.js'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.data` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveData, lowercase } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * create: [resolveData({ email: lowercase() })]\n * }\n * })\n * ```\n */\nexport const resolveData = <H extends HookContext = HookContext, D = Data<H>>(\n resolvers: ResolverObject<D, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof D)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const result = mutateData(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n\n if (result instanceof Promise) {\n return next ? result.then(() => next()).then(() => context) : result\n }\n\n if (next) return next().then(() => context)\n return result\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { resolve, type ResolverObject } from '../resolvers.internal.js'\nimport { mutateResult } from '../../utils/index.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback, Promisable } from '../../internal.utils.js'\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Resolves and transforms `context.result` using a map of resolver functions.\n * Each property in the resolver object receives the current value and can return\n * a transformed value. Runs after `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveResult, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * after: {\n * all: [resolveResult({ password: omit() })]\n * }\n * })\n * ```\n */\nexport const resolveResult = <\n H extends HookContext = HookContext,\n R = Result<H>,\n>(\n resolvers: ResolverObject<R, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<void>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof R)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next()\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n function run(): Promisable<void> {\n const result = mutateResult(context, (item, { i }) =>\n resolve({ resolvers, data: item, context, propertyNames, i }),\n )\n if (result instanceof Promise) return result.then(() => {})\n return\n }\n\n if (next) {\n return next().then(run)\n }\n\n return run()\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { type ResolverObject, resolve } from '../resolvers.internal.js'\nimport type { Promisable } from '../../internal.utils.js'\n\n/**\n * Resolves and transforms `context.params.query` using a map of resolver functions.\n * Each property in the resolver object receives the current query value and can return\n * a transformed value. Runs before `next()` in the hook pipeline.\n *\n * @example\n * ```ts\n * import { resolveQuery, defaults } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * before: {\n * find: [resolveQuery({ active: defaults(true) })]\n * }\n * })\n * ```\n */\nexport const resolveQuery = <H extends HookContext>(\n resolvers: ResolverObject<any, H>,\n): {\n (context: H, next: NextFunction): Promise<void>\n (context: H): Promisable<H>\n} => {\n const propertyNames = Object.keys(resolvers) as any as (keyof any)[]\n\n if (!propertyNames.length) {\n return ((context: H, next?: NextFunction) => {\n if (next) return next().then(() => context)\n return context\n }) as any\n }\n\n return ((context: H, next?: NextFunction) => {\n const queryIngoing = context?.params?.query || {}\n const result = resolve({\n resolvers,\n data: queryIngoing,\n context,\n propertyNames,\n })\n\n function assign(query: any) {\n context.params = { ...context.params, query }\n if (next) return next().then(() => context)\n return context\n }\n\n if (result instanceof Promise) {\n return result.then(assign)\n }\n\n return assign(result)\n }) as any\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport type { ResolverObject } from '../resolvers.internal.js'\nimport { resolveData } from '../resolve-data/resolve-data.js'\nimport { resolveQuery } from '../resolve-query/resolve-query.js'\nimport { resolveResult } from '../resolve-result/resolve-result.js'\nimport type {\n DataSingleHookContext,\n ResultSingleHookContext,\n} from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Combines `data`, `query`, and `result` resolvers into a single around hook.\n * Data and query resolvers run before `next()`, while the result resolver runs after.\n * At least one resolver must be provided.\n *\n * @example\n * ```ts\n * import { resolve, lowercase, omit } from 'feathers-utils/resolvers'\n *\n * app.service('users').hooks({\n * around: {\n * all: [resolve({\n * data: { email: lowercase() },\n * result: { password: omit() },\n * })]\n * }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/resolvers/resolve.html\n */\nexport const resolve = <\n H extends HookContext = HookContext,\n D = Data<H>,\n R = Result<H>,\n>(resolverProperties: {\n data?: ResolverObject<D, H>\n query?: ResolverObject<any, H>\n result?: ResolverObject<R, H>\n}) => {\n const dataResolver = resolverProperties.data\n ? resolveData(resolverProperties.data)\n : undefined\n const queryResolver = resolverProperties.query\n ? resolveQuery(resolverProperties.query)\n : undefined\n const resultResolver = resolverProperties.result\n ? resolveResult(resolverProperties.result)\n : undefined\n\n if (!dataResolver && !queryResolver && !resultResolver) {\n throw new Error(\n 'At least one resolver must be provided (data, query, or result)',\n )\n }\n\n return async (context: H, next?: NextFunction) => {\n if (queryResolver || dataResolver) {\n const promisesBefore: Promise<any>[] = []\n\n if (queryResolver) {\n promisesBefore.push(Promise.resolve(queryResolver(context)))\n }\n\n if (dataResolver) {\n promisesBefore.push(Promise.resolve(dataResolver(context)))\n }\n\n await Promise.all(promisesBefore)\n }\n\n if (next) {\n await next()\n }\n\n if (resultResolver) {\n await resultResolver(context)\n }\n\n return\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as Promisable, T as AnyFallback, n as ResultSingleHookContext, t as DataSingleHookContext } from "./hook-context-
|
|
1
|
+
import { A as Promisable, T as AnyFallback, n as ResultSingleHookContext, t as DataSingleHookContext } from "./hook-context-BsxU1vfN.mjs";
|
|
2
2
|
import { HookContext, NextFunction } from "@feathersjs/feathers";
|
|
3
3
|
|
|
4
4
|
//#region src/resolvers/resolvers.internal.d.ts
|
|
@@ -115,4 +115,4 @@ declare const resolve: <H extends HookContext = HookContext, D = Data<H>, R = Re
|
|
|
115
115
|
}) => (context: H, next?: NextFunction) => Promise<void>;
|
|
116
116
|
//#endregion
|
|
117
117
|
export { ResolverPropertyOptions as a, resolveData as i, resolveQuery as n, resolveResult as r, resolve as t };
|
|
118
|
-
//# sourceMappingURL=resolve-
|
|
118
|
+
//# sourceMappingURL=resolve-Cmxskunj.d.mts.map
|
package/dist/resolvers.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { g as PredicateFn } from "./hook-context-
|
|
2
|
-
import { a as ResolverPropertyOptions, i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-
|
|
1
|
+
import { g as PredicateFn } from "./hook-context-BsxU1vfN.mjs";
|
|
2
|
+
import { a as ResolverPropertyOptions, i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-Cmxskunj.mjs";
|
|
3
3
|
import { HookContext } from "@feathersjs/feathers";
|
|
4
4
|
|
|
5
5
|
//#region src/resolvers/resolver-condition.d.ts
|
package/dist/resolvers.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-
|
|
1
|
+
import { i as resolveData, n as resolveQuery, r as resolveResult, t as resolve } from "./resolve-B9hRleHY.mjs";
|
|
2
2
|
//#region src/resolvers/helpers/omit/omit.ts
|
|
3
3
|
/**
|
|
4
4
|
* Returns a resolver property that removes the field by returning `undefined`.
|
package/dist/resolvers.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolvers.mjs","names":[],"sources":["../src/resolvers/helpers/omit/omit.ts","../src/resolvers/helpers/trim/trim.ts","../src/resolvers/helpers/lowercase/lowercase.ts","../src/resolvers/helpers/defaults/defaults.ts","../src/resolvers/helpers/set-now/set-now.ts","../src/resolvers/from-predicate/from-predicate.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that removes the field by returning `undefined`.\n * When a condition is provided, the field is only omitted if the condition returns `true`.\n *\n * @example\n * ```ts\n * import { resolveResult, omit, fromPredicate } from 'feathers-utils/resolvers'\n * import { isProvider } from 'feathers-utils/predicates'\n *\n * resolveResult({\n * password: omit(),\n * secret: omit(fromPredicate(isProvider('external'))),\n * })\n * ```\n */\nexport function omit<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return undefined\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that trims whitespace from string values.\n * Non-string values are passed through unchanged.\n *\n * @example\n * ```ts\n * import { resolveData, trim } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * name: trim(),\n * })\n * ```\n */\nexport function trim<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return typeof options.value === 'string'\n ? options.value.trim()\n : options.value\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that converts string values to lowercase.\n * Non-string values are passed through unchanged.\n *\n * @example\n * ```ts\n * import { resolveData, lowercase } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * email: lowercase(),\n * })\n * ```\n */\nexport function lowercase<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return typeof options.value === 'string'\n ? options.value.toLowerCase()\n : options.value\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that sets a default value when the current value\n * is `undefined` or `null`. Accepts a static value or a function that receives\n * the hook context.\n *\n * @example\n * ```ts\n * import { resolveData, defaults } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * role: defaults('user'),\n * createdBy: defaults((context) => context.params.user?.id),\n * })\n * ```\n */\nexport function defaults<H extends HookContext = HookContext>(\n defaultValue: unknown | ((context: H) => unknown),\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n if (options.value !== undefined && options.value !== null) {\n return options.value\n }\n return typeof defaultValue === 'function'\n ? (defaultValue as (context: H) => unknown)(options.context)\n : defaultValue\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that sets the field to the current timestamp\n * (`Date.now()`). Always overwrites the existing value.\n *\n * @example\n * ```ts\n * import { resolveData, setNow } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * createdAt: setNow(),\n * })\n * ```\n */\nexport function setNow<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return Date.now()\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport type { ResolverCondition } from '../resolver-condition.js'\n\n/**\n * Adapts an existing predicate function (like `isProvider`, `isContext`) into a\n * resolver condition. The predicate receives the hook context extracted from the\n * resolver options. Only synchronous predicates are supported.\n *\n * @example\n * ```ts\n * import { resolveResult, omit, fromPredicate } from 'feathers-utils/resolvers'\n * import { isProvider } from 'feathers-utils/predicates'\n *\n * resolveResult({\n * password: omit(fromPredicate(isProvider('external'))),\n * })\n * ```\n */\nexport function fromPredicate<H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n): ResolverCondition<H> {\n return ({ context }) => {\n const result = predicate(context)\n if (typeof result !== 'boolean') {\n throw new Error('fromPredicate does not support async predicates')\n }\n return result\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,KACd,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,
|
|
1
|
+
{"version":3,"file":"resolvers.mjs","names":[],"sources":["../src/resolvers/helpers/omit/omit.ts","../src/resolvers/helpers/trim/trim.ts","../src/resolvers/helpers/lowercase/lowercase.ts","../src/resolvers/helpers/defaults/defaults.ts","../src/resolvers/helpers/set-now/set-now.ts","../src/resolvers/from-predicate/from-predicate.ts"],"sourcesContent":["import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that removes the field by returning `undefined`.\n * When a condition is provided, the field is only omitted if the condition returns `true`.\n *\n * @example\n * ```ts\n * import { resolveResult, omit, fromPredicate } from 'feathers-utils/resolvers'\n * import { isProvider } from 'feathers-utils/predicates'\n *\n * resolveResult({\n * password: omit(),\n * secret: omit(fromPredicate(isProvider('external'))),\n * })\n * ```\n */\nexport function omit<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return undefined\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that trims whitespace from string values.\n * Non-string values are passed through unchanged.\n *\n * @example\n * ```ts\n * import { resolveData, trim } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * name: trim(),\n * })\n * ```\n */\nexport function trim<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return typeof options.value === 'string'\n ? options.value.trim()\n : options.value\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that converts string values to lowercase.\n * Non-string values are passed through unchanged.\n *\n * @example\n * ```ts\n * import { resolveData, lowercase } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * email: lowercase(),\n * })\n * ```\n */\nexport function lowercase<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return typeof options.value === 'string'\n ? options.value.toLowerCase()\n : options.value\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that sets a default value when the current value\n * is `undefined` or `null`. Accepts a static value or a function that receives\n * the hook context.\n *\n * @example\n * ```ts\n * import { resolveData, defaults } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * role: defaults('user'),\n * createdBy: defaults((context) => context.params.user?.id),\n * })\n * ```\n */\nexport function defaults<H extends HookContext = HookContext>(\n defaultValue: unknown | ((context: H) => unknown),\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n if (options.value !== undefined && options.value !== null) {\n return options.value\n }\n return typeof defaultValue === 'function'\n ? (defaultValue as (context: H) => unknown)(options.context)\n : defaultValue\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { ResolverPropertyOptions } from '../../resolvers.internal.js'\nimport type { ResolverCondition } from '../../resolver-condition.js'\n\n/**\n * Returns a resolver property that sets the field to the current timestamp\n * (`Date.now()`). Always overwrites the existing value.\n *\n * @example\n * ```ts\n * import { resolveData, setNow } from 'feathers-utils/resolvers'\n *\n * resolveData({\n * createdAt: setNow(),\n * })\n * ```\n */\nexport function setNow<H extends HookContext = HookContext>(\n condition?: ResolverCondition<H>,\n) {\n return (options: ResolverPropertyOptions<any, any, H>) => {\n if (condition && !condition(options)) {\n return options.value\n }\n return Date.now()\n }\n}\n","import type { HookContext } from '@feathersjs/feathers'\nimport type { PredicateFn } from '../../types.js'\nimport type { ResolverCondition } from '../resolver-condition.js'\n\n/**\n * Adapts an existing predicate function (like `isProvider`, `isContext`) into a\n * resolver condition. The predicate receives the hook context extracted from the\n * resolver options. Only synchronous predicates are supported.\n *\n * @example\n * ```ts\n * import { resolveResult, omit, fromPredicate } from 'feathers-utils/resolvers'\n * import { isProvider } from 'feathers-utils/predicates'\n *\n * resolveResult({\n * password: omit(fromPredicate(isProvider('external'))),\n * })\n * ```\n */\nexport function fromPredicate<H extends HookContext = HookContext>(\n predicate: PredicateFn<H>,\n): ResolverCondition<H> {\n return ({ context }) => {\n const result = predicate(context)\n if (typeof result !== 'boolean') {\n throw new Error('fromPredicate does not support async predicates')\n }\n return result\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,KACd,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,OAAO,GACjC,OAAO,QAAQ;CAGnB;AACF;;;;;;;;;;;;;;;;ACXA,SAAgB,KACd,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,OAAO,GACjC,OAAO,QAAQ;EAEjB,OAAO,OAAO,QAAQ,UAAU,WAC5B,QAAQ,MAAM,KAAK,IACnB,QAAQ;CACd;AACF;;;;;;;;;;;;;;;;ACXA,SAAgB,UACd,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,OAAO,GACjC,OAAO,QAAQ;EAEjB,OAAO,OAAO,QAAQ,UAAU,WAC5B,QAAQ,MAAM,YAAY,IAC1B,QAAQ;CACd;AACF;;;;;;;;;;;;;;;;;;ACTA,SAAgB,SACd,cACA,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,OAAO,GACjC,OAAO,QAAQ;EAEjB,IAAI,QAAQ,UAAU,KAAA,KAAa,QAAQ,UAAU,MACnD,OAAO,QAAQ;EAEjB,OAAO,OAAO,iBAAiB,aAC1B,aAAyC,QAAQ,OAAO,IACzD;CACN;AACF;;;;;;;;;;;;;;;;ACjBA,SAAgB,OACd,WACA;CACA,QAAQ,YAAkD;EACxD,IAAI,aAAa,CAAC,UAAU,OAAO,GACjC,OAAO,QAAQ;EAEjB,OAAO,KAAK,IAAI;CAClB;AACF;;;;;;;;;;;;;;;;;;ACPA,SAAgB,cACd,WACsB;CACtB,QAAQ,EAAE,cAAc;EACtB,MAAM,SAAS,UAAU,OAAO;EAChC,IAAI,OAAO,WAAW,WACpB,MAAM,IAAI,MAAM,iDAAiD;EAEnE,OAAO;CACT;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as mutateData, t as mutateResult } from "./mutate-result.util-
|
|
1
|
+
import { r as mutateData, t as mutateResult } from "./mutate-result.util-Dqzepn1M.mjs";
|
|
2
2
|
//#region src/hooks/transform-data/transform-data.hook.ts
|
|
3
3
|
/**
|
|
4
4
|
* Transforms each item in `context.data` using the provided transformer function.
|
|
@@ -75,4 +75,4 @@ const transformResult = (transformer, options) => async (context, next) => {
|
|
|
75
75
|
//#endregion
|
|
76
76
|
export { transformQuery as n, transformData as r, transformResult as t };
|
|
77
77
|
|
|
78
|
-
//# sourceMappingURL=transform-result.hook-
|
|
78
|
+
//# sourceMappingURL=transform-result.hook-B65pTRJO.mjs.map
|
package/dist/{transform-result.hook-DYDF8wod.mjs.map → transform-result.hook-B65pTRJO.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform-result.hook-
|
|
1
|
+
{"version":3,"file":"transform-result.hook-B65pTRJO.mjs","names":[],"sources":["../src/hooks/transform-data/transform-data.hook.ts","../src/hooks/transform-query/transform-query.hook.ts","../src/hooks/transform-result/transform-result.hook.ts"],"sourcesContent":["import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { mutateData } from '../../utils/mutate-data/mutate-data.util.js'\nimport type { TransformerInputFn } from '../../types.js'\nimport type { DataSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Data<H extends HookContext> = AnyFallback<\n DataSingleHookContext<H>,\n Record<string, any>\n>\n\n/**\n * Transforms each item in `context.data` using the provided transformer function.\n * The transformer receives each item and can mutate it in place or return a new object.\n * Commonly used with built-in transformers like `lowercase`, `trim`, or `setNow`.\n *\n * @example\n * ```ts\n * import { transformData, lowercase } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * before: { create: [transformData(item => lowercase(item, 'email'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-data.html\n */\nexport const transformData =\n <H extends HookContext = HookContext, D = Data<H>>(\n transformer: TransformerInputFn<D, H>,\n ) =>\n async (context: H, next?: NextFunction): Promise<void> => {\n await mutateData(context, transformer)\n\n if (next) {\n await next()\n }\n }\n","import type { HookContext, NextFunction, Query } from '@feathersjs/feathers'\nimport type { TransformerFn } from '../../types.js'\n\n/**\n * Transforms `context.params.query` using the provided transformer function.\n * The transformer receives the current query and can return a modified version.\n * Useful for normalizing, sanitizing, or enriching queries before they hit the database.\n *\n * @example\n * ```ts\n * import { transformQuery } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * before: { find: [transformQuery((query) => ({ ...query, active: true }))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-query.html\n */\nexport const transformQuery = <\n Q extends Query,\n H extends HookContext = HookContext,\n>(\n transformer: TransformerFn<Q, H>,\n) => {\n function hook(context: H): void\n function hook(context: H, next: NextFunction): Promise<void>\n function hook(context: H, next?: NextFunction): void | Promise<void> {\n context.params.query = transformer(context.params.query ?? {}, {\n context,\n i: 0,\n })\n\n if (next) return next()\n\n return\n }\n return hook\n}\n","import type { HookContext, NextFunction } from '@feathersjs/feathers'\nimport { mutateResult } from '../../utils/mutate-result/mutate-result.util.js'\nimport type { DispatchOption, TransformerInputFn } from '../../types.js'\nimport type { ResultSingleHookContext } from '../../utility-types/hook-context.js'\nimport type { AnyFallback } from '../../internal.utils.js'\n\ntype Result<H extends HookContext> = AnyFallback<\n ResultSingleHookContext<H>,\n Record<string, any>\n>\n\nexport type TransformResultOptions = {\n dispatch?: DispatchOption\n}\n\n/**\n * Transforms each item in `context.result` using the provided transformer function.\n * The transformer receives each item and can mutate it in place or return a new object.\n * Optionally operates on `context.dispatch` via the `dispatch` option.\n *\n * @example\n * ```ts\n * import { transformResult, omit } from 'feathers-utils/transformers'\n *\n * app.service('users').hooks({\n * after: { all: [transformResult(item => omit(item, 'password'))] }\n * })\n * ```\n *\n * @see https://utils.feathersjs.com/hooks/transform-result.html\n */\nexport const transformResult =\n <H extends HookContext = HookContext, R = Result<H>>(\n transformer: TransformerInputFn<R, H>,\n options?: TransformResultOptions,\n ) =>\n async (context: H, next?: NextFunction): Promise<void> => {\n await mutateResult(context, transformer, {\n next,\n dispatch: options?.dispatch,\n })\n }\n"],"mappings":";;;;;;;;;;;;;;;;;;AA2BA,MAAa,iBAET,gBAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,WAAW,SAAS,WAAW;CAErC,IAAI,MACF,MAAM,KAAK;AAEf;;;;;;;;;;;;;;;;;;;AClBF,MAAa,kBAIX,gBACG;CAGH,SAAS,KAAK,SAAY,MAA2C;EACnE,QAAQ,OAAO,QAAQ,YAAY,QAAQ,OAAO,SAAS,CAAC,GAAG;GAC7D;GACA,GAAG;EACL,CAAC;EAED,IAAI,MAAM,OAAO,KAAK;CAGxB;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACPA,MAAa,mBAET,aACA,YAEF,OAAO,SAAY,SAAuC;CACxD,MAAM,aAAa,SAAS,aAAa;EACvC;EACA,UAAU,SAAS;CACrB,CAAC;AACH"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as AnyFallback, b as TransformerFn, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, x as TransformerInputFn } from "./hook-context-
|
|
1
|
+
import { T as AnyFallback, b as TransformerFn, l as DispatchOption, n as ResultSingleHookContext, t as DataSingleHookContext, x as TransformerInputFn } from "./hook-context-BsxU1vfN.mjs";
|
|
2
2
|
import { HookContext, NextFunction, Query } from "@feathersjs/feathers";
|
|
3
3
|
|
|
4
4
|
//#region src/hooks/transform-data/transform-data.hook.d.ts
|
|
@@ -67,4 +67,4 @@ type TransformResultOptions = {
|
|
|
67
67
|
declare const transformResult: <H extends HookContext = HookContext, R = Result<H>>(transformer: TransformerInputFn<R, H>, options?: TransformResultOptions) => (context: H, next?: NextFunction) => Promise<void>;
|
|
68
68
|
//#endregion
|
|
69
69
|
export { transformData as i, transformResult as n, transformQuery as r, TransformResultOptions as t };
|
|
70
|
-
//# sourceMappingURL=transform-result.hook-
|
|
70
|
+
//# sourceMappingURL=transform-result.hook-C9wMLWs2.d.mts.map
|
package/dist/transformers.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { O as MaybeArray, b as TransformerFn, c as DefaultsInput, u as FieldKey, v as StringFieldKey } from "./hook-context-
|
|
2
|
-
import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-
|
|
3
|
-
import { n as mutateResult, r as mutateData, t as MutateResultOptions } from "./mutate-result.util-
|
|
1
|
+
import { O as MaybeArray, b as TransformerFn, c as DefaultsInput, u as FieldKey, v as StringFieldKey } from "./hook-context-BsxU1vfN.mjs";
|
|
2
|
+
import { i as transformData, n as transformResult, r as transformQuery, t as TransformResultOptions } from "./transform-result.hook-C9wMLWs2.mjs";
|
|
3
|
+
import { n as mutateResult, r as mutateData, t as MutateResultOptions } from "./mutate-result.util-DR9JMsvl.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/transformers/defaults/defaults.transformer.d.ts
|
|
6
6
|
/**
|
package/dist/transformers.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { r as toArray } from "./internal.utils-
|
|
2
|
-
import { r as mutateData, t as mutateResult } from "./mutate-result.util-
|
|
3
|
-
import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-
|
|
1
|
+
import { r as toArray } from "./internal.utils-BMzV_-xp.mjs";
|
|
2
|
+
import { r as mutateData, t as mutateResult } from "./mutate-result.util-Dqzepn1M.mjs";
|
|
3
|
+
import { n as transformQuery, r as transformData, t as transformResult } from "./transform-result.hook-B65pTRJO.mjs";
|
|
4
4
|
import { BadRequest } from "@feathersjs/errors";
|
|
5
5
|
import _get from "lodash/get.js";
|
|
6
6
|
import _omit from "lodash/omit.js";
|