{"version":3,"file":"server.mjs","names":["opts: CreateTRPCNextAppRouterOptions<TRouter>","t: TInstance","opts: CreateContextCallback<\n    TInstance['_config']['$types']['ctx'],\n    () => MaybePromise<TInstance['_config']['$types']['ctx']>\n  > & {\n    /**\n     * Transform form data to a `Record` before passing it to the procedure\n     * @default true\n     */\n    normalizeFormData?: boolean;\n    /**\n     * Called when an error occurs in the handler\n     */\n    onError?: (\n      opts: ErrorHandlerOptions<TInstance['_config']['$types']['ctx']>,\n    ) => void;\n\n    /**\n     * Rethrow errors that should be handled by Next.js\n     * @default true\n     */\n    rethrowNextErrors?: boolean;\n  }","proc: TProc","rawInput: FormData | inferProcedureInput<TProc>","ctx: TInstance['_config']['$types']['ctx'] | undefined","req: Request"],"sources":["../../src/app-dir/server.ts"],"sourcesContent":["/// <reference types=\"next\" />\nimport {\n  clientCallTypeToProcedureType,\n  createTRPCUntypedClient,\n} from '@trpc/client';\nimport type { CreateContextCallback } from '@trpc/server';\nimport { rethrowNextErrors } from '@trpc/server/adapters/next-app-dir';\nimport type {\n  AnyProcedure,\n  AnyRootTypes,\n  AnyRouter,\n  ErrorHandlerOptions,\n  inferClientTypes,\n  inferProcedureInput,\n  MaybePromise,\n  RootConfig,\n  Simplify,\n  TRPCResponse,\n} from '@trpc/server/unstable-core-do-not-import';\nimport {\n  createRecursiveProxy,\n  formDataToObject,\n  getErrorShape,\n  getTRPCErrorFromUnknown,\n  transformTRPCResponse,\n  TRPCError,\n} from '@trpc/server/unstable-core-do-not-import';\nimport { revalidateTag } from 'next/cache';\nimport { cache } from 'react';\nimport type {\n  ActionHandlerDef,\n  CreateTRPCNextAppRouterOptions,\n  inferActionDef,\n} from './shared';\nimport { generateCacheTag, isFormData } from './shared';\nimport type { NextAppDirDecorateRouterRecord } from './types';\n\nexport type { ActionHandlerDef };\n\n// ts-prune-ignore-next\nexport function experimental_createTRPCNextAppDirServer<\n  TRouter extends AnyRouter,\n>(opts: CreateTRPCNextAppRouterOptions<TRouter>) {\n  const getClient = cache(() => {\n    const config = opts.config();\n    return createTRPCUntypedClient(config);\n  });\n\n  return createRecursiveProxy<\n    NextAppDirDecorateRouterRecord<\n      TRouter['_def']['_config']['$types'],\n      TRouter['_def']['record']\n    >\n  >((callOpts) => {\n    // lazily initialize client\n    const client = getClient();\n\n    const pathCopy = [...callOpts.path];\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const action = pathCopy.pop()!;\n    const procedurePath = pathCopy.join('.');\n    const procedureType = clientCallTypeToProcedureType(action);\n    const cacheTag = generateCacheTag(procedurePath, callOpts.args[0]);\n\n    if (action === 'revalidate') {\n      revalidateTag(cacheTag);\n      return;\n    }\n\n    return (client[procedureType] as any)(procedurePath, ...callOpts.args);\n  });\n}\n\n/**\n * @internal\n */\nexport type TRPCActionHandler<TDef extends ActionHandlerDef> = (\n  input: FormData | TDef['input'],\n) => Promise<TRPCResponse<TDef['output'], TDef['errorShape']>>;\n\nexport function experimental_createServerActionHandler<\n  TInstance extends {\n    _config: RootConfig<AnyRootTypes>;\n  },\n>(\n  t: TInstance,\n  opts: CreateContextCallback<\n    TInstance['_config']['$types']['ctx'],\n    () => MaybePromise<TInstance['_config']['$types']['ctx']>\n  > & {\n    /**\n     * Transform form data to a `Record` before passing it to the procedure\n     * @default true\n     */\n    normalizeFormData?: boolean;\n    /**\n     * Called when an error occurs in the handler\n     */\n    onError?: (\n      opts: ErrorHandlerOptions<TInstance['_config']['$types']['ctx']>,\n    ) => void;\n\n    /**\n     * Rethrow errors that should be handled by Next.js\n     * @default true\n     */\n    rethrowNextErrors?: boolean;\n  },\n) {\n  const config = t._config;\n  const {\n    normalizeFormData = true,\n    createContext,\n    rethrowNextErrors: shouldRethrowNextErrors = true,\n  } = opts;\n\n  const transformer = config.transformer;\n\n  // TODO allow this to take a `TRouter` in addition to a `AnyProcedure`\n  return function createServerAction<TProc extends AnyProcedure>(\n    proc: TProc,\n  ): TRPCActionHandler<\n    Simplify<inferActionDef<inferClientTypes<TInstance>, TProc>>\n  > {\n    return async function actionHandler(\n      rawInput: FormData | inferProcedureInput<TProc>,\n    ) {\n      let ctx: TInstance['_config']['$types']['ctx'] | undefined = undefined;\n      try {\n        ctx = (await createContext?.()) ?? {};\n        if (normalizeFormData && isFormData(rawInput)) {\n          // Normalizes FormData so we can use `z.object({})` etc on the server\n          try {\n            rawInput = formDataToObject(rawInput);\n          } catch {\n            throw new TRPCError({\n              code: 'INTERNAL_SERVER_ERROR',\n              message: 'Failed to convert FormData to an object',\n            });\n          }\n        } else if (rawInput && !isFormData(rawInput)) {\n          rawInput = transformer.input.deserialize(rawInput);\n        }\n\n        const data = proc._def.experimental_caller\n          ? await proc(rawInput as any)\n          : await proc({\n              input: undefined,\n              ctx,\n              path: '',\n              getRawInput: async () => rawInput,\n              type: proc._def.type,\n              // is it possible to get the AbortSignal from the request?\n              signal: undefined,\n              batchIndex: 0,\n            });\n\n        const transformedJSON = transformTRPCResponse(config, {\n          result: {\n            data,\n          },\n        });\n        return transformedJSON;\n      } catch (cause) {\n        const error = getTRPCErrorFromUnknown(cause);\n\n        opts.onError?.({\n          ctx,\n          error,\n          input: rawInput,\n          path: '',\n          type: proc._def.type,\n        });\n\n        if (shouldRethrowNextErrors) {\n          rethrowNextErrors(error);\n        }\n\n        const shape = getErrorShape({\n          config,\n          ctx,\n          error,\n          input: rawInput,\n          path: '',\n          type: proc._def.type,\n        });\n\n        return transformTRPCResponse(t._config, {\n          error: shape,\n        });\n      }\n    } as TRPCActionHandler<\n      inferActionDef<TInstance['_config']['$types'], TProc>\n    >;\n  };\n}\n\n// ts-prune-ignore-next\nexport async function experimental_revalidateEndpoint(req: Request) {\n  const { cacheTag } = await req.json();\n\n  if (typeof cacheTag !== 'string') {\n    return new Response(\n      JSON.stringify({\n        revalidated: false,\n        error: 'cacheTag must be a string',\n      }),\n      { status: 400 },\n    );\n  }\n\n  revalidateTag(cacheTag);\n  return new Response(JSON.stringify({ revalidated: true, now: Date.now() }), {\n    status: 200,\n  });\n}\n"],"mappings":";;;;;;;;AAwCA,SAAgB,wCAEdA,MAA+C;CAC/C,MAAM,YAAY,MAAM,MAAM;EAC5B,MAAM,SAAS,KAAK,QAAQ;AAC5B,SAAO,wBAAwB,OAAO;CACvC,EAAC;AAEF,QAAO,qBAKL,CAAC,aAAa;EAEd,MAAM,SAAS,WAAW;EAE1B,MAAM,WAAW,CAAC,GAAG,SAAS,IAAK;EAEnC,MAAM,SAAS,SAAS,KAAK;EAC7B,MAAM,gBAAgB,SAAS,KAAK,IAAI;EACxC,MAAM,gBAAgB,8BAA8B,OAAO;EAC3D,MAAM,WAAW,iBAAiB,eAAe,SAAS,KAAK,GAAG;AAElE,MAAI,WAAW,cAAc;AAC3B,iBAAc,SAAS;AACvB;EACD;AAED,SAAO,AAAC,OAAO,eAAuB,eAAe,GAAG,SAAS,KAAK;CACvE,EAAC;AACH;AASD,SAAgB,uCAKdC,GACAC,MAsBA;CACA,MAAM,SAAS,EAAE;CACjB,MAAM,EACJ,oBAAoB,MACpB,eACA,mBAAmB,0BAA0B,MAC9C,GAAG;CAEJ,MAAM,cAAc,OAAO;AAG3B,QAAO,SAAS,mBACdC,MAGA;AACA,SAAO,eAAe,cACpBC,UACA;GACA,IAAIC;AACJ,OAAI;;AACF,kCAAO,qEAAM,eAAiB,wEAAK,CAAE;AACrC,QAAI,qBAAqB,WAAW,SAAS,CAE3C,KAAI;AACF,gBAAW,iBAAiB,SAAS;IACtC,kBAAO;AACN,WAAM,IAAI,UAAU;MAClB,MAAM;MACN,SAAS;KACV;IACF;aACQ,aAAa,WAAW,SAAS,CAC1C,YAAW,YAAY,MAAM,YAAY,SAAS;IAGpD,MAAM,OAAO,KAAK,KAAK,sBACnB,MAAM,KAAK,SAAgB,GAC3B,MAAM,KAAK;KACT;KACA;KACA,MAAM;KACN,aAAa,YAAY;KACzB,MAAM,KAAK,KAAK;KAEhB;KACA,YAAY;IACb,EAAC;IAEN,MAAM,kBAAkB,sBAAsB,QAAQ,EACpD,QAAQ,EACN,KACD,EACF,EAAC;AACF,WAAO;GACR,SAAQ,OAAO;;IACd,MAAM,QAAQ,wBAAwB,MAAM;AAE5C,0BAAK,iDAAL,yBAAe;KACb;KACA;KACA,OAAO;KACP,MAAM;KACN,MAAM,KAAK,KAAK;IACjB,EAAC;AAEF,QAAI,wBACF,mBAAkB,MAAM;IAG1B,MAAM,QAAQ,cAAc;KAC1B;KACA;KACA;KACA,OAAO;KACP,MAAM;KACN,MAAM,KAAK,KAAK;IACjB,EAAC;AAEF,WAAO,sBAAsB,EAAE,SAAS,EACtC,OAAO,MACR,EAAC;GACH;EACF;CAGF;AACF;AAGD,eAAsB,gCAAgCC,KAAc;CAClE,MAAM,EAAE,UAAU,GAAG,MAAM,IAAI,MAAM;AAErC,YAAW,aAAa,SACtB,QAAO,IAAI,SACT,KAAK,UAAU;EACb,aAAa;EACb,OAAO;CACR,EAAC,EACF,EAAE,QAAQ,IAAK;AAInB,eAAc,SAAS;AACvB,QAAO,IAAI,SAAS,KAAK,UAAU;EAAE,aAAa;EAAM,KAAK,KAAK,KAAK;CAAE,EAAC,EAAE,EAC1E,QAAQ,IACT;AACF"}