@trpc/server
Version:
1 lines • 41 kB
Source Map (JSON)
{"version":3,"file":"asyncGeneratorDelegate-JWx0LJUD.mjs","names":[],"sources":["../src/unstable-core-do-not-import/error/TRPCError.ts","../src/unstable-core-do-not-import/transformer.ts","../src/unstable-core-do-not-import/router.ts","../src/unstable-core-do-not-import/http/pathSeparator.ts","../src/unstable-core-do-not-import/stream/tracked.ts"],"sourcesContent":["import type { TRPC_ERROR_CODE_KEY } from '../rpc/codes';\nimport { isObject } from '../utils';\n\nclass UnknownCauseError extends Error {\n [key: string]: unknown;\n\n constructor(cause: object) {\n super(getMessage(cause));\n Object.assign(this, cause);\n\n if (isErrorLike(cause)) {\n if (typeof cause.name === 'string') this.name = cause.name;\n if (typeof cause.stack === 'string') this.stack = cause.stack;\n }\n }\n}\n\nfunction getMessage(cause: object) {\n if ('message' in cause) return String(cause.message);\n\n return undefined;\n}\n\n/**\n * Errors from another realm (e.g. `node:vm`, iframes) fail `instanceof Error`\n * but still carry the `[object Error]` brand.\n */\nfunction isErrorLike(value: unknown): value is Error {\n return (\n value instanceof Error ||\n Object.prototype.toString.call(value) === '[object Error]'\n );\n}\n\nexport function getCauseFromUnknown(cause: unknown): Error | undefined {\n if (cause instanceof Error) {\n return cause;\n }\n\n const type = typeof cause;\n if (type === 'undefined' || type === 'function' || cause === null) {\n return undefined;\n }\n\n // Primitive types just get wrapped in an error\n if (type !== 'object') {\n // oxlint-disable-next-line typescript/no-base-to-string\n return new Error(String(cause));\n }\n\n // If it's an object, we'll create a synthetic error\n if (isObject(cause)) {\n return new UnknownCauseError(cause);\n }\n\n return undefined;\n}\n\n/**\n * Turns anything thrown into a `TRPCError`. A `TRPCError` is returned as\n * is; anything else becomes an `INTERNAL_SERVER_ERROR` with it as the\n * cause.\n */\nexport function getTRPCErrorFromUnknown(cause: unknown): TRPCError {\n if (cause instanceof TRPCError) {\n return cause;\n }\n if (cause instanceof Error && cause.name === 'TRPCError') {\n // https://github.com/trpc/trpc/pull/4848\n return cause as TRPCError;\n }\n\n const trpcError = new TRPCError({\n code: 'INTERNAL_SERVER_ERROR',\n cause,\n });\n\n // Inherit stack from error\n if (isErrorLike(cause) && cause.stack) {\n trpcError.stack = cause.stack;\n }\n\n return trpcError;\n}\n\n/**\n * An error with a tRPC error code, which sets the HTTP status and the code\n * the client sees. Throw it from resolvers and middlewares.\n * @example\n * ```ts\n * throw new TRPCError({ code: 'NOT_FOUND', message: 'No such post' });\n * ```\n * @see https://trpc.io/docs/server/error-handling#throwing-errors\n */\nexport class TRPCError extends Error {\n // oxlint-disable-next-line typescript/ban-ts-comment\n // @ts-ignore override doesn't work in all environments due to \"This member cannot have an 'override' modifier because it is not declared in the base class 'Error'\"\n /** The error this one wraps, if any. */\n public override readonly cause?: Error;\n /** The tRPC error code, such as `'NOT_FOUND'`. */\n public readonly code;\n\n constructor(opts: {\n /** Defaults to the cause's message, or else the code. */\n message?: string;\n /** @see https://trpc.io/docs/server/error-handling#error-codes */\n code: TRPC_ERROR_CODE_KEY;\n /** The original error. Anything that isn't an `Error` is wrapped in one. */\n cause?: unknown;\n }) {\n const cause = getCauseFromUnknown(opts.cause);\n const message = opts.message ?? cause?.message ?? opts.code;\n\n // oxlint-disable-next-line typescript/ban-ts-comment\n // @ts-ignore https://github.com/tc39/proposal-error-cause\n super(message, { cause });\n\n this.code = opts.code;\n this.name = 'TRPCError';\n this.cause ??= cause;\n }\n}\n","import type { AnyRootTypes, RootConfig } from './rootConfig';\nimport type { AnyRouter, inferRouterError } from './router';\nimport type {\n TRPCResponse,\n TRPCResponseMessage,\n TRPCResultMessage,\n} from './rpc';\nimport { isObject } from './utils';\n\n/**\n * A transformer that serializes and deserializes data the same way in\n * both directions, such as `superjson`.\n * @see https://trpc.io/docs/server/data-transformers#datatransformer-interface\n * @public\n */\nexport interface DataTransformer {\n serialize(object: any): any;\n deserialize(object: any): any;\n}\n\ninterface InputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the client** before sending the data to the server.\n */\n serialize(object: any): any;\n /**\n * This function runs **on the server** to transform the data before it is passed to the resolver\n */\n deserialize(object: any): any;\n}\n\ninterface OutputDataTransformer extends DataTransformer {\n /**\n * This function runs **on the server** before sending the data to the client.\n */\n serialize(object: any): any;\n /**\n * This function runs **only on the client** to transform the data sent from the server.\n */\n deserialize(object: any): any;\n}\n\n/**\n * A transformer with one serializer for inputs and another for outputs.\n * @see https://trpc.io/docs/server/data-transformers#different-transformers-for-upload-and-download\n * @public\n */\nexport interface CombinedDataTransformer {\n /**\n * Specify how the data sent from the client to the server should be transformed.\n */\n input: InputDataTransformer;\n /**\n * Specify how the data sent from the server to the client should be transformed.\n */\n output: OutputDataTransformer;\n}\n\n/**\n * The half of a combined transformer the client uses: serializing inputs\n * and deserializing outputs.\n * @public\n */\nexport type CombinedDataTransformerClient = {\n input: Pick<CombinedDataTransformer['input'], 'serialize'>;\n output: Pick<CombinedDataTransformer['output'], 'deserialize'>;\n};\n\n/**\n * A transformer: one for both directions, or separate ones for inputs and\n * outputs.\n * @see https://trpc.io/docs/server/data-transformers\n * @public\n */\nexport type DataTransformerOptions = CombinedDataTransformer | DataTransformer;\n\n/**\n * @internal\n */\nexport function getDataTransformer(\n transformer: DataTransformerOptions,\n): CombinedDataTransformer {\n if ('input' in transformer) {\n return transformer;\n }\n return { input: transformer, output: transformer };\n}\n\n/**\n * @internal\n */\nexport const defaultTransformer: CombinedDataTransformer = {\n input: { serialize: (obj) => obj, deserialize: (obj) => obj },\n output: { serialize: (obj) => obj, deserialize: (obj) => obj },\n};\n\nfunction transformTRPCResponseItem<\n TResponseItem extends TRPCResponse | TRPCResponseMessage,\n>(config: RootConfig<AnyRootTypes>, item: TResponseItem): TResponseItem {\n if ('error' in item) {\n return {\n ...item,\n error: config.transformer.output.serialize(item.error),\n };\n }\n\n if ('data' in item.result) {\n return {\n ...item,\n result: {\n ...item.result,\n data: config.transformer.output.serialize(item.result.data),\n },\n };\n }\n\n return item;\n}\n\n/**\n * Serializes a response, or a list of them, with the router's output\n * transformer. Meant for custom adapters.\n **/\nexport function transformTRPCResponse<\n TResponse extends\n | TRPCResponse\n | TRPCResponse[]\n | TRPCResponseMessage\n | TRPCResponseMessage[],\n>(config: RootConfig<AnyRootTypes>, itemOrItems: TResponse) {\n return Array.isArray(itemOrItems)\n ? itemOrItems.map((item) => transformTRPCResponseItem(config, item))\n : transformTRPCResponseItem(config, itemOrItems);\n}\n\n// FIXME:\n// - the generics here are probably unnecessary\n// - the RPC-spec could probably be simplified to combine HTTP + WS\n/** @internal */\nfunction transformResultInner<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n) {\n if ('error' in response) {\n const error = transformer.deserialize(\n response.error,\n ) as inferRouterError<TRouter>;\n return {\n ok: false,\n error: {\n ...response,\n error,\n },\n } as const;\n }\n\n const result = {\n ...response.result,\n ...((!response.result.type || response.result.type === 'data') && {\n type: 'data',\n data: transformer.deserialize(response.result.data),\n }),\n } as TRPCResultMessage<TOutput>['result'];\n return { ok: true, result } as const;\n}\n\nclass TransformResultError extends Error {\n constructor() {\n super('Unable to transform response from server');\n }\n}\n\n/**\n * Transforms and validates that the result is a valid TRPCResponse\n * @internal\n */\nexport function transformResult<TRouter extends AnyRouter, TOutput>(\n response:\n | TRPCResponse<TOutput, inferRouterError<TRouter>>\n | TRPCResponseMessage<TOutput, inferRouterError<TRouter>>,\n transformer: DataTransformer,\n): ReturnType<typeof transformResultInner> {\n let result: ReturnType<typeof transformResultInner>;\n try {\n // Use the data transformers on the JSON-response\n result = transformResultInner(response, transformer);\n } catch {\n throw new TransformResultError();\n }\n\n // check that output of the transformers is a valid TRPCResponse\n if (\n !result.ok &&\n (!isObject(result.error.error) ||\n typeof result.error.error['code'] !== 'number')\n ) {\n throw new TransformResultError();\n }\n if (result.ok && !isObject(result.result)) {\n throw new TransformResultError();\n }\n return result;\n}\n","import type { Observable } from '../observable';\nimport { createRecursiveProxy } from './createProxy';\nimport { defaultFormatter } from './error/formatter';\nimport { getTRPCErrorFromUnknown, TRPCError } from './error/TRPCError';\nimport type { PathSeparator } from './http/pathSeparator';\nimport type {\n AnyProcedure,\n ErrorHandlerOptions,\n inferProcedureInput,\n inferProcedureOutput,\n LegacyObservableSubscriptionProcedure,\n} from './procedure';\nimport type { ProcedureCallOptions } from './procedureBuilder';\nimport type { AnyRootTypes, RootConfig } from './rootConfig';\nimport { defaultTransformer } from './transformer';\nimport type { MaybePromise, ValueOf } from './types';\nimport {\n emptyObject,\n isFunction,\n isObject,\n mergeWithoutOverrides,\n} from './utils';\n\n/**\n * The procedures and sub-routers of a router, by name.\n */\nexport interface RouterRecord {\n [key: string]: AnyProcedure | RouterRecord;\n}\n\ntype DecorateProcedure<TProcedure extends AnyProcedure> = (\n input: inferProcedureInput<TProcedure>,\n) => Promise<\n TProcedure['_def']['type'] extends 'subscription'\n ? TProcedure extends LegacyObservableSubscriptionProcedure<any>\n ? Observable<inferProcedureOutput<TProcedure>, TRPCError>\n : inferProcedureOutput<TProcedure>\n : inferProcedureOutput<TProcedure>\n>;\n\n/**\n * A router's record with every procedure turned into a function, as a\n * caller has it.\n * @internal\n */\nexport type DecorateRouterRecord<TRecord extends RouterRecord> = {\n [TKey in keyof TRecord]: TRecord[TKey] extends infer $Value\n ? $Value extends AnyProcedure\n ? DecorateProcedure<$Value>\n : $Value extends RouterRecord\n ? DecorateRouterRecord<$Value>\n : never\n : never;\n};\n\n/**\n * Called when a procedure called through a caller throws.\n * @internal\n */\nexport type RouterCallerErrorHandler<TContext> = (\n opts: ErrorHandlerOptions<TContext>,\n) => void;\n\n/**\n * Creates a caller from a context, or from a function that returns one.\n * A function is called on each procedure call, so cache it (for example\n * with `React.cache`).\n * @internal\n */\nexport type RouterCaller<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = (\n ctx: TRoot['ctx'] | (() => MaybePromise<TRoot['ctx']>),\n options?: {\n /** Called when a procedure throws, before the error is rethrown. */\n onError?: RouterCallerErrorHandler<TRoot['ctx']>;\n /**\n * Passed to middleware and resolvers as `signal`. It doesn't stop a\n * call by itself; the resolver has to check it.\n */\n signal?: AbortSignal;\n },\n) => DecorateRouterRecord<TRecord>;\n\n/**\n * @internal\n */\nconst lazyMarker = 'lazyMarker' as 'lazyMarker' & {\n __brand: 'lazyMarker';\n};\n/** A router that `lazy()` loads on its first call. */\nexport type Lazy<TAny> = (() => Promise<TAny>) & { [lazyMarker]: true };\n\ntype LazyLoader<TAny> = {\n load: () => Promise<void>;\n ref: Lazy<TAny>;\n path: readonly string[];\n key: string;\n};\n\nfunction once<T>(fn: () => T): () => T {\n const uncalled = Symbol();\n let result: T | typeof uncalled = uncalled;\n return (): T => {\n if (result === uncalled) {\n result = fn();\n }\n return result;\n };\n}\n\n/**\n * Loads a router on its first call instead of at startup, which can make\n * cold starts faster. Pass a function that imports the router, or a module\n * whose only export is the router.\n * @example\n * ```ts\n * const appRouter = router({\n * slow: lazy(() => import('./slow.js').then((m) => m.slowRouter)),\n * });\n * ```\n * @see https://trpc.io/docs/server/merging-routers#lazy-load\n */\nexport function lazy<TRouter extends AnyRouter>(\n importRouter: () => Promise<\n | TRouter\n | {\n [key: string]: TRouter;\n }\n >,\n): Lazy<NoInfer<TRouter>> {\n async function resolve(): Promise<TRouter> {\n const mod = await importRouter();\n\n // if the module is a router, return it\n if (isRouter(mod)) {\n return mod;\n }\n\n const routers = Object.values(mod);\n\n if (routers.length !== 1 || !isRouter(routers[0])) {\n throw new Error(\n \"Invalid router module - either define exactly 1 export or return the router directly.\\nExample: `lazy(() => import('./slow.js').then((m) => m.slowRouter))`\",\n );\n }\n\n return routers[0];\n }\n\n (resolve as Lazy<NoInfer<TRouter>>)[lazyMarker] = true as const;\n\n return resolve as Lazy<NoInfer<TRouter>>;\n}\n\nfunction isLazy<TAny>(input: unknown): input is Lazy<TAny> {\n return typeof input === 'function' && lazyMarker in input;\n}\n\n/**\n * A router's definition: its config and procedures.\n * @internal\n */\nexport interface RouterDef<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _config: RootConfig<TRoot>;\n router: true;\n procedure?: never;\n procedures: TRecord;\n record: TRecord;\n lazy: Record<string, LazyLoader<AnyRouter>>;\n}\n\n/**\n * A router: procedures and sub-routers under one root config.\n * @see https://trpc.io/docs/server/routers\n */\nexport interface Router<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> {\n _def: RouterDef<TRoot, TRecord>;\n /**\n * Creates a caller, which calls the router's procedures directly on the\n * server, from a context.\n * @see https://trpc.io/docs/server/server-side-calls#routercreatecaller\n */\n createCaller: RouterCaller<TRoot, TRecord>;\n}\n\n/**\n * A router as `t.router()` returns it, with its procedures and sub-routers\n * as properties.\n */\nexport type BuiltRouter<\n TRoot extends AnyRootTypes,\n TRecord extends RouterRecord,\n> = Router<TRoot, TRecord> & TRecord;\n\n/**\n * The type of `t.router()`.\n * @see https://trpc.io/docs/server/routers\n */\nexport interface RouterBuilder<TRoot extends AnyRootTypes> {\n <TIn extends CreateRouterOptions>(\n _: TIn,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TIn>>;\n}\n\n/** Any router, for use in generic constraints. */\nexport type AnyRouter = Router<any, any>;\n\n/** A router's root types: its context, metadata, error shape and transformer. */\nexport type inferRouterRootTypes<TRouter extends AnyRouter> =\n TRouter['_def']['_config']['$types'];\n\n/** The type of a router's context. */\nexport type inferRouterContext<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['ctx'];\n/**\n * The shape of a router's errors, as its error formatter returns them.\n * @see https://trpc.io/docs/server/error-formatting\n */\nexport type inferRouterError<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['errorShape'];\n/**\n * The type of a router's metadata.\n * @see https://trpc.io/docs/server/metadata\n */\nexport type inferRouterMeta<TRouter extends AnyRouter> =\n inferRouterRootTypes<TRouter>['meta'];\n\nfunction isRouter(value: unknown): value is AnyRouter {\n return (\n isObject(value) && isObject(value['_def']) && 'router' in value['_def']\n );\n}\n\nconst emptyRouter = {\n _ctx: null as any,\n _errorShape: null as any,\n _meta: null as any,\n queries: {},\n mutations: {},\n subscriptions: {},\n errorFormatter: defaultFormatter,\n transformer: defaultTransformer,\n};\n\n/**\n * Reserved words that can't be used as router or procedure names\n */\nconst reservedWords = [\n /**\n * Then is a reserved word because otherwise we can't return a promise that returns a Proxy\n * since JS will think that `.then` is something that exists\n */\n 'then',\n /**\n * `fn.call()` and `fn.apply()` are reserved words because otherwise we can't call a function using `.call` or `.apply`\n */\n 'call',\n 'apply',\n];\n\n/**\n * What `t.router()` takes: procedures, routers, lazy routers and nested\n * objects of them, by name.\n * @internal\n */\nexport type CreateRouterOptions = {\n [key: string]:\n | AnyProcedure\n | AnyRouter\n | CreateRouterOptions\n | Lazy<AnyRouter>;\n};\n\n/**\n * The record of the router `t.router()` builds from its options.\n * @internal\n */\nexport type DecorateCreateRouterOptions<\n TRouterOptions extends CreateRouterOptions,\n> = {\n [K in keyof TRouterOptions]: TRouterOptions[K] extends infer $Value\n ? $Value extends AnyProcedure\n ? $Value\n : $Value extends Router<any, infer TRecord>\n ? TRecord\n : $Value extends Lazy<Router<any, infer TRecord>>\n ? TRecord\n : $Value extends CreateRouterOptions\n ? DecorateCreateRouterOptions<$Value>\n : never\n : never;\n};\n\nfunction getRouterInput(router: AnyRouter) {\n const input = Object.assign(\n emptyObject<CreateRouterOptions>(),\n router._def.record,\n );\n\n for (const loader of Object.values(router._def.lazy)) {\n let record = input;\n for (const key of loader.path) {\n record = record[key] = Object.assign(\n emptyObject<CreateRouterOptions>(),\n record[key],\n );\n }\n record[loader.key] = loader.ref;\n }\n\n return input;\n}\n\n/**\n * @internal\n */\nexport function createRouterFactory<TRoot extends AnyRootTypes>(\n config: RootConfig<TRoot>,\n) {\n function createRouterInner<TInput extends CreateRouterOptions>(\n input: TInput,\n ): BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>> {\n const reservedWordsUsed = new Set(\n Object.keys(input).filter((v) => reservedWords.includes(v)),\n );\n if (reservedWordsUsed.size > 0) {\n throw new Error(\n 'Reserved words used in `router({})` call: ' +\n Array.from(reservedWordsUsed).join(', '),\n );\n }\n\n const procedures: Record<string, AnyProcedure> = emptyObject();\n const lazy: Record<string, LazyLoader<AnyRouter>> = emptyObject();\n\n function createLazyLoader(opts: {\n ref: Lazy<AnyRouter>;\n path: readonly string[];\n key: string;\n aggregate: RouterRecord;\n }): LazyLoader<AnyRouter> {\n return {\n ref: opts.ref,\n path: opts.path,\n key: opts.key,\n load: once(async () => {\n const router = await opts.ref();\n const lazyPath = [...opts.path, opts.key];\n const lazyKey = lazyPath.join('.');\n\n opts.aggregate[opts.key] = step(getRouterInput(router), lazyPath);\n\n delete lazy[lazyKey];\n }),\n };\n }\n\n const separator = config.pathSeparator;\n\n function step(from: CreateRouterOptions, path: readonly string[] = []) {\n const aggregate: RouterRecord = emptyObject();\n for (const [key, item] of Object.entries(from ?? {})) {\n if (separator !== '.' && key.includes(separator)) {\n // The URL `a_b_c` couldn't say which `_` splits a segment\n throw new Error(\n `Key \"${[...path, key].join('.')}\" contains the pathSeparator ${JSON.stringify(separator)}, so its URL would be ambiguous. Rename it or pick another pathSeparator.`,\n );\n }\n if (isLazy(item)) {\n lazy[[...path, key].join('.')] = createLazyLoader({\n path,\n ref: item,\n key,\n aggregate,\n });\n continue;\n }\n if (isRouter(item)) {\n aggregate[key] = step(getRouterInput(item), [...path, key]);\n continue;\n }\n if (!isProcedure(item)) {\n // RouterRecord\n aggregate[key] = step(item, [...path, key]);\n continue;\n }\n\n const newPath = [...path, key].join('.');\n\n if (procedures[newPath]) {\n throw new Error(`Duplicate key: ${newPath}`);\n }\n\n procedures[newPath] = item;\n aggregate[key] = item;\n }\n\n return aggregate;\n }\n const record = step(input);\n\n const _def: AnyRouter['_def'] = {\n _config: config,\n router: true,\n procedures,\n lazy,\n ...emptyRouter,\n record,\n };\n\n const router: BuiltRouter<TRoot, {}> = {\n ...(record as {}),\n _def,\n createCaller: createCallerFactory<TRoot>()({\n _def,\n }),\n };\n return router as BuiltRouter<TRoot, DecorateCreateRouterOptions<TInput>>;\n }\n\n return createRouterInner;\n}\n\nfunction isProcedure(\n procedureOrRouter: ValueOf<CreateRouterOptions>,\n): procedureOrRouter is AnyProcedure {\n return typeof procedureOrRouter === 'function';\n}\n\n/**\n * @internal\n */\nexport async function getProcedureAtPath(\n router: Pick<Router<any, any>, '_def'>,\n path: string,\n): Promise<AnyProcedure | null> {\n const { _def } = router;\n let procedure = _def.procedures[path];\n\n while (!procedure) {\n const key = Object.keys(_def.lazy).find(\n (key) => path === key || path.startsWith(key + '.'),\n );\n // console.log(`found lazy: ${key ?? 'NOPE'} (fullPath: ${fullPath})`);\n\n if (!key) {\n return null;\n }\n // console.log('loading', key, '.......');\n // oxlint-disable-next-line typescript/no-non-null-assertion\n const lazyRouter = _def.lazy[key]!;\n await lazyRouter.load();\n\n procedure = _def.procedures[path];\n }\n\n return procedure;\n}\n\n/**\n * Calls the procedure at `path`, throwing `NOT_FOUND` if there's none of\n * that type.\n * @internal\n */\nexport async function callProcedure(\n opts: ProcedureCallOptions<unknown> & {\n router: AnyRouter;\n allowMethodOverride?: boolean;\n },\n) {\n const { type, path } = opts;\n const proc = await getProcedureAtPath(opts.router, path);\n if (\n !proc ||\n !isProcedure(proc) ||\n (proc._def.type !== type && !opts.allowMethodOverride)\n ) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No \"${type}\"-procedure on path \"${path}\"`,\n });\n }\n\n /* istanbul ignore if -- @preserve */\n if (\n proc._def.type !== type &&\n opts.allowMethodOverride &&\n proc._def.type === 'subscription'\n ) {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message: `Method override is not supported for subscriptions`,\n });\n }\n\n return proc(opts);\n}\n\n/**\n * The type of `t.createCallerFactory()`: takes a router and returns its\n * `createCaller`.\n * @see https://trpc.io/docs/server/server-side-calls#create-caller\n */\nexport interface RouterCallerFactory<TRoot extends AnyRootTypes> {\n <TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord>;\n}\n\nexport function createCallerFactory<\n TRoot extends AnyRootTypes,\n>(): RouterCallerFactory<TRoot> {\n return function createCallerInner<TRecord extends RouterRecord>(\n router: Pick<Router<TRoot, TRecord>, '_def'>,\n ): RouterCaller<TRoot, TRecord> {\n const { _def } = router;\n type Context = TRoot['ctx'];\n\n return function createCaller(ctxOrCallback, opts) {\n return createRecursiveProxy<ReturnType<RouterCaller<any, any>>>(\n async (innerOpts) => {\n const { path, args } = innerOpts;\n const fullPath = path.join('.');\n\n if (path.length === 1 && path[0] === '_def') {\n return _def;\n }\n\n const procedure = await getProcedureAtPath(router, fullPath);\n\n let ctx: Context | undefined = undefined;\n try {\n if (!procedure) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No procedure found on path \"${path}\"`,\n });\n }\n ctx = isFunction(ctxOrCallback)\n ? await Promise.resolve(ctxOrCallback())\n : ctxOrCallback;\n\n return await procedure({\n path: fullPath,\n getRawInput: async () => args[0],\n ctx,\n type: procedure._def.type,\n signal: opts?.signal,\n batchIndex: 0,\n });\n } catch (cause) {\n opts?.onError?.({\n ctx,\n error: getTRPCErrorFromUnknown(cause),\n input: args[0],\n path: fullPath,\n type: procedure?._def.type ?? 'unknown',\n });\n throw cause;\n }\n },\n );\n };\n };\n}\n\n/**\n * The router `t.mergeRouters()` returns.\n * @internal\n */\nexport type MergeRouters<\n TRouters extends AnyRouter[],\n TRoot extends AnyRootTypes = TRouters[0]['_def']['_config']['$types'],\n TRecord extends RouterRecord = {},\n> = TRouters extends [\n infer Head extends AnyRouter,\n ...infer Tail extends AnyRouter[],\n]\n ? MergeRouters<Tail, TRoot, Head['_def']['record'] & TRecord>\n : BuiltRouter<TRoot, TRecord>;\n\nexport function mergeRouters<TRouters extends AnyRouter[]>(\n ...routerList: [...TRouters]\n): MergeRouters<TRouters> {\n const record = mergeWithoutOverrides(\n {},\n ...[...new Set(routerList)].map((r) => getRouterInput(r)),\n );\n const errorFormatter = routerList.reduce(\n (currentErrorFormatter, nextRouter) => {\n if (\n nextRouter._def._config.errorFormatter &&\n nextRouter._def._config.errorFormatter !== defaultFormatter\n ) {\n if (\n currentErrorFormatter !== defaultFormatter &&\n currentErrorFormatter !== nextRouter._def._config.errorFormatter\n ) {\n throw new Error('You seem to have several error formatters');\n }\n return nextRouter._def._config.errorFormatter;\n }\n return currentErrorFormatter;\n },\n defaultFormatter,\n );\n\n const transformer = routerList.reduce((prev, current) => {\n if (\n current._def._config.transformer &&\n current._def._config.transformer !== defaultTransformer\n ) {\n if (\n prev !== defaultTransformer &&\n prev !== current._def._config.transformer\n ) {\n throw new Error('You seem to have several transformers');\n }\n return current._def._config.transformer;\n }\n return prev;\n }, defaultTransformer);\n\n const pathSeparator = routerList.reduce<PathSeparator>((prev, current) => {\n const next = current._def._config.pathSeparator;\n if (next === '.') {\n return prev;\n }\n if (prev !== '.' && prev !== next) {\n throw new Error('You seem to have several pathSeparators');\n }\n return next;\n }, '.');\n\n const router = createRouterFactory({\n errorFormatter,\n transformer,\n pathSeparator,\n isDev: routerList.every((r) => r._def._config.isDev),\n allowOutsideOfServer: routerList.every(\n (r) => r._def._config.allowOutsideOfServer,\n ),\n isServer: routerList.every((r) => r._def._config.isServer),\n $types: routerList[0]?._def._config.$types,\n sse: routerList[0]?._def._config.sse,\n })(record);\n\n return router as MergeRouters<TRouters>;\n}\n","/**\n * The character between a procedure path's segments in HTTP URLs, such as\n * the `~` in `/trpc/post~byId`. Procedure paths stay dotted everywhere else:\n * in middlewares, errors, `onError` and query keys.\n *\n * These are the URL \"unreserved\" punctuation characters (RFC 3986), which\n * are never percent-encoded or normalised and mean nothing to routers. `/`\n * would need catch-all routes in every adapter, and `,` separates batched\n * calls.\n */\nexport type PathSeparator = '.' | '_' | '~' | '-';\n\n/**\n * Applies the `'.'` default to a user-given `pathSeparator` option. Call it\n * once, where the option is read.\n * @internal\n */\nexport function resolvePathSeparator(\n value: PathSeparator | undefined,\n): PathSeparator {\n return value ?? '.';\n}\n\n/**\n * `post.byId` → `post~byId`, for building URLs.\n * @internal\n */\nexport function procedurePathToURLPath(\n path: string,\n separator: PathSeparator,\n): string {\n if (separator === '.') {\n return path;\n }\n return path.split('.').join(separator);\n}\n\n/**\n * `post~byId` → `post.byId`, for reading URLs. Dotted paths still resolve,\n * so clients can move to the separator after the server does.\n * @internal\n */\nexport function urlPathToProcedurePath(\n path: string,\n separator: PathSeparator,\n): string {\n if (separator === '.') {\n return path;\n }\n return path.split(separator).join('.');\n}\n","const trackedSymbol = Symbol();\n\ntype TrackedId = string & {\n __brand: 'TrackedId';\n};\n/** An event wrapped by `tracked()`, with its id. */\nexport type TrackedEnvelope<TData> = [TrackedId, TData, typeof trackedSymbol];\n\n/** A tracked event as the client gets it. */\nexport interface TrackedData<TData> {\n /**\n * The event's id, which the client sends back as `lastEventId` when it\n * reconnects.\n */\n id: string;\n /**\n * The event's data.\n */\n data: TData;\n}\n/**\n * Wraps an event with an id, so a client can resume from it.\n * @deprecated Use `tracked(id, data)` instead.\n */\nexport function sse<TData>(event: { id: string; data: TData }) {\n return tracked(event.id, event.data);\n}\n\n/** Whether a value was made by `tracked()`. */\nexport function isTrackedEnvelope<TData>(\n value: unknown,\n): value is TrackedEnvelope<TData> {\n return Array.isArray(value) && value[2] === trackedSymbol;\n}\n\n/**\n * Gives a subscription event an id. When the connection drops, the client\n * reconnects with the last id it got, as `input.lastEventId`, so the\n * subscription can resume from there. The id can't be empty.\n * @example\n * ```ts\n * yield tracked(post.id, post);\n * ```\n * @see https://trpc.io/docs/server/subscriptions#tracked\n */\nexport function tracked<TData>(\n id: string,\n data: TData,\n): TrackedEnvelope<TData> {\n if (id === '') {\n // This limitation could be removed by using different SSE event names / channels for tracked event and non-tracked event\n throw new Error(\n '`id` must not be an empty string as empty string is the same as not setting the id at all',\n );\n }\n if (/[\\0\\n\\r]/.test(id)) {\n throw new Error(\n '`id` must not contain line breaks or null characters as they are not allowed in a Server-Sent Events id',\n );\n }\n return [id as TrackedId, data, trackedSymbol];\n}\n\n/** The type a client gets for an event, unwrapping `tracked()` events. */\nexport type inferTrackedOutput<TData> =\n TData extends TrackedEnvelope<infer $Data> ? TrackedData<$Data> : TData;\n"],"mappings":"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"}