{"version":3,"file":"getErrorShape-B0JBUs-i.mjs","names":[],"sources":["../src/unstable-core-do-not-import/createProxy.ts","../src/unstable-core-do-not-import/http/getHTTPStatusCode.ts","../src/unstable-core-do-not-import/error/getErrorShape.ts"],"sourcesContent":["import { emptyObject } from './utils';\n\ninterface ProxyCallbackOptions {\n  path: readonly string[];\n  args: readonly unknown[];\n}\ntype ProxyCallback = (opts: ProxyCallbackOptions) => unknown;\n\nconst noop = () => {\n  // noop\n};\n\nconst freezeIfAvailable = (obj: object) => {\n  if (Object.freeze) {\n    Object.freeze(obj);\n  }\n};\n\nfunction createInnerProxy(\n  callback: ProxyCallback,\n  path: readonly string[],\n  memo: Record<string, unknown>,\n) {\n  const cacheKey = path.join('.');\n\n  memo[cacheKey] ??= new Proxy(noop, {\n    get(_obj, key) {\n      if (typeof key !== 'string' || key === 'then') {\n        // special case for if the proxy is accidentally treated\n        // like a PromiseLike (like in `Promise.resolve(proxy)`)\n        return undefined;\n      }\n      return createInnerProxy(callback, [...path, key], memo);\n    },\n    apply(_1, _2, args) {\n      const lastOfPath = path[path.length - 1];\n\n      // React 19 may call valueOf / toString / toJSON when coercing a proxy\n      // to a primitive (e.g. during rendering or logging). Return a debug\n      // string so the coercion does not recurse into the proxy. This only\n      // triggers for direct calls (proxy.toString()), not for chained access\n      // (proxy.toString.query()), preserving route naming freedom.\n      if (\n        lastOfPath === 'valueOf' ||\n        lastOfPath === 'toString' ||\n        lastOfPath === 'toJSON'\n      ) {\n        const debugPath = path.slice(0, -1).join('.');\n        return `tRPC.proxy(${debugPath})`;\n      }\n\n      let opts = { args, path };\n      // special handling for e.g. `trpc.hello.call(this, 'there')` and `trpc.hello.apply(this, ['there'])\n      if (lastOfPath === 'call') {\n        opts = {\n          args: args.length >= 2 ? [args[1]] : [],\n          path: path.slice(0, -1),\n        };\n      } else if (lastOfPath === 'apply') {\n        opts = {\n          args: args.length >= 2 ? args[1] : [],\n          path: path.slice(0, -1),\n        };\n      }\n      freezeIfAvailable(opts.args);\n      freezeIfAvailable(opts.path);\n      return callback(opts);\n    },\n  });\n\n  return memo[cacheKey];\n}\n\n/**\n * Creates a proxy that calls the callback with the path and arguments\n *\n * @internal\n */\nexport const createRecursiveProxy = <TFaux = unknown>(\n  callback: ProxyCallback,\n): TFaux => createInnerProxy(callback, [], emptyObject()) as TFaux;\n\n/**\n * Used in place of `new Proxy` where each handler will map 1 level deep to another value.\n *\n * @internal\n */\nexport const createFlatProxy = <TFaux>(\n  callback: (path: keyof TFaux) => any,\n): TFaux => {\n  return new Proxy(noop, {\n    get(_obj, name) {\n      if (name === 'then') {\n        // special case for if the proxy is accidentally treated\n        // like a PromiseLike (like in `Promise.resolve(proxy)`)\n        return undefined;\n      }\n      return callback(name as any);\n    },\n  }) as TFaux;\n};\n","import type { TRPCError } from '../error/TRPCError';\nimport type { TRPC_ERROR_CODES_BY_KEY, TRPCResponse } from '../rpc';\nimport { TRPC_ERROR_CODES_BY_NUMBER } from '../rpc';\nimport type { InvertKeyValue, ValueOf } from '../types';\nimport { isObject } from '../utils';\n\nexport const JSONRPC2_TO_HTTP_CODE: Record<\n  keyof typeof TRPC_ERROR_CODES_BY_KEY,\n  number\n> = {\n  PARSE_ERROR: 400,\n  BAD_REQUEST: 400,\n  UNAUTHORIZED: 401,\n  PAYMENT_REQUIRED: 402,\n  FORBIDDEN: 403,\n  NOT_FOUND: 404,\n  METHOD_NOT_SUPPORTED: 405,\n  TIMEOUT: 408,\n  CONFLICT: 409,\n  PRECONDITION_FAILED: 412,\n  PAYLOAD_TOO_LARGE: 413,\n  UNSUPPORTED_MEDIA_TYPE: 415,\n  UNPROCESSABLE_CONTENT: 422,\n  PRECONDITION_REQUIRED: 428,\n  TOO_MANY_REQUESTS: 429,\n  CLIENT_CLOSED_REQUEST: 499,\n  INTERNAL_SERVER_ERROR: 500,\n  NOT_IMPLEMENTED: 501,\n  BAD_GATEWAY: 502,\n  SERVICE_UNAVAILABLE: 503,\n  GATEWAY_TIMEOUT: 504,\n};\n\nexport const HTTP_CODE_TO_JSONRPC2: InvertKeyValue<\n  typeof JSONRPC2_TO_HTTP_CODE\n> = {\n  400: 'BAD_REQUEST',\n  401: 'UNAUTHORIZED',\n  402: 'PAYMENT_REQUIRED',\n  403: 'FORBIDDEN',\n  404: 'NOT_FOUND',\n  405: 'METHOD_NOT_SUPPORTED',\n  408: 'TIMEOUT',\n  409: 'CONFLICT',\n  412: 'PRECONDITION_FAILED',\n  413: 'PAYLOAD_TOO_LARGE',\n  415: 'UNSUPPORTED_MEDIA_TYPE',\n  422: 'UNPROCESSABLE_CONTENT',\n  428: 'PRECONDITION_REQUIRED',\n  429: 'TOO_MANY_REQUESTS',\n  499: 'CLIENT_CLOSED_REQUEST',\n  500: 'INTERNAL_SERVER_ERROR',\n  501: 'NOT_IMPLEMENTED',\n  502: 'BAD_GATEWAY',\n  503: 'SERVICE_UNAVAILABLE',\n  504: 'GATEWAY_TIMEOUT',\n} as const;\n\nexport function getStatusCodeFromKey(\n  code: keyof typeof TRPC_ERROR_CODES_BY_KEY,\n) {\n  return JSONRPC2_TO_HTTP_CODE[code] ?? 500;\n}\n\nexport function getStatusKeyFromCode(\n  code: keyof typeof HTTP_CODE_TO_JSONRPC2,\n): ValueOf<typeof HTTP_CODE_TO_JSONRPC2> {\n  return HTTP_CODE_TO_JSONRPC2[code] ?? 'INTERNAL_SERVER_ERROR';\n}\n\nexport function getHTTPStatusCode(json: TRPCResponse | TRPCResponse[]) {\n  const arr = Array.isArray(json) ? json : [json];\n  const httpStatuses = new Set<number>(\n    arr.map((res) => {\n      if ('error' in res && isObject(res.error.data)) {\n        if (typeof res.error.data?.['httpStatus'] === 'number') {\n          return res.error.data['httpStatus'];\n        }\n        const code = TRPC_ERROR_CODES_BY_NUMBER[res.error.code];\n        return getStatusCodeFromKey(code);\n      }\n      return 200;\n    }),\n  );\n\n  if (httpStatuses.size !== 1) {\n    return 207;\n  }\n\n  const httpStatus = httpStatuses.values().next().value;\n\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  return httpStatus!;\n}\n\nexport function getHTTPStatusCodeFromError(error: TRPCError) {\n  return getStatusCodeFromKey(error.code);\n}\n","import { getHTTPStatusCodeFromError } from '../http/getHTTPStatusCode';\nimport type { ProcedureType } from '../procedure';\nimport type { AnyRootTypes, RootConfig } from '../rootConfig';\nimport { TRPC_ERROR_CODES_BY_KEY } from '../rpc';\nimport type { DefaultErrorShape } from './formatter';\nimport type { TRPCError } from './TRPCError';\n\n/**\n * @internal\n */\nexport function getErrorShape<TRoot extends AnyRootTypes>(opts: {\n  config: RootConfig<TRoot>;\n  error: TRPCError;\n  type: ProcedureType | 'unknown';\n  path: string | undefined;\n  input: unknown;\n  ctx: TRoot['ctx'] | undefined;\n}): TRoot['errorShape'] {\n  const { path, error, config } = opts;\n  const { code } = opts.error;\n  const shape: DefaultErrorShape = {\n    message: error.message,\n    code: TRPC_ERROR_CODES_BY_KEY[code],\n    data: {\n      code,\n      httpStatus: getHTTPStatusCodeFromError(error),\n    },\n  };\n  if (config.isDev && typeof opts.error.stack === 'string') {\n    shape.data.stack = opts.error.stack;\n  }\n  if (typeof path === 'string') {\n    shape.data.path = path;\n  }\n  return config.errorFormatter({ ...opts, shape });\n}\n"],"mappings":"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"}