- User {{ JSON.stringify(data, null, 2) }}
+
+
diff --git a/playground/pages/index.vue b/playground/pages/index.vue
new file mode 100644
index 0000000..abdede6
--- /dev/null
+++ b/playground/pages/index.vue
@@ -0,0 +1,34 @@
+
+
+
+
+ Loading...
+
+
+ Error: {{ error.data.code }}
+
+
+
+ -
+
+ Title: {{ t.title }}
+
+
+
+
+
+
+
+
diff --git a/playground/pages/todo/[id].vue b/playground/pages/todo/[id].vue
new file mode 100644
index 0000000..6694229
--- /dev/null
+++ b/playground/pages/todo/[id].vue
@@ -0,0 +1,18 @@
+
+
+
+
+ Loading...
+
+
+ {{ error.data.code }}
+
+
+ ID: {{ todo.id }}
+ Title: {{ todo.title }}
+ Completed: {{ todo.completed }}
+
+
diff --git a/playground/server/trpc/index.ts b/playground/server/trpc/index.ts
index dead09a..3119beb 100644
--- a/playground/server/trpc/index.ts
+++ b/playground/server/trpc/index.ts
@@ -1,82 +1,24 @@
-// ~/server/trpc/index.ts
-import { ZodError, z } from 'zod'
import * as trpc from '@trpc/server'
-import type { inferAsyncReturnType } from '@trpc/server'
-import type { CompatibilityEvent } from 'h3'
-import type { ResponseMetaFnPayload } from 'trpc-nuxt/api'
-// import superjson from 'superjson'
+import { z } from 'zod'
-const fakeUsers = [
- { id: 1, username: 'jcena' },
- { id: 2, username: 'dbatista' },
- { id: 3, username: 'jbiden' },
-]
-
-export const router = trpc
- .router
>()
- .formatError(({ shape, error }) => {
- return {
- ...shape,
- data: {
- ...shape.data,
- zodError:
- error.code === 'BAD_REQUEST'
- && error.cause instanceof ZodError
- ? error.cause.flatten()
- : null,
- },
- }
- })
- .query('getUsers', {
- resolve() {
- return fakeUsers
- },
- })
- .query('getUser', {
- // validate input with Zod
- input: z.object({
- username: z.string().min(5),
- }),
- resolve(req) {
- return fakeUsers.find(i => i.username === req.input.username) ?? null
- },
- })
- .mutation('createUser', {
- input: z.object({ username: z.string().min(5) }),
- resolve(req) {
- const newUser = {
- id: fakeUsers.length + 1,
- username: req.input.username,
- }
- fakeUsers.push(newUser)
- return newUser
- },
- })
-
-export const createContext = (event: CompatibilityEvent) => {
- event.res.setHeader('x-ssr', 1)
- return {}
+export interface Todo {
+ userId: number
+ id: number
+ title: string
+ completed: boolean
}
-export const responseMeta = (opts: ResponseMetaFnPayload) => {
- // const nuxtApp = useNuxtApp()
- // const client = useClient()
- // console.log(opts)
+const baseURL = 'https://jsonplaceholder.typicode.com'
- // if (nuxtApp.nuxtState) {
- // nuxtApp.nuxtState.trpc = client.runtime.transformer.serialize({
- // ctx: opts.ctx,
- // errors: opts.errors,
- // })
- // }
- // else {
- // nuxtApp.nuxtState = {
- // trpc: client.runtime.transformer.serialize({
- // ctx: opts.ctx,
- // errors: opts.errors,
- // }),
- // }
- // }
-
- return {}
-}
+export const router = trpc.router()
+ .query('getTodos', {
+ async resolve() {
+ return await $fetch(`${baseURL}/todos`)
+ },
+ })
+ .query('getTodo', {
+ input: z.number(),
+ async resolve(req) {
+ return await $fetch(`${baseURL}/todos/${req.input}`)
+ },
+ })