{"version":3,"file":"analogjs-trpc-server.mjs","sources":["../../../../packages/trpc/server/src/lib/server.ts","../../../../packages/trpc/server/src/analogjs-trpc-server.ts"],"sourcesContent":["/**\n * ALl credit goes to the awesome trpc-nuxt plugin https://github.com/wobsoriano/trpc-nuxt\n * Since Analog currently uses Nitro as the underlying server we can\n * simply reuse the hard work done by Robert Soriano and friends\n * **/\n\nimport type { ResponseMeta } from '@trpc/server/http';\nimport { resolveHTTPResponse } from '@trpc/server/http';\nimport type {\n  AnyRouter,\n  inferRouterContext,\n  inferRouterError,\n  ProcedureType,\n} from '@trpc/server';\nimport { TRPCError } from '@trpc/server';\nimport { createURL } from 'ufo';\nimport type { H3Event } from 'h3';\nimport { createError, defineEventHandler, isMethod, readBody } from 'h3';\nimport type { TRPCResponse } from '@trpc/server/rpc';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport type CreateContextFn<TRouter extends AnyRouter> = (\n  event: H3Event,\n) => MaybePromise<inferRouterContext<TRouter>>;\n\nexport interface ResponseMetaFnPayload<TRouter extends AnyRouter> {\n  data: TRPCResponse<unknown, inferRouterError<TRouter>>[];\n  ctx?: inferRouterContext<TRouter>;\n  paths?: string[];\n  type: ProcedureType | 'unknown';\n  errors: TRPCError[];\n}\n\nexport type ResponseMetaFn<TRouter extends AnyRouter> = (\n  opts: ResponseMetaFnPayload<TRouter>,\n) => ResponseMeta;\n\nexport interface OnErrorPayload<TRouter extends AnyRouter> {\n  error: TRPCError;\n  type: ProcedureType | 'unknown';\n  path: string | undefined;\n  req: H3Event['node']['req'];\n  input: unknown;\n  ctx: undefined | inferRouterContext<TRouter>;\n}\n\nexport type OnErrorFn<TRouter extends AnyRouter> = (\n  opts: OnErrorPayload<TRouter>,\n) => void;\n\nexport interface ResolveHTTPRequestOptions<TRouter extends AnyRouter> {\n  router: TRouter;\n  createContext?: CreateContextFn<TRouter>;\n  responseMeta?: ResponseMetaFn<TRouter>;\n  onError?: OnErrorFn<TRouter>;\n  batching?: {\n    enabled: boolean;\n  };\n}\n\nfunction getPath(event: H3Event): string | null {\n  const { params } = event.context;\n\n  if (typeof params?.['trpc'] === 'string') {\n    return params['trpc'];\n  }\n\n  if (params?.['trpc'] && Array.isArray(params['trpc'])) {\n    return (params['trpc'] as string[]).join('/');\n  }\n\n  return null;\n}\n\nexport function createTrpcNitroHandler<TRouter extends AnyRouter>({\n  router,\n  createContext,\n  responseMeta,\n  onError,\n  batching,\n}: ResolveHTTPRequestOptions<TRouter>) {\n  return defineEventHandler(async (event) => {\n    const { req, res } = event.node;\n\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const $url = createURL(req.url!);\n\n    const path = getPath(event);\n\n    if (path === null) {\n      const error = router.getErrorShape({\n        error: new TRPCError({\n          message:\n            'Param \"trpc\" not found - is the file named `[trpc]`.ts or `[...trpc].ts`?',\n          code: 'INTERNAL_SERVER_ERROR',\n        }),\n        type: 'unknown',\n        ctx: undefined,\n        path: undefined,\n        input: undefined,\n      });\n\n      throw createError({\n        statusCode: 500,\n        statusMessage: JSON.stringify(error),\n      });\n    }\n\n    const httpResponse = await resolveHTTPResponse({\n      batching,\n      router,\n      req: {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        method: req.method!,\n        headers: req.headers,\n        body: isMethod(event, 'GET') ? null : await readBody(event),\n        query: $url.searchParams,\n      },\n      path,\n      createContext: async () => await createContext?.(event),\n      responseMeta,\n      onError: (o) => {\n        onError?.({\n          ...o,\n          req,\n        });\n      },\n    });\n\n    const { status, headers, body } = httpResponse;\n\n    res.statusCode = status;\n\n    headers &&\n      Object.keys(headers).forEach((key) => {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        res.setHeader(key, headers[key]!);\n      });\n\n    return body;\n  });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAAA;;;;AAIM;AAyDN,SAAS,OAAO,CAAC,KAAc,EAAA;AAC7B,IAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO;IAEhC,IAAI,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,QAAQ,EAAE;AACxC,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC;;AAGvB,IAAA,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;QACrD,OAAQ,MAAM,CAAC,MAAM,CAAc,CAAC,IAAI,CAAC,GAAG,CAAC;;AAG/C,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,sBAAsB,CAA4B,EAChE,MAAM,EACN,aAAa,EACb,YAAY,EACZ,OAAO,EACP,QAAQ,GAC2B,EAAA;AACnC,IAAA,OAAO,kBAAkB,CAAC,OAAO,KAAK,KAAI;QACxC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI;;QAG/B,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAI,CAAC;AAEhC,QAAA,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;AAE3B,QAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC;gBACjC,KAAK,EAAE,IAAI,SAAS,CAAC;AACnB,oBAAA,OAAO,EACL,2EAA2E;AAC7E,oBAAA,IAAI,EAAE,uBAAuB;iBAC9B,CAAC;AACF,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA,CAAC;AAEF,YAAA,MAAM,WAAW,CAAC;AAChB,gBAAA,UAAU,EAAE,GAAG;AACf,gBAAA,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;AACrC,aAAA,CAAC;;AAGJ,QAAA,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;YAC7C,QAAQ;YACR,MAAM;AACN,YAAA,GAAG,EAAE;;gBAEH,MAAM,EAAE,GAAG,CAAC,MAAO;gBACnB,OAAO,EAAE,GAAG,CAAC,OAAO;AACpB,gBAAA,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;gBAC3D,KAAK,EAAE,IAAI,CAAC,YAAY;AACzB,aAAA;YACD,IAAI;YACJ,aAAa,EAAE,YAAY,MAAM,aAAa,GAAG,KAAK,CAAC;YACvD,YAAY;AACZ,YAAA,OAAO,EAAE,CAAC,CAAC,KAAI;AACb,gBAAA,OAAO,GAAG;AACR,oBAAA,GAAG,CAAC;oBACJ,GAAG;AACJ,iBAAA,CAAC;aACH;AACF,SAAA,CAAC;QAEF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY;AAE9C,QAAA,GAAG,CAAC,UAAU,GAAG,MAAM;QAEvB,OAAO;YACL,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;;gBAEnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAE,CAAC;AACnC,aAAC,CAAC;AAEJ,QAAA,OAAO,IAAI;AACb,KAAC,CAAC;AACJ;;AC9IA;;AAEG;;;;"}