{"version":3,"file":"resolve-BflgIVD8.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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"}