Compare commits

...

49 Commits

Author SHA1 Message Date
wobsoriano
4f7fbbe108 chore: release v0.10.2 2023-05-15 09:03:34 -07:00
wobsoriano
c32fdf7893 feat: allow providing a transform output type 2023-05-15 09:00:04 -07:00
wobsoriano
10bc1d3a4d chore: release v0.10.1 2023-05-12 13:09:29 -07:00
wobsoriano
7bd62822d3 remove nuxt from peer deps 2023-05-12 13:09:24 -07:00
wobsoriano
967271089f fix docs build 2023-05-12 11:28:07 -07:00
wobsoriano
169c6aa534 chore: release v0.10.0 2023-05-12 11:26:02 -07:00
wobsoriano
2d025788ce feat(deps): add nuxt as a peer dependeny 2023-05-12 11:24:29 -07:00
wobsoriano
4af2b2ef3f feat(deps): bump @trpc/client and @trpc/server to 10.26.0 2023-05-12 11:20:45 -07:00
wobsoriano
ae0b7824f4 fix: asyncData types 2023-05-12 11:19:37 -07:00
wobsoriano
4339bf5059 fix: transform types 2023-05-12 11:07:44 -07:00
wobsoriano
252e2261e9 update pnpm nuxt overrides 2023-05-12 10:58:47 -07:00
wobsoriano
40eaf44f39 bump local deps 2023-05-12 10:42:46 -07:00
wobsoriano
ad827bb716 chore: release v0.9.0 2023-04-14 13:06:07 -07:00
wobsoriano
08125cbf0c fix types 2023-04-14 13:05:53 -07:00
wobsoriano
fb5723b071 feat(deps): bump @trpc/client and @trpc/server to 10.20.0 2023-04-14 11:13:38 -07:00
wobsoriano
8c35279cc2 bump local deps 2023-04-14 11:12:30 -07:00
Robert Soriano
61a5bcd2ee Merge pull request #88 from Colonel-Sandvich/next
Update `HTTPLinkOptions` import
2023-04-14 08:27:22 -07:00
Colonel-Sandvich
eaeab1565d Update HTTPLinkOptions import 2023-04-14 16:18:27 +01:00
Robert Soriano
e7453bfc70 Merge pull request #86 from danielroe/fix/github-module
fix: use latest `@nuxtlabs/github` module
2023-04-13 16:19:14 -07:00
Daniel Roe
54ef27d524 fix: use latest @nuxtlabs/github module 2023-04-13 23:54:49 +01:00
Robert Soriano
38d83dac34 Merge pull request #83 from CRBroughton/trpc-10.19.1
chore: bump dependencies for nuxt 3.3.3 + devtools 0.3.2
2023-04-07 20:37:57 -07:00
CRBroughton
0f7e52248f chore: bump dependencies for nuxt 3.3.3 2023-04-07 21:38:55 +01:00
wobsoriano
be55641338 fix: trpc-nuxt docs 2023-04-03 16:04:08 -07:00
wobsoriano
6ba6e70b92 chore: release v0.8.0 2023-03-27 22:55:56 -07:00
wobsoriano
b710f809c7 bump local deps 2023-03-27 22:54:26 -07:00
Robert Soriano
4f647afa36 Merge pull request #80 from CRBroughton/nuxt-3.2.2-support 2023-03-27 21:25:00 -07:00
CRBroughton
1defbe5954 chore: upgrade dependencies for nuxt 3.2.2 2023-03-27 21:48:14 +01:00
Robert Soriano
fa6ba65d35 Merge pull request #76 from robinWongM/hotfix/subscribe-not-working
fix: pass all arguments to proxied trpc client method
2023-03-18 13:56:08 -07:00
Robert Soriano
d4af221e89 Merge pull request #75 from kedniko/patch-1
Update 2.recommended.md
2023-03-18 13:55:45 -07:00
Robin Wong
6595a1d306 fix: pass all arguments to proxied trpc client method 2023-03-18 03:15:49 +08:00
kedniko
b506cd5f14 Update 2.recommended.md 2023-03-10 18:31:26 +01:00
wobsoriano
7a69573fb9 chore: release v0.7.0 2023-02-20 09:18:07 -08:00
wobsoriano
8e26e781d4 fix type errors 2023-02-20 09:18:03 -08:00
wobsoriano
8efb63e70c bump tsup to 6.6.3 2023-02-20 09:09:10 -08:00
wobsoriano
4f6c07b0a1 feat(deps): require trpc >10.12.0 2023-02-20 09:08:44 -08:00
wobsoriano
aa3fe5527d feat(deps): bump ufo to 1.1.0 2023-02-20 09:07:44 -08:00
wobsoriano
6f17913eab feat(deps): bump ofetch to 1.0.1 2023-02-20 09:07:18 -08:00
wobsoriano
d6c60cb2b3 feat(deps): bump h3 to 1.5.0 2023-02-20 09:06:56 -08:00
wobsoriano
76fbd59525 chore: release v0.6.0 2023-02-04 21:01:26 -08:00
wobsoriano
57faf8749a feat(deps): bump h3 to 1.1.0 2023-02-04 21:00:25 -08:00
wobsoriano
9456342d58 remove unused deps 2023-02-04 20:59:51 -08:00
wobsoriano
f89c8e44ef feat(deps): bump @trpc/client and @trpc/server to 10.10.0 2023-02-04 20:59:39 -08:00
wobsoriano
7f156806d8 add Acknowledgements section 2023-02-01 08:49:10 -08:00
wobsoriano
bd33589d2f add funding.yml 2023-01-31 20:03:14 -08:00
Robert Soriano
16b6ed315a Merge pull request #68 from CodyBontecou/patch-1
Update 1.simple.md
2023-01-25 22:42:38 -05:00
Cody Bontecou
6e74e44233 Update 1.simple.md
Updated to use destructuring syntax.
2023-01-25 15:18:16 -10:00
Cody Bontecou
6485aa42a7 Update 1.simple.md
Walking through the setup with Nuxt v3.1.0 requires accessing `.value` within the template.
2023-01-25 13:00:50 -10:00
Robert Soriano
051d5bb325 Update 1.composables.md 2023-01-09 10:33:17 -08:00
Robert Soriano
b7d4dc7642 Update 1.composables.md 2023-01-09 10:33:07 -08:00
15 changed files with 3893 additions and 2655 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: wobsoriano

View File

@@ -27,6 +27,10 @@ For version 3 of this module (tRPC v9, auto-imports, auto handlers), [go here](h
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar)
## Acknowledgements
Huge thanks to [Alex / KATT](https://github.com/KATT), the author of [tRPC](https://trpc.io/), for being the first sponsor of this project! 🎉
## License ## License
MIT MIT

View File

@@ -107,12 +107,12 @@ export default defineNuxtPlugin(() => {
<script setup lang="ts"> <script setup lang="ts">
const { $client } = useNuxtApp() const { $client } = useNuxtApp()
const hello = await $client.hello.useQuery({ text: 'client' }) const { data: hello } = await $client.hello.useQuery({ text: 'client' })
</script> </script>
<template> <template>
<div> <div>
<p>{{ hello.data?.greeting }}</p> <p>{{ hello?.greeting }}</p>
</div> </div>
</template> </template>
``` ```

View File

@@ -96,7 +96,7 @@ import { inferAsyncReturnType } from '@trpc/server'
* Creates context for an incoming request * Creates context for an incoming request
* @link https://trpc.io/docs/context * @link https://trpc.io/docs/context
*/ */
export const createContext = () => {} export const createContext = () => ({})
export type Context = inferAsyncReturnType<typeof createContext>; export type Context = inferAsyncReturnType<typeof createContext>;
``` ```

View File

@@ -7,7 +7,7 @@ title: Composables
It is often useful to wrap functionality of your `@trpc/client` api within other functions. For this purpose, it's necessary to be able to infer input types and output types generated by your `@trpc/server` router. It is often useful to wrap functionality of your `@trpc/client` api within other functions. For this purpose, it's necessary to be able to infer input types and output types generated by your `@trpc/server` router.
::alert{type="info"} ::alert{type="info"}
[createTRPCNuxtClient](/get-started/client/create) adds a `useQuery` method built on top of [useAsyncData](https://nuxt.com/docs/api/composables/use-async-data/). [createTRPCNuxtClient](/get-started/client/create) already adds a `useQuery` method built on top of [useAsyncData](https://nuxt.com/docs/api/composables/use-async-data/). You might not need this.
:: ::
## Inference Helpers ## Inference Helpers

View File

@@ -8,10 +8,10 @@
"preview": "nuxi preview" "preview": "nuxi preview"
}, },
"dependencies": { "dependencies": {
"nuxt": "^3.0.0" "nuxt": "3.4.3"
}, },
"devDependencies": { "devDependencies": {
"@nuxt-themes/docus": "^1.1.10", "@nuxt-themes/docus": "^1.11.1",
"@nuxtlabs/github-module": "^1.5.4" "@nuxtlabs/github-module": "^1.6.3"
} }
} }

View File

@@ -2,8 +2,8 @@
"name": "trpc-nuxt", "name": "trpc-nuxt",
"description": "End-to-end typesafe APIs in Nuxt applications.", "description": "End-to-end typesafe APIs in Nuxt applications.",
"type": "module", "type": "module",
"packageManager": "pnpm@7.18.2", "packageManager": "pnpm@7.32.4",
"version": "0.5.0", "version": "0.10.2",
"license": "MIT", "license": "MIT",
"sideEffects": false, "sideEffects": false,
"exports": { "exports": {
@@ -25,7 +25,7 @@
"client.d.ts" "client.d.ts"
], ],
"scripts": { "scripts": {
"dev": "concurrently \"pnpm build --watch\" \"pnpm --filter playground dev\"", "dev": "tsup --watch --onSuccess \"pnpm --filter playground dev\"",
"dev:prepare": "pnpm build && nuxt prepare playground", "dev:prepare": "pnpm build && nuxt prepare playground",
"prepublishOnly": "pnpm build", "prepublishOnly": "pnpm build",
"build": "tsup", "build": "tsup",
@@ -35,25 +35,24 @@
"update-deps": "taze -w && pnpm i" "update-deps": "taze -w && pnpm i"
}, },
"peerDependencies": { "peerDependencies": {
"@trpc/client": "^10.8.0", "@trpc/client": "^10.26.0",
"@trpc/server": "^10.8.0" "@trpc/server": "^10.26.0"
}, },
"dependencies": { "dependencies": {
"h3": "^1.0.2", "h3": "^1.6.5",
"ofetch": "^1.0.0", "ofetch": "^1.0.1",
"ohash": "^1.0.0", "ohash": "^1.1.2",
"ufo": "^1.0.1" "ufo": "^1.1.2"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/eslint-config": "^0.1.1", "@nuxt/eslint-config": "^0.1.1",
"@trpc/client": "^10.8.1", "@trpc/client": "^10.26.0",
"@trpc/server": "^10.8.1", "@trpc/server": "^10.26.0",
"bumpp": "^8.2.1", "bumpp": "^9.1.0",
"concurrently": "^7.6.0", "eslint": "^8.40.0",
"eslint": "^8.30.0", "taze": "^0.10.1",
"taze": "^0.8.5", "tsup": "6.7.0",
"tsup": "6.4.0", "typescript": "^5.0.4"
"typescript": "^4.9.4"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [
@@ -76,7 +75,7 @@
], ],
"pnpm": { "pnpm": {
"overrides": { "overrides": {
"nuxt": "3.0.0" "nuxt": "3.4.3"
} }
}, },
"engines": { "engines": {

View File

@@ -9,13 +9,14 @@
"postinstall": "nuxt prepare" "postinstall": "nuxt prepare"
}, },
"dependencies": { "dependencies": {
"@trpc/client": "^10.8.1", "@trpc/client": "^10.26.0",
"@trpc/server": "^10.8.1", "@trpc/server": "^10.26.0",
"superjson": "^1.12.1", "superjson": "^1.12.3",
"trpc-nuxt": "workspace:*", "trpc-nuxt": "workspace:*",
"zod": "^3.20.2" "zod": "^3.21.4"
}, },
"devDependencies": { "devDependencies": {
"nuxt": "^3.0.0" "@types/node": "^18.16.8",
"nuxt": "3.4.3"
} }
} }

View File

@@ -1,4 +1,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { TRPCClientError, TRPCClientErrorLike } from '@trpc/client'
import type { inferRouterOutputs } from '@trpc/server'
import type { AppRouter } from '@/server/trpc/routers'
type RouterOutput = inferRouterOutputs<AppRouter>
type GetTodosOutput = RouterOutput['todo']['getTodos']
type ErrorOutput = TRPCClientError<AppRouter>
const { $client } = useNuxtApp() const { $client } = useNuxtApp()
const addTodo = async () => { const addTodo = async () => {

View File

@@ -8,8 +8,8 @@ const { data: todo, pending, error } = await useAsyncData(() => $client.todo.get
<div v-if="pending"> <div v-if="pending">
Loading... Loading...
</div> </div>
<div v-else-if="error?.data?.code"> <div v-else-if="error">
{{ error.data.code }} {{ error.message }} - {{ error.cause }}
</div> </div>
<div v-else> <div v-else>
ID: {{ todo?.id }} <br> ID: {{ todo?.id }} <br>

6434
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -61,7 +61,7 @@ export function createNuxtProxyDecoration<TRouter extends AnyRouter> (name: stri
}), asyncDataOptions) }), asyncDataOptions)
} }
return (client as any)[path][lastArg](input) return (client as any)[path][lastArg](...args)
}) })
} }
@@ -69,7 +69,7 @@ export function createTRPCNuxtClient<TRouter extends AnyRouter> (opts: CreateTRP
const client = createTRPCProxyClient<TRouter>(opts) const client = createTRPCProxyClient<TRouter>(opts)
const decoratedClient = createFlatProxy((key) => { const decoratedClient = createFlatProxy((key) => {
return createNuxtProxyDecoration(key, client) return createNuxtProxyDecoration(key, client as any)
}) as DecoratedProcedureRecord<TRouter['_def']['record'], TRouter> }) as DecoratedProcedureRecord<TRouter['_def']['record'], TRouter>
return decoratedClient return decoratedClient

View File

@@ -3,9 +3,10 @@ import { type AnyRouter } from '@trpc/server'
import { FetchError } from 'ofetch' import { FetchError } from 'ofetch'
// @ts-expect-error: Nuxt auto-imports // @ts-expect-error: Nuxt auto-imports
import { useRequestHeaders } from '#imports' import { useRequestHeaders } from '#imports'
import { type HTTPLinkOptions as _HTTPLinkOptions } from '@trpc/client/dist/links/internals/httpUtils' import { type HTTPLinkOptions as _HTTPLinkOptions } from '@trpc/client/dist/links/httpLink'
import { type FetchEsque } from '@trpc/client/dist/internals/types'
function customFetch(input: RequestInfo | URL, init?: RequestInit) { function customFetch(input: RequestInfo | URL, init?: RequestInit & { method: 'GET' }) {
return globalThis.$fetch.raw(input.toString(), init) return globalThis.$fetch.raw(input.toString(), init)
.catch((e) => { .catch((e) => {
if (e instanceof FetchError && e.response) { return e.response } if (e instanceof FetchError && e.response) { return e.response }
@@ -43,7 +44,7 @@ export function httpLink<TRouter extends AnyRouter>(opts?: HTTPLinkOptions) {
headers () { headers () {
return headers return headers
}, },
fetch: customFetch, fetch: customFetch as FetchEsque,
...opts, ...opts,
}) })
} }
@@ -69,10 +70,11 @@ export function httpBatchLink<TRouter extends AnyRouter>(opts?: HttpBatchLinkOpt
return _httpBatchLink<TRouter>({ return _httpBatchLink<TRouter>({
url: '/api/trpc', url: '/api/trpc',
// @ts-expect-error: Missing property from batchLink. Fix this later.
headers () { headers () {
return headers return headers
}, },
fetch: customFetch, fetch: customFetch as FetchEsque,
...opts, ...opts,
}) })
} }

View File

@@ -16,9 +16,8 @@ import { inferTransformedProcedureOutput } from '@trpc/server/shared'
import type { import type {
AsyncData, AsyncData,
AsyncDataOptions, AsyncDataOptions,
KeyOfRes, KeysOf,
PickFrom, PickFrom,
_Transform
} from 'nuxt/dist/app/composables/asyncData' } from 'nuxt/dist/app/composables/asyncData'
interface TRPCRequestOptions extends _TRPCRequestOptions { interface TRPCRequestOptions extends _TRPCRequestOptions {
@@ -51,13 +50,14 @@ type DecorateProcedure<
> = TProcedure extends AnyQueryProcedure > = TProcedure extends AnyQueryProcedure
? { ? {
useQuery: < useQuery: <
TData = inferTransformedProcedureOutput<TProcedure>, ResT = inferTransformedProcedureOutput<TProcedure>,
Transform extends _Transform<TData> = _Transform<TData, TData>, DataE = TRPCClientErrorLike<TProcedure>,
PickKeys extends KeyOfRes<Transform> = KeyOfRes<Transform>, DataT = ResT,
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
>( >(
input: inferProcedureInput<TProcedure>, input: inferProcedureInput<TProcedure>,
opts?: AsyncDataOptions<TData, Transform, PickKeys> & { trpc?: TRPCRequestOptions }, opts?: AsyncDataOptions<ResT, DataT, PickKeys> & { trpc?: TRPCRequestOptions },
) => AsyncData<PickFrom<ReturnType<Transform>, PickKeys>, TRPCClientErrorLike<TProcedure>>, ) => AsyncData<PickFrom<DataT, PickKeys>, DataE>,
query: Resolver<TProcedure> query: Resolver<TProcedure>
} : TProcedure extends AnyMutationProcedure ? { } : TProcedure extends AnyMutationProcedure ? {
mutate: Resolver<TProcedure> mutate: Resolver<TProcedure>

View File

@@ -50,9 +50,13 @@ export interface ResolveHTTPRequestOptions<TRouter extends AnyRouter> {
} }
function getPath (event: H3Event): string | null { function getPath (event: H3Event): string | null {
if (typeof event.context.params.trpc === 'string') { return event.context.params.trpc } const { params } = event.context
if (Array.isArray(event.context.params.trpc)) { return event.context.params.trpc.join('/') } if (typeof params?.trpc === 'string') { return params.trpc }
if (params?.trpc && Array.isArray(params.trpc)) {
return (params.trpc as string[]).join('/')
}
return null return null
} }