UNPKG

@trpc/next

Version:

The tRPC Next.js library

1 lines 8.69 kB
{"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 });\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;IACD,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"}