diff --git a/playground/pages/cookie.vue b/playground/pages/cookie.vue new file mode 100644 index 0000000..13a39dc --- /dev/null +++ b/playground/pages/cookie.vue @@ -0,0 +1,19 @@ + + + diff --git a/playground/server/trpc/index.ts b/playground/server/trpc/index.ts index 5e01569..b1cebd8 100644 --- a/playground/server/trpc/index.ts +++ b/playground/server/trpc/index.ts @@ -1,5 +1,8 @@ import * as trpc from '@trpc/server' +import type { inferAsyncReturnType } from '@trpc/server' import { z } from 'zod' +import type { CompatibilityEvent } from 'h3' +import { useCookies } from 'h3' const baseURL = 'https://jsonplaceholder.typicode.com' @@ -12,7 +15,7 @@ const TodoShape = z.object({ export type Todo = z.infer -export const router = trpc.router() +export const router = trpc.router() .query('getTodos', { async resolve() { return await $fetch(`${baseURL}/todos`) @@ -33,3 +36,18 @@ export const router = trpc.router() }) }, }) + +export async function createContext(event: CompatibilityEvent) { + // Create your context based on the request object + // Will be available as `ctx` in all your resolvers + + // This is just an example of something you'd might want to do in your ctx fn + // const x = useCookies(event) + console.log('Headers', event.req.headers) + + return { + + } +} + + type Context = inferAsyncReturnType diff --git a/src/module.ts b/src/module.ts index 83bb3f8..b9d4d85 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1,8 +1,8 @@ import { fileURLToPath } from 'url' -import { join } from 'pathe' +import { join, resolve } from 'pathe' import { defu } from 'defu' -import { addServerHandler, addTemplate, defineNuxtModule } from '@nuxt/kit' +import { addPluginTemplate, addServerHandler, addTemplate, defineNuxtModule } from '@nuxt/kit' export interface ModuleOptions { baseURL: string @@ -48,18 +48,22 @@ export default defineNuxtModule({ write: true, getContents() { return ` - import * as trpc from '@trpc/client' - import type { router } from '${trpcOptionsPath}' - - const client = trpc.createTRPCClient({ - url: '${finalConfig.baseURL}${finalConfig.trpcURL}', - }) - - export const useClient = () => client + export const useClient = () => { + const { $client } = useNuxtApp() + return $client + } ` }, }) + addPluginTemplate({ + src: resolve(runtimeDir, 'plugin.ts'), + write: true, + options: { + url: `${finalConfig.baseURL}${finalConfig.trpcURL}`, + }, + }) + addTemplate({ filename: 'trpc-handler.ts', write: true, diff --git a/src/runtime/client.ts b/src/runtime/client.ts index 66c421a..2280e47 100644 --- a/src/runtime/client.ts +++ b/src/runtime/client.ts @@ -9,7 +9,6 @@ import type { ProcedureRecord, inferHandlerInput, inferProcedureInput, inferProc import type { TRPCClientErrorLike } from '@trpc/client' import { objectHash } from 'ohash' import { useAsyncData, useState } from '#app' -import { useClient } from '#build/trpc-client' // @ts-expect-error: Resolved by Nuxt import type { router } from '~/server/trpc' @@ -38,12 +37,12 @@ export async function useAsyncQuery< pathAndInput: [path: TPath, ...args: inferHandlerInput], options: AsyncDataOptions = {}, ): Promise, PickKeys>, TError>> { - const client = useClient() + const { $client } = useNuxtApp() const key = `${pathAndInput[0]}-${objectHash(pathAndInput[1] ? JSON.stringify(pathAndInput[1]) : '')}` const serverError = useState(`error-${key}`, () => null) const { error, data, ...rest } = await useAsyncData( key, - () => client.query(...pathAndInput), + () => $client.query(...pathAndInput), options, ) diff --git a/src/runtime/plugin.ts b/src/runtime/plugin.ts new file mode 100644 index 0000000..25721df --- /dev/null +++ b/src/runtime/plugin.ts @@ -0,0 +1,18 @@ +import * as trpc from '@trpc/client' +import { defineNuxtPlugin, useRequestHeaders } from '#app' +import type { router } from '~/server/trpc' + +const options = JSON.parse('<%= JSON.stringify(options) %>') + +export default defineNuxtPlugin(() => { + const client = trpc.createTRPCClient({ + url: options.url as string, + headers: useRequestHeaders(), + }) + + return { + provide: { + client, + }, + } +})