@falcondev-oss/trpc-vue-query 0.5.4 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -110,6 +110,95 @@ const { mutate: updateGreeting } = useTRPC().hello.update.useMutation({
110
110
  </template>
111
111
  ```
112
112
 
113
+ ### 5. Reactive parameters
114
+
115
+ Input parameters can be refs — the query refetches when they change.
116
+
117
+ ```vue
118
+ <script lang="ts" setup>
119
+ const productId = ref(1)
120
+ const { data: product } = useTRPC().product.getById.useQuery(productId)
121
+ </script>
122
+ ```
123
+
124
+ ## Helpers
125
+
126
+ ### `invalidate()`
127
+
128
+ Invalidate and refetch a query.
129
+
130
+ ```vue
131
+ <script lang="ts" setup>
132
+ const trpc = useTRPC()
133
+ const { mutate: addToCart } = trpc.cart.addProduct.useMutation({
134
+ onSuccess: () => {
135
+ // this will invalidate and refetch the `cart.get` query
136
+ trpc.cart.get.invalidate()
137
+ },
138
+ })
139
+ </script>
140
+ ```
141
+
142
+ ### `setQueryData()`
143
+
144
+ Update the query data manually.
145
+
146
+ ```vue
147
+ <script lang="ts" setup>
148
+ const trpc = useTRPC()
149
+ const { mutate: addToCart } = trpc.cart.addProduct.useMutation({
150
+ onSuccess: (newCart) => {
151
+ // this will update the `cart.get` query data
152
+ trpc.cart.get.setQueryData(newCart)
153
+ },
154
+ })
155
+ </script>
156
+ ```
157
+
158
+ ### `key()`
159
+
160
+ Get the query key. With the key you can access all the other TanStack Query features.
161
+
162
+ ```vue
163
+ <script lang="ts" setup>
164
+ const trpc = useTRPC()
165
+ const cartKey = trpc.cart.get.key()
166
+
167
+ const productKey = trpc.product.getById.key(1)
168
+
169
+ // eg. cancel queries by key:
170
+ const queryClient = useQueryClient()
171
+ await queryClient.cancelQueries({ queryKey: cartKey })
172
+ </script>
173
+ ```
174
+
175
+ ## Operation context
176
+
177
+ Every request made through a vue-query composable (`useQuery`, `useQueries`, `useInfiniteQuery`, `useMutation`, `queryOptions`) is marked with the exported `vueQueryContext` symbol in the tRPC [operation context](https://trpc.io/docs/client/links#managing-context). Plain `query()` / `mutate()` calls are not.
178
+
179
+ The symbol is declaration-merged into tRPC's `OperationContext` interface, so `op.context[vueQueryContext]` is typed inside links.
180
+
181
+ Links can use this to skip handling that vue-query already does, e.g. error toasts coming from the query/mutation cache:
182
+
183
+ ```ts
184
+ import { vueQueryContext } from '@falcondev-oss/trpc-vue-query'
185
+
186
+ const errorToastLink: TRPCLink<AppRouter> =
187
+ () =>
188
+ ({ op, next }) =>
189
+ observable((observer) =>
190
+ next(op).subscribe({
191
+ next: (value) => observer.next(value),
192
+ complete: () => observer.complete(),
193
+ error(err) {
194
+ // vue-query requests are toasted by the query/mutation cache instead
195
+ if (!(vueQueryContext in op.context)) toast.error(err.message)
196
+ observer.error(err)
197
+ },
198
+ }),
199
+ )
200
+ ```
201
+
113
202
  ## Usage with `trpc-nuxt`
114
203
 
115
204
  Setup `trpc-nuxt` as described in their [documentation](https://trpc-nuxt.vercel.app/get-started/usage/recommended). Then update the `plugins/client.ts` file:
package/dist/index.cjs CHANGED
@@ -1,182 +1,131 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- createTRPCVueQueryClient: () => createTRPCVueQueryClient
24
- });
25
- module.exports = __toCommonJS(index_exports);
26
- var import_vue_query = require("@tanstack/vue-query");
27
- var import_client = require("@trpc/client");
28
- var import_server = require("@trpc/server");
29
- var import_unstable_core_do_not_import = require("@trpc/server/unstable-core-do-not-import");
30
- var import_core = require("@vueuse/core");
31
- var import_vue = require("vue");
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let _tanstack_vue_query = require("@tanstack/vue-query");
3
+ let _trpc_client = require("@trpc/client");
4
+ let _trpc_server = require("@trpc/server");
5
+ let _trpc_server_unstable_core_do_not_import = require("@trpc/server/unstable-core-do-not-import");
6
+ let _vueuse_core = require("@vueuse/core");
7
+ let vue = require("vue");
8
+ //#region src/index.ts
32
9
  function getQueryKey(path, input, type) {
33
- const splitPath = path.flatMap((part) => part.split("."));
34
- if (input === void 0 && !type) {
35
- return splitPath.length > 0 ? [splitPath] : [];
36
- }
37
- return [
38
- splitPath,
39
- {
40
- ...input !== void 0 && input !== import_vue_query.skipToken && { input },
41
- ...type && { type }
42
- }
43
- ];
10
+ const splitPath = path.flatMap((part) => part.split("."));
11
+ if (input === void 0 && !type) return splitPath.length > 0 ? [splitPath] : [];
12
+ return [splitPath, {
13
+ ...input !== void 0 && input !== _tanstack_vue_query.skipToken && { input },
14
+ ...type && { type }
15
+ }];
16
+ }
17
+ /**
18
+ * Operation context key marking a request as vue-query-driven.
19
+ * Registered globally via `Symbol.for()`, so it also works across duplicate installs.
20
+ */
21
+ const vueQueryContext = Symbol.for("trpc-vue-query.vueQueryContext");
22
+ function withVueQueryContext(trpcOptions) {
23
+ return {
24
+ ...trpcOptions,
25
+ context: {
26
+ ...trpcOptions?.context,
27
+ [vueQueryContext]: {}
28
+ }
29
+ };
30
+ }
31
+ function splitTRPCOptions(opts) {
32
+ const { trpc: trpcOptions, ...options } = (0, vue.toValue)(opts) || {};
33
+ return {
34
+ trpcOptions,
35
+ options
36
+ };
44
37
  }
45
38
  function maybeToRefs(obj) {
46
- return (0, import_vue.isReactive)(obj) ? (0, import_core.toRefs)(obj) : (0, import_core.toRefs)((0, import_core.toRef)(obj));
39
+ return (0, _vueuse_core.toRefs)((0, vue.isReactive)(obj) ? obj : (0, _vueuse_core.toRef)(obj));
47
40
  }
48
41
  function createVueQueryProxyDecoration(name, trpc, queryClient) {
49
- return (0, import_unstable_core_do_not_import.createRecursiveProxy)(({ args, path: _path }) => {
50
- const path = [name, ..._path];
51
- const prop = path.pop();
52
- const joinedPath = path.join(".");
53
- const [firstArg, ...rest] = args;
54
- const opts = rest[0] || {};
55
- if (prop === "_def") {
56
- return { path };
57
- }
58
- if (prop === "query") {
59
- return trpc.query(joinedPath, firstArg, opts);
60
- }
61
- function createQuery(_input, { trpcOptions, queryOptions }, { type = "query" } = {}) {
62
- const queryFn = (0, import_vue.computed)(
63
- () => (0, import_vue.toValue)(_input) === import_vue_query.skipToken ? import_vue_query.skipToken : async ({ signal }) => {
64
- const input = (0, import_vue.toValue)(_input);
65
- const output = await trpc.query(joinedPath, input, {
66
- signal,
67
- ...trpcOptions
68
- });
69
- if (type === "queries") return { output, input };
70
- return output;
71
- }
72
- );
73
- return (0, import_vue_query.queryOptions)({
74
- queryKey: (0, import_vue.computed)(() => getQueryKey(path, (0, import_vue.toValue)(_input), type)),
75
- queryFn,
76
- ...maybeToRefs(queryOptions)
77
- });
78
- }
79
- if (prop === "useQuery") {
80
- const { trpc: trpcOptions, ...queryOptions } = opts;
81
- const input = firstArg;
82
- return (0, import_vue_query.useQuery)(createQuery(input, { trpcOptions, queryOptions }));
83
- }
84
- if (prop === "queryOptions") {
85
- const { trpc: trpcOptions, ...queryOptions } = opts;
86
- const input = firstArg;
87
- return createQuery(input, { trpcOptions, queryOptions });
88
- }
89
- if (prop === "useQueries") {
90
- const { trpc: trpcOptions, combine, shallow, ...queryOptions } = opts;
91
- const inputs = firstArg;
92
- return (0, import_vue_query.useQueries)({
93
- queries: (0, import_vue.computed)(
94
- () => (0, import_vue.toValue)(inputs).map(
95
- (i) => createQuery(i, { trpcOptions, queryOptions }, { type: "queries" })
96
- )
97
- ),
98
- combine,
99
- ...maybeToRefs({ shallow })
100
- });
101
- }
102
- if (prop === "invalidate") {
103
- return queryClient.invalidateQueries({
104
- queryKey: getQueryKey(path, (0, import_vue.toValue)(firstArg), "query")
105
- });
106
- }
107
- if (prop === "setQueryData") {
108
- return queryClient.setQueryData(getQueryKey(path, (0, import_vue.toValue)(opts), "query"), firstArg);
109
- }
110
- if (prop === "key") {
111
- return getQueryKey(path, (0, import_vue.toValue)(firstArg), "query");
112
- }
113
- if (prop === "mutate") {
114
- return trpc.mutation(joinedPath, firstArg, opts);
115
- }
116
- if (prop === "useMutation") {
117
- const { trpc: trpcOptions, ...mutationOptions } = firstArg || {};
118
- return (0, import_vue_query.useMutation)({
119
- mutationKey: (0, import_vue.computed)(() => getQueryKey(path, void 0)),
120
- mutationFn: async (payload) => trpc.mutation(joinedPath, payload, {
121
- ...trpcOptions
122
- }),
123
- ...maybeToRefs(mutationOptions)
124
- });
125
- }
126
- if (prop === "subscribe") {
127
- return trpc.subscription(joinedPath, firstArg, opts);
128
- }
129
- if (prop === "useSubscription") {
130
- const inputData = (0, import_core.toRef)(firstArg);
131
- const subscription = (0, import_vue.shallowRef)();
132
- (0, import_vue.watch)(
133
- inputData,
134
- () => {
135
- if (inputData.value === import_vue_query.skipToken) return;
136
- subscription.value?.unsubscribe();
137
- subscription.value = trpc.subscription(joinedPath, inputData.value, {
138
- ...opts
139
- });
140
- },
141
- { immediate: true }
142
- );
143
- (0, import_vue.onScopeDispose)(() => {
144
- subscription.value?.unsubscribe();
145
- }, true);
146
- return subscription.value;
147
- }
148
- if (prop === "useInfiniteQuery") {
149
- const { trpc: trpcOptions, ...queryOptions } = opts;
150
- return (0, import_vue_query.useInfiniteQuery)({
151
- queryKey: (0, import_vue.computed)(() => getQueryKey(path, (0, import_vue.toValue)(firstArg), "infinite")),
152
- queryFn: async ({ queryKey, pageParam, signal }) => trpc.query(
153
- joinedPath,
154
- {
155
- ...queryKey[1]?.input,
156
- cursor: pageParam
157
- },
158
- {
159
- signal,
160
- ...trpcOptions
161
- }
162
- ),
163
- ...maybeToRefs(queryOptions)
164
- });
165
- }
166
- throw new Error(`Method '.${prop}()' not supported`);
167
- });
42
+ return (0, _trpc_server_unstable_core_do_not_import.createRecursiveProxy)(({ args, path: _path }) => {
43
+ const path = [name, ..._path];
44
+ const prop = path.pop();
45
+ if (prop === "_def") return { path };
46
+ const joinedPath = path.join(".");
47
+ const [firstArg, ...rest] = args;
48
+ const opts = rest[0] || {};
49
+ if (prop === "query") return trpc.query(joinedPath, firstArg, opts);
50
+ function createQuery(_input, _opts, { type = "query" } = {}) {
51
+ return (0, _tanstack_vue_query.queryOptions)(() => {
52
+ const input = (0, vue.toValue)(_input);
53
+ const { trpcOptions, options } = splitTRPCOptions(_opts);
54
+ return {
55
+ queryKey: getQueryKey(path, input, type),
56
+ queryFn: input === _tanstack_vue_query.skipToken ? _tanstack_vue_query.skipToken : async ({ signal }) => {
57
+ const output = await trpc.query(joinedPath, input, {
58
+ signal,
59
+ ...withVueQueryContext(trpcOptions)
60
+ });
61
+ if (type === "queries") return {
62
+ output,
63
+ input
64
+ };
65
+ return output;
66
+ },
67
+ ...options
68
+ };
69
+ });
70
+ }
71
+ if (prop === "useQuery") return (0, _tanstack_vue_query.useQuery)(createQuery(firstArg, opts));
72
+ if (prop === "queryOptions") return createQuery(firstArg, opts);
73
+ if (prop === "useQueries") {
74
+ const inputs = firstArg;
75
+ const { combine, shallow } = (0, vue.toValue)(opts) || {};
76
+ const queryOpts = () => {
77
+ const { combine: _, shallow: __, ...perQueryOptions } = (0, vue.toValue)(opts) || {};
78
+ return perQueryOptions;
79
+ };
80
+ return (0, _tanstack_vue_query.useQueries)({
81
+ queries: (0, vue.computed)(() => (0, vue.toValue)(inputs).map((i) => createQuery(i, queryOpts, { type: "queries" })())),
82
+ combine,
83
+ shallow
84
+ });
85
+ }
86
+ if (prop === "invalidate") return queryClient.invalidateQueries({ queryKey: getQueryKey(path, (0, vue.toValue)(firstArg), "query") });
87
+ if (prop === "setQueryData") return queryClient.setQueryData(getQueryKey(path, (0, vue.toValue)(opts), "query"), firstArg);
88
+ if (prop === "key") return getQueryKey(path, (0, vue.toValue)(firstArg), "query");
89
+ if (prop === "mutate") return trpc.mutation(joinedPath, firstArg, opts);
90
+ if (prop === "useMutation") return (0, _tanstack_vue_query.useMutation)({
91
+ mutationKey: (0, vue.computed)(() => getQueryKey(path, void 0)),
92
+ mutationFn: async (payload) => trpc.mutation(joinedPath, payload, withVueQueryContext(splitTRPCOptions(firstArg).trpcOptions)),
93
+ ...maybeToRefs(() => splitTRPCOptions(firstArg).options)
94
+ });
95
+ if (prop === "subscribe") return trpc.subscription(joinedPath, firstArg, opts);
96
+ if (prop === "useSubscription") {
97
+ const inputData = (0, _vueuse_core.toRef)(firstArg);
98
+ const subscription = (0, vue.shallowRef)();
99
+ (0, vue.watch)(inputData, () => {
100
+ if (inputData.value === _tanstack_vue_query.skipToken) return;
101
+ subscription.value?.unsubscribe();
102
+ subscription.value = trpc.subscription(joinedPath, inputData.value, { ...opts });
103
+ }, { immediate: true });
104
+ (0, vue.onScopeDispose)(() => {
105
+ subscription.value?.unsubscribe();
106
+ }, true);
107
+ return subscription.value;
108
+ }
109
+ if (prop === "useInfiniteQuery") return (0, _tanstack_vue_query.useInfiniteQuery)({
110
+ queryKey: (0, vue.computed)(() => getQueryKey(path, (0, vue.toValue)(firstArg), "infinite")),
111
+ queryFn: async ({ queryKey, pageParam, signal }) => trpc.query(joinedPath, {
112
+ ...queryKey[1]?.input,
113
+ cursor: pageParam
114
+ }, {
115
+ signal,
116
+ ...withVueQueryContext(splitTRPCOptions(opts).trpcOptions)
117
+ }),
118
+ ...maybeToRefs(() => splitTRPCOptions(opts).options)
119
+ });
120
+ throw new Error(`Method '.${prop}()' not supported`);
121
+ });
168
122
  }
169
- function createTRPCVueQueryClient({
170
- trpc,
171
- queryClient
172
- }) {
173
- const client = (0, import_client.createTRPCUntypedClient)(trpc);
174
- const decoratedClient = (0, import_server.createTRPCFlatProxy)((key) => {
175
- return createVueQueryProxyDecoration(key.toString(), client, queryClient);
176
- });
177
- return decoratedClient;
123
+ function createTRPCVueQueryClient({ trpc, queryClient }) {
124
+ const client = (0, _trpc_client.createTRPCUntypedClient)(trpc);
125
+ return (0, _trpc_server.createTRPCFlatProxy)((key) => {
126
+ return createVueQueryProxyDecoration(key.toString(), client, queryClient);
127
+ });
178
128
  }
179
- // Annotate the CommonJS export names for ESM import in node:
180
- 0 && (module.exports = {
181
- createTRPCVueQueryClient
182
- });
129
+ //#endregion
130
+ exports.createTRPCVueQueryClient = createTRPCVueQueryClient;
131
+ exports.vueQueryContext = vueQueryContext;
package/dist/index.d.cts CHANGED
@@ -1,78 +1,85 @@
1
- import { QueryKey, SkipToken, UseQueryOptions, UseQueryReturnType, UseQueriesResults, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
2
- import { TRPCClientErrorLike, TRPCRequestOptions, OperationContext, CreateTRPCClientOptions } from '@trpc/client';
3
- import { AnyTRPCRouter, AnyTRPCProcedure, AnyTRPCQueryProcedure, inferTransformedProcedureOutput, inferProcedureInput, AnyTRPCMutationProcedure, AnyTRPCSubscriptionProcedure, inferProcedureOutput } from '@trpc/server';
4
- import { Unsubscribable } from '@trpc/server/observable';
5
- import { Ref, MaybeRefOrGetter, UnwrapRef } from 'vue';
6
-
1
+ import { InfiniteData, InitialPageParam, QueryClient, QueryKey, SkipToken, UseInfiniteQueryOptions, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType, UseQueriesResults, UseQueryOptions, UseQueryReturnType } from "@tanstack/vue-query";
2
+ import { CreateTRPCClientOptions, OperationContext, TRPCClientErrorLike, TRPCRequestOptions } from "@trpc/client";
3
+ import { AnyTRPCMutationProcedure, AnyTRPCProcedure, AnyTRPCQueryProcedure, AnyTRPCRouter, AnyTRPCSubscriptionProcedure, inferProcedureInput, inferProcedureOutput, inferTransformedProcedureOutput } from "@trpc/server";
4
+ import { Unsubscribable } from "@trpc/server/observable";
5
+ import { MaybeRefOrGetter, Ref, UnwrapRef } from "vue";
6
+ //#region src/types.d.ts
7
7
  type inferAsyncIterableYield<T> = T extends AsyncIterable<infer U> ? U : T;
8
8
  type TRPCSubscriptionObserver<TValue, TError> = {
9
- onStarted: (opts: {
10
- context: OperationContext | undefined;
11
- }) => void;
12
- onData: (value: inferAsyncIterableYield<TValue>) => void;
13
- onError: (err: TError) => void;
14
- onStopped: () => void;
15
- onComplete: () => void;
9
+ onStarted: (opts: {
10
+ context: OperationContext | undefined;
11
+ }) => void;
12
+ onData: (value: inferAsyncIterableYield<TValue>) => void;
13
+ onError: (err: TError) => void;
14
+ onStopped: () => void;
15
+ onComplete: () => void;
16
16
  };
17
17
  type ArrayElement<T> = T extends readonly unknown[] ? T[number] : never;
18
18
  type Primitive = null | undefined | string | number | boolean | symbol | bigint;
19
- type Exact<Shape, T extends Shape> = Shape extends Primitive ? Shape : Shape extends object ? {
20
- [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends unknown[] ? Array<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends readonly unknown[] ? ReadonlyArray<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never;
21
- } : Shape;
19
+ type Exact<Shape, T extends Shape> = Shape extends Primitive ? Shape : Shape extends object ? { [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends unknown[] ? Array<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends readonly unknown[] ? ReadonlyArray<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never; } : Shape;
22
20
  type DecorateProcedure<TProcedure extends AnyTRPCProcedure, TRouter extends AnyTRPCRouter> = TProcedure extends AnyTRPCQueryProcedure ? {
23
- useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
24
- trpc?: TRPCRequestOptions;
25
- queryKey?: TQueryKey;
26
- }>) => UseQueryReturnType<TData, TError>;
27
- useQueries: <TQueryFnData extends {
28
- output: inferTransformedProcedureOutput<TRouter, TProcedure>;
29
- input: inferProcedureInput<TProcedure>;
30
- }, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, TData = TQueryFnData, TCombinedResult = UseQueriesResults<TQueries[]>>(inputs: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>[]>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<TQueries>, 'queryKey'> & {
31
- trpc?: TRPCRequestOptions;
32
- queryKey?: never;
33
- combine?: (result: UseQueriesResults<TQueries[]>) => TCombinedResult;
34
- shallow?: boolean;
35
- }>) => Readonly<Ref<TCombinedResult>>;
36
- queryOptions: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
37
- trpc?: TRPCRequestOptions;
38
- queryKey?: TQueryKey;
39
- }>) => UseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>;
40
- query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
41
- invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
42
- setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
43
- key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
21
+ useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
22
+ trpc?: TRPCRequestOptions;
23
+ queryKey?: TQueryKey;
24
+ }>) => UseQueryReturnType<TData, TError>;
25
+ useQueries: <TQueryFnData extends {
26
+ output: inferTransformedProcedureOutput<TRouter, TProcedure>;
27
+ input: inferProcedureInput<TProcedure>;
28
+ }, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, TData = TQueryFnData, TCombinedResult = UseQueriesResults<TQueries[]>>(inputs: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>[]>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<TQueries>, 'queryKey'> & {
29
+ trpc?: TRPCRequestOptions;
30
+ queryKey?: never;
31
+ combine?: (result: UseQueriesResults<TQueries[]>) => TCombinedResult;
32
+ shallow?: boolean;
33
+ }>) => Readonly<Ref<TCombinedResult>>;
34
+ queryOptions: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
35
+ trpc?: TRPCRequestOptions;
36
+ queryKey?: TQueryKey;
37
+ }>) => () => UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>>;
38
+ query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
39
+ invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
40
+ setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
41
+ key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
44
42
  } & (TProcedure['_def']['$types']['input'] extends {
45
- cursor?: infer CursorType;
43
+ cursor?: infer CursorType;
46
44
  } ? {
47
- useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData extends InfiniteData<any> = InfiniteData<TQueryFnData>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, CursorType>>, 'queryKey' | keyof InitialPageParam> & {
48
- trpc?: TRPCRequestOptions;
49
- queryKey?: TQueryKey;
50
- } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
45
+ useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData extends InfiniteData<any> = InfiniteData<TQueryFnData>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, CursorType>>, 'queryKey' | keyof InitialPageParam> & {
46
+ trpc?: TRPCRequestOptions;
47
+ queryKey?: TQueryKey;
48
+ } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
51
49
  } : object) : TProcedure extends AnyTRPCMutationProcedure ? {
52
- mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
53
- useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
54
- trpc?: TRPCRequestOptions;
55
- }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
50
+ mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
51
+ useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
52
+ trpc?: TRPCRequestOptions;
53
+ }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
56
54
  } : TProcedure extends AnyTRPCSubscriptionProcedure ? {
57
- subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
58
- useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
55
+ subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
56
+ useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
59
57
  } : never;
60
58
  /**
61
59
  * @internal
62
60
  */
63
- type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter extends AnyTRPCRouter> = {
64
- [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>;
65
- };
66
-
61
+ type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter extends AnyTRPCRouter> = { [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>; };
62
+ //#endregion
63
+ //#region src/index.d.ts
67
64
  type QueryType = 'query' | 'queries' | 'infinite';
68
65
  type TRPCQueryKey = [readonly string[], {
69
- input?: unknown;
70
- type?: QueryType;
66
+ input?: unknown;
67
+ type?: QueryType;
71
68
  }?];
72
-
73
- declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient, }: {
74
- queryClient: QueryClient;
75
- trpc: CreateTRPCClientOptions<TRouter>;
69
+ /**
70
+ * Operation context key marking a request as vue-query-driven.
71
+ * Registered globally via `Symbol.for()`, so it also works across duplicate installs.
72
+ */
73
+ declare const vueQueryContext: unique symbol;
74
+ interface VueQueryContext {}
75
+ declare module '@trpc/client' {
76
+ interface OperationContext {
77
+ [vueQueryContext]?: VueQueryContext;
78
+ }
79
+ }
80
+ declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient }: {
81
+ queryClient: QueryClient;
82
+ trpc: CreateTRPCClientOptions<TRouter>;
76
83
  }): DecoratedProcedureRecord<TRouter["_def"]["record"], TRouter>;
77
-
78
- export { type Exact, type TRPCQueryKey, createTRPCVueQueryClient };
84
+ //#endregion
85
+ export { type Exact, TRPCQueryKey, VueQueryContext, createTRPCVueQueryClient, vueQueryContext };
@@ -0,0 +1,85 @@
1
+ import { InfiniteData, InitialPageParam, QueryClient, QueryKey, SkipToken, UseInfiniteQueryOptions, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType, UseQueriesResults, UseQueryOptions, UseQueryReturnType } from "@tanstack/vue-query";
2
+ import { CreateTRPCClientOptions, OperationContext, TRPCClientErrorLike, TRPCRequestOptions } from "@trpc/client";
3
+ import { AnyTRPCMutationProcedure, AnyTRPCProcedure, AnyTRPCQueryProcedure, AnyTRPCRouter, AnyTRPCSubscriptionProcedure, inferProcedureInput, inferProcedureOutput, inferTransformedProcedureOutput } from "@trpc/server";
4
+ import { MaybeRefOrGetter, Ref, UnwrapRef } from "vue";
5
+ import { Unsubscribable } from "@trpc/server/observable";
6
+ //#region src/types.d.ts
7
+ type inferAsyncIterableYield<T> = T extends AsyncIterable<infer U> ? U : T;
8
+ type TRPCSubscriptionObserver<TValue, TError> = {
9
+ onStarted: (opts: {
10
+ context: OperationContext | undefined;
11
+ }) => void;
12
+ onData: (value: inferAsyncIterableYield<TValue>) => void;
13
+ onError: (err: TError) => void;
14
+ onStopped: () => void;
15
+ onComplete: () => void;
16
+ };
17
+ type ArrayElement<T> = T extends readonly unknown[] ? T[number] : never;
18
+ type Primitive = null | undefined | string | number | boolean | symbol | bigint;
19
+ type Exact<Shape, T extends Shape> = Shape extends Primitive ? Shape : Shape extends object ? { [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends unknown[] ? Array<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends readonly unknown[] ? ReadonlyArray<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never; } : Shape;
20
+ type DecorateProcedure<TProcedure extends AnyTRPCProcedure, TRouter extends AnyTRPCRouter> = TProcedure extends AnyTRPCQueryProcedure ? {
21
+ useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
22
+ trpc?: TRPCRequestOptions;
23
+ queryKey?: TQueryKey;
24
+ }>) => UseQueryReturnType<TData, TError>;
25
+ useQueries: <TQueryFnData extends {
26
+ output: inferTransformedProcedureOutput<TRouter, TProcedure>;
27
+ input: inferProcedureInput<TProcedure>;
28
+ }, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, TData = TQueryFnData, TCombinedResult = UseQueriesResults<TQueries[]>>(inputs: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>[]>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<TQueries>, 'queryKey'> & {
29
+ trpc?: TRPCRequestOptions;
30
+ queryKey?: never;
31
+ combine?: (result: UseQueriesResults<TQueries[]>) => TCombinedResult;
32
+ shallow?: boolean;
33
+ }>) => Readonly<Ref<TCombinedResult>>;
34
+ queryOptions: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
35
+ trpc?: TRPCRequestOptions;
36
+ queryKey?: TQueryKey;
37
+ }>) => () => UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>>;
38
+ query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
39
+ invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
40
+ setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
41
+ key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
42
+ } & (TProcedure['_def']['$types']['input'] extends {
43
+ cursor?: infer CursorType;
44
+ } ? {
45
+ useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData extends InfiniteData<any> = InfiniteData<TQueryFnData>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, CursorType>>, 'queryKey' | keyof InitialPageParam> & {
46
+ trpc?: TRPCRequestOptions;
47
+ queryKey?: TQueryKey;
48
+ } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
49
+ } : object) : TProcedure extends AnyTRPCMutationProcedure ? {
50
+ mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
51
+ useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
52
+ trpc?: TRPCRequestOptions;
53
+ }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
54
+ } : TProcedure extends AnyTRPCSubscriptionProcedure ? {
55
+ subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
56
+ useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
57
+ } : never;
58
+ /**
59
+ * @internal
60
+ */
61
+ type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter extends AnyTRPCRouter> = { [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>; };
62
+ //#endregion
63
+ //#region src/index.d.ts
64
+ type QueryType = 'query' | 'queries' | 'infinite';
65
+ type TRPCQueryKey = [readonly string[], {
66
+ input?: unknown;
67
+ type?: QueryType;
68
+ }?];
69
+ /**
70
+ * Operation context key marking a request as vue-query-driven.
71
+ * Registered globally via `Symbol.for()`, so it also works across duplicate installs.
72
+ */
73
+ declare const vueQueryContext: unique symbol;
74
+ interface VueQueryContext {}
75
+ declare module '@trpc/client' {
76
+ interface OperationContext {
77
+ [vueQueryContext]?: VueQueryContext;
78
+ }
79
+ }
80
+ declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient }: {
81
+ queryClient: QueryClient;
82
+ trpc: CreateTRPCClientOptions<TRouter>;
83
+ }): DecoratedProcedureRecord<TRouter["_def"]["record"], TRouter>;
84
+ //#endregion
85
+ export { type Exact, TRPCQueryKey, VueQueryContext, createTRPCVueQueryClient, vueQueryContext };
package/dist/index.mjs CHANGED
@@ -1,164 +1,129 @@
1
- // src/index.ts
2
- import {
3
- queryOptions as defineQueryOptions,
4
- skipToken,
5
- useInfiniteQuery,
6
- useMutation,
7
- useQueries,
8
- useQuery
9
- } from "@tanstack/vue-query";
1
+ import { queryOptions, skipToken, useInfiniteQuery, useMutation, useQueries, useQuery } from "@tanstack/vue-query";
10
2
  import { createTRPCUntypedClient } from "@trpc/client";
11
3
  import { createTRPCFlatProxy } from "@trpc/server";
12
4
  import { createRecursiveProxy } from "@trpc/server/unstable-core-do-not-import";
13
5
  import { toRef, toRefs } from "@vueuse/core";
14
6
  import { computed, isReactive, onScopeDispose, shallowRef, toValue, watch } from "vue";
7
+ //#region src/index.ts
15
8
  function getQueryKey(path, input, type) {
16
- const splitPath = path.flatMap((part) => part.split("."));
17
- if (input === void 0 && !type) {
18
- return splitPath.length > 0 ? [splitPath] : [];
19
- }
20
- return [
21
- splitPath,
22
- {
23
- ...input !== void 0 && input !== skipToken && { input },
24
- ...type && { type }
25
- }
26
- ];
9
+ const splitPath = path.flatMap((part) => part.split("."));
10
+ if (input === void 0 && !type) return splitPath.length > 0 ? [splitPath] : [];
11
+ return [splitPath, {
12
+ ...input !== void 0 && input !== skipToken && { input },
13
+ ...type && { type }
14
+ }];
15
+ }
16
+ /**
17
+ * Operation context key marking a request as vue-query-driven.
18
+ * Registered globally via `Symbol.for()`, so it also works across duplicate installs.
19
+ */
20
+ const vueQueryContext = Symbol.for("trpc-vue-query.vueQueryContext");
21
+ function withVueQueryContext(trpcOptions) {
22
+ return {
23
+ ...trpcOptions,
24
+ context: {
25
+ ...trpcOptions?.context,
26
+ [vueQueryContext]: {}
27
+ }
28
+ };
29
+ }
30
+ function splitTRPCOptions(opts) {
31
+ const { trpc: trpcOptions, ...options } = toValue(opts) || {};
32
+ return {
33
+ trpcOptions,
34
+ options
35
+ };
27
36
  }
28
37
  function maybeToRefs(obj) {
29
- return isReactive(obj) ? toRefs(obj) : toRefs(toRef(obj));
38
+ return toRefs(isReactive(obj) ? obj : toRef(obj));
30
39
  }
31
40
  function createVueQueryProxyDecoration(name, trpc, queryClient) {
32
- return createRecursiveProxy(({ args, path: _path }) => {
33
- const path = [name, ..._path];
34
- const prop = path.pop();
35
- const joinedPath = path.join(".");
36
- const [firstArg, ...rest] = args;
37
- const opts = rest[0] || {};
38
- if (prop === "_def") {
39
- return { path };
40
- }
41
- if (prop === "query") {
42
- return trpc.query(joinedPath, firstArg, opts);
43
- }
44
- function createQuery(_input, { trpcOptions, queryOptions }, { type = "query" } = {}) {
45
- const queryFn = computed(
46
- () => toValue(_input) === skipToken ? skipToken : async ({ signal }) => {
47
- const input = toValue(_input);
48
- const output = await trpc.query(joinedPath, input, {
49
- signal,
50
- ...trpcOptions
51
- });
52
- if (type === "queries") return { output, input };
53
- return output;
54
- }
55
- );
56
- return defineQueryOptions({
57
- queryKey: computed(() => getQueryKey(path, toValue(_input), type)),
58
- queryFn,
59
- ...maybeToRefs(queryOptions)
60
- });
61
- }
62
- if (prop === "useQuery") {
63
- const { trpc: trpcOptions, ...queryOptions } = opts;
64
- const input = firstArg;
65
- return useQuery(createQuery(input, { trpcOptions, queryOptions }));
66
- }
67
- if (prop === "queryOptions") {
68
- const { trpc: trpcOptions, ...queryOptions } = opts;
69
- const input = firstArg;
70
- return createQuery(input, { trpcOptions, queryOptions });
71
- }
72
- if (prop === "useQueries") {
73
- const { trpc: trpcOptions, combine, shallow, ...queryOptions } = opts;
74
- const inputs = firstArg;
75
- return useQueries({
76
- queries: computed(
77
- () => toValue(inputs).map(
78
- (i) => createQuery(i, { trpcOptions, queryOptions }, { type: "queries" })
79
- )
80
- ),
81
- combine,
82
- ...maybeToRefs({ shallow })
83
- });
84
- }
85
- if (prop === "invalidate") {
86
- return queryClient.invalidateQueries({
87
- queryKey: getQueryKey(path, toValue(firstArg), "query")
88
- });
89
- }
90
- if (prop === "setQueryData") {
91
- return queryClient.setQueryData(getQueryKey(path, toValue(opts), "query"), firstArg);
92
- }
93
- if (prop === "key") {
94
- return getQueryKey(path, toValue(firstArg), "query");
95
- }
96
- if (prop === "mutate") {
97
- return trpc.mutation(joinedPath, firstArg, opts);
98
- }
99
- if (prop === "useMutation") {
100
- const { trpc: trpcOptions, ...mutationOptions } = firstArg || {};
101
- return useMutation({
102
- mutationKey: computed(() => getQueryKey(path, void 0)),
103
- mutationFn: async (payload) => trpc.mutation(joinedPath, payload, {
104
- ...trpcOptions
105
- }),
106
- ...maybeToRefs(mutationOptions)
107
- });
108
- }
109
- if (prop === "subscribe") {
110
- return trpc.subscription(joinedPath, firstArg, opts);
111
- }
112
- if (prop === "useSubscription") {
113
- const inputData = toRef(firstArg);
114
- const subscription = shallowRef();
115
- watch(
116
- inputData,
117
- () => {
118
- if (inputData.value === skipToken) return;
119
- subscription.value?.unsubscribe();
120
- subscription.value = trpc.subscription(joinedPath, inputData.value, {
121
- ...opts
122
- });
123
- },
124
- { immediate: true }
125
- );
126
- onScopeDispose(() => {
127
- subscription.value?.unsubscribe();
128
- }, true);
129
- return subscription.value;
130
- }
131
- if (prop === "useInfiniteQuery") {
132
- const { trpc: trpcOptions, ...queryOptions } = opts;
133
- return useInfiniteQuery({
134
- queryKey: computed(() => getQueryKey(path, toValue(firstArg), "infinite")),
135
- queryFn: async ({ queryKey, pageParam, signal }) => trpc.query(
136
- joinedPath,
137
- {
138
- ...queryKey[1]?.input,
139
- cursor: pageParam
140
- },
141
- {
142
- signal,
143
- ...trpcOptions
144
- }
145
- ),
146
- ...maybeToRefs(queryOptions)
147
- });
148
- }
149
- throw new Error(`Method '.${prop}()' not supported`);
150
- });
41
+ return createRecursiveProxy(({ args, path: _path }) => {
42
+ const path = [name, ..._path];
43
+ const prop = path.pop();
44
+ if (prop === "_def") return { path };
45
+ const joinedPath = path.join(".");
46
+ const [firstArg, ...rest] = args;
47
+ const opts = rest[0] || {};
48
+ if (prop === "query") return trpc.query(joinedPath, firstArg, opts);
49
+ function createQuery(_input, _opts, { type = "query" } = {}) {
50
+ return queryOptions(() => {
51
+ const input = toValue(_input);
52
+ const { trpcOptions, options } = splitTRPCOptions(_opts);
53
+ return {
54
+ queryKey: getQueryKey(path, input, type),
55
+ queryFn: input === skipToken ? skipToken : async ({ signal }) => {
56
+ const output = await trpc.query(joinedPath, input, {
57
+ signal,
58
+ ...withVueQueryContext(trpcOptions)
59
+ });
60
+ if (type === "queries") return {
61
+ output,
62
+ input
63
+ };
64
+ return output;
65
+ },
66
+ ...options
67
+ };
68
+ });
69
+ }
70
+ if (prop === "useQuery") return useQuery(createQuery(firstArg, opts));
71
+ if (prop === "queryOptions") return createQuery(firstArg, opts);
72
+ if (prop === "useQueries") {
73
+ const inputs = firstArg;
74
+ const { combine, shallow } = toValue(opts) || {};
75
+ const queryOpts = () => {
76
+ const { combine: _, shallow: __, ...perQueryOptions } = toValue(opts) || {};
77
+ return perQueryOptions;
78
+ };
79
+ return useQueries({
80
+ queries: computed(() => toValue(inputs).map((i) => createQuery(i, queryOpts, { type: "queries" })())),
81
+ combine,
82
+ shallow
83
+ });
84
+ }
85
+ if (prop === "invalidate") return queryClient.invalidateQueries({ queryKey: getQueryKey(path, toValue(firstArg), "query") });
86
+ if (prop === "setQueryData") return queryClient.setQueryData(getQueryKey(path, toValue(opts), "query"), firstArg);
87
+ if (prop === "key") return getQueryKey(path, toValue(firstArg), "query");
88
+ if (prop === "mutate") return trpc.mutation(joinedPath, firstArg, opts);
89
+ if (prop === "useMutation") return useMutation({
90
+ mutationKey: computed(() => getQueryKey(path, void 0)),
91
+ mutationFn: async (payload) => trpc.mutation(joinedPath, payload, withVueQueryContext(splitTRPCOptions(firstArg).trpcOptions)),
92
+ ...maybeToRefs(() => splitTRPCOptions(firstArg).options)
93
+ });
94
+ if (prop === "subscribe") return trpc.subscription(joinedPath, firstArg, opts);
95
+ if (prop === "useSubscription") {
96
+ const inputData = toRef(firstArg);
97
+ const subscription = shallowRef();
98
+ watch(inputData, () => {
99
+ if (inputData.value === skipToken) return;
100
+ subscription.value?.unsubscribe();
101
+ subscription.value = trpc.subscription(joinedPath, inputData.value, { ...opts });
102
+ }, { immediate: true });
103
+ onScopeDispose(() => {
104
+ subscription.value?.unsubscribe();
105
+ }, true);
106
+ return subscription.value;
107
+ }
108
+ if (prop === "useInfiniteQuery") return useInfiniteQuery({
109
+ queryKey: computed(() => getQueryKey(path, toValue(firstArg), "infinite")),
110
+ queryFn: async ({ queryKey, pageParam, signal }) => trpc.query(joinedPath, {
111
+ ...queryKey[1]?.input,
112
+ cursor: pageParam
113
+ }, {
114
+ signal,
115
+ ...withVueQueryContext(splitTRPCOptions(opts).trpcOptions)
116
+ }),
117
+ ...maybeToRefs(() => splitTRPCOptions(opts).options)
118
+ });
119
+ throw new Error(`Method '.${prop}()' not supported`);
120
+ });
151
121
  }
152
- function createTRPCVueQueryClient({
153
- trpc,
154
- queryClient
155
- }) {
156
- const client = createTRPCUntypedClient(trpc);
157
- const decoratedClient = createTRPCFlatProxy((key) => {
158
- return createVueQueryProxyDecoration(key.toString(), client, queryClient);
159
- });
160
- return decoratedClient;
122
+ function createTRPCVueQueryClient({ trpc, queryClient }) {
123
+ const client = createTRPCUntypedClient(trpc);
124
+ return createTRPCFlatProxy((key) => {
125
+ return createVueQueryProxyDecoration(key.toString(), client, queryClient);
126
+ });
161
127
  }
162
- export {
163
- createTRPCVueQueryClient
164
- };
128
+ //#endregion
129
+ export { createTRPCVueQueryClient, vueQueryContext };
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@falcondev-oss/trpc-vue-query",
3
3
  "type": "module",
4
- "version": "0.5.4",
4
+ "version": "0.6.1",
5
5
  "description": "A tRPC wrapper around '@tanstack/vue-query'",
6
6
  "license": "MIT",
7
- "repository": "github:falcondev-oss/trpc-vue-query",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "github:falcondev-oss/trpc-vue-query"
10
+ },
8
11
  "bugs": {
9
12
  "url": "https://github.com/falcondev-oss/trpc-vue-query/issues"
10
13
  },
@@ -17,7 +20,7 @@
17
20
  ],
18
21
  "exports": {
19
22
  "import": {
20
- "types": "./dist/index.d.ts",
23
+ "types": "./dist/index.d.mts",
21
24
  "default": "./dist/index.mjs"
22
25
  },
23
26
  "require": {
@@ -27,13 +30,20 @@
27
30
  },
28
31
  "main": "dist/index.cjs",
29
32
  "module": "dist/index.mjs",
30
- "types": "dist/index.d.ts",
33
+ "types": "dist/index.d.cts",
31
34
  "files": [
32
35
  "dist"
33
36
  ],
34
- "engines": {
35
- "node": ">=24",
36
- "pnpm": "10"
37
+ "devEngines": {
38
+ "runtime": {
39
+ "name": "node",
40
+ "version": ">=24"
41
+ },
42
+ "packageManager": {
43
+ "name": "pnpm",
44
+ "version": "11",
45
+ "onFail": "warn"
46
+ }
37
47
  },
38
48
  "peerDependencies": {
39
49
  "@tanstack/vue-query": "^5.92.9",
@@ -42,40 +52,36 @@
42
52
  "vue": "^3.5.30"
43
53
  },
44
54
  "dependencies": {
45
- "@vueuse/core": "^14.2.1"
55
+ "@vueuse/core": "^14.4.0"
46
56
  },
47
57
  "devDependencies": {
48
- "@commitlint/cli": "^19.8.1",
49
- "@eslint/eslintrc": "^3.3.1",
50
- "@louishaftmann/commitlint-config": "^4.3.1",
51
- "@louishaftmann/eslint-config": "^4.3.1",
52
- "@louishaftmann/lintstaged-config": "^4.3.1",
53
- "@louishaftmann/prettier-config": "^4.3.1",
54
- "@tanstack/vue-query": "^5.83.0",
55
- "@trpc/client": "11.4.3",
56
- "@trpc/server": "11.4.3",
57
- "@types/eslint": "^9.6.1",
58
+ "@commitlint/cli": "^21.2.2",
59
+ "@falcondev-oss/configs": "^6.0.6",
60
+ "@tanstack/vue-query": "^5.102.2",
61
+ "@trpc/client": "11.18.0",
62
+ "@trpc/server": "11.18.0",
58
63
  "@types/ws": "^8.18.1",
59
- "@vitest/ui": "^3.2.4",
60
- "eslint": "^9.32.0",
64
+ "@vitest/ui": "^4.1.11",
65
+ "eslint": "^10.9.0",
61
66
  "husky": "^9.1.7",
62
- "lint-staged": "^16.1.2",
63
- "prettier": "^3.5.3",
64
- "start-server-and-test": "^2.0.12",
65
- "tsup": "^8.5.0",
66
- "tsx": "^4.20.3",
67
- "type-fest": "^4.41.0",
68
- "typescript": "^5.8.3",
69
- "vitest": "^3.2.4",
70
- "vue": "^3.5.18",
71
- "ws": "^8.18.3",
72
- "zod": "^3.24.2"
67
+ "lint-staged": "^17.3.0",
68
+ "prettier": "^3.9.6",
69
+ "start-server-and-test": "^3.0.12",
70
+ "tsdown": "^0.22.14",
71
+ "tsx": "^4.23.12",
72
+ "type-fest": "^5.8.0",
73
+ "typescript": "^6.0.3",
74
+ "typescript-eslint": "^8.67.0",
75
+ "vitest": "^4.1.11",
76
+ "vue": "^3.5.41",
77
+ "ws": "^8.21.3",
78
+ "zod": "^4.4.3"
73
79
  },
74
80
  "changelogithub": {
75
81
  "extends": "gh:falcondev-it/configs/changelogithub"
76
82
  },
77
83
  "scripts": {
78
- "build": "tsup",
84
+ "build": "tsdown",
79
85
  "lint": "eslint --cache . && prettier --check --cache .",
80
86
  "lint:ci": "eslint --cache --cache-strategy content . && prettier --check --cache --cache-strategy content .",
81
87
  "lint:fix": "eslint --fix --cache . && prettier --write --cache .",
package/dist/index.d.ts DELETED
@@ -1,78 +0,0 @@
1
- import { QueryKey, SkipToken, UseQueryOptions, UseQueryReturnType, UseQueriesResults, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
2
- import { TRPCClientErrorLike, TRPCRequestOptions, OperationContext, CreateTRPCClientOptions } from '@trpc/client';
3
- import { AnyTRPCRouter, AnyTRPCProcedure, AnyTRPCQueryProcedure, inferTransformedProcedureOutput, inferProcedureInput, AnyTRPCMutationProcedure, AnyTRPCSubscriptionProcedure, inferProcedureOutput } from '@trpc/server';
4
- import { Unsubscribable } from '@trpc/server/observable';
5
- import { Ref, MaybeRefOrGetter, UnwrapRef } from 'vue';
6
-
7
- type inferAsyncIterableYield<T> = T extends AsyncIterable<infer U> ? U : T;
8
- type TRPCSubscriptionObserver<TValue, TError> = {
9
- onStarted: (opts: {
10
- context: OperationContext | undefined;
11
- }) => void;
12
- onData: (value: inferAsyncIterableYield<TValue>) => void;
13
- onError: (err: TError) => void;
14
- onStopped: () => void;
15
- onComplete: () => void;
16
- };
17
- type ArrayElement<T> = T extends readonly unknown[] ? T[number] : never;
18
- type Primitive = null | undefined | string | number | boolean | symbol | bigint;
19
- type Exact<Shape, T extends Shape> = Shape extends Primitive ? Shape : Shape extends object ? {
20
- [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends unknown[] ? Array<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends readonly unknown[] ? ReadonlyArray<Exact<ArrayElement<Shape[Key]>, ArrayElement<T[Key]>>> : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never;
21
- } : Shape;
22
- type DecorateProcedure<TProcedure extends AnyTRPCProcedure, TRouter extends AnyTRPCRouter> = TProcedure extends AnyTRPCQueryProcedure ? {
23
- useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
24
- trpc?: TRPCRequestOptions;
25
- queryKey?: TQueryKey;
26
- }>) => UseQueryReturnType<TData, TError>;
27
- useQueries: <TQueryFnData extends {
28
- output: inferTransformedProcedureOutput<TRouter, TProcedure>;
29
- input: inferProcedureInput<TProcedure>;
30
- }, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, TData = TQueryFnData, TCombinedResult = UseQueriesResults<TQueries[]>>(inputs: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>[]>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<TQueries>, 'queryKey'> & {
31
- trpc?: TRPCRequestOptions;
32
- queryKey?: never;
33
- combine?: (result: UseQueriesResults<TQueries[]>) => TCombinedResult;
34
- shallow?: boolean;
35
- }>) => Readonly<Ref<TCombinedResult>>;
36
- queryOptions: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData = TQueryFnData>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> | Ref<inferProcedureInput<TProcedure> | SkipToken> | (() => inferProcedureInput<TProcedure> | SkipToken) : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
37
- trpc?: TRPCRequestOptions;
38
- queryKey?: TQueryKey;
39
- }>) => UseQueryOptions<TQueryFnData, TError, TData, TQueryFnData, TQueryKey>;
40
- query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
41
- invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
42
- setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
43
- key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
44
- } & (TProcedure['_def']['$types']['input'] extends {
45
- cursor?: infer CursorType;
46
- } ? {
47
- useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TData extends InfiniteData<any> = InfiniteData<TQueryFnData>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryKey, CursorType>>, 'queryKey' | keyof InitialPageParam> & {
48
- trpc?: TRPCRequestOptions;
49
- queryKey?: TQueryKey;
50
- } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
51
- } : object) : TProcedure extends AnyTRPCMutationProcedure ? {
52
- mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
53
- useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
54
- trpc?: TRPCRequestOptions;
55
- }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
56
- } : TProcedure extends AnyTRPCSubscriptionProcedure ? {
57
- subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
58
- useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
59
- } : never;
60
- /**
61
- * @internal
62
- */
63
- type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter extends AnyTRPCRouter> = {
64
- [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>;
65
- };
66
-
67
- type QueryType = 'query' | 'queries' | 'infinite';
68
- type TRPCQueryKey = [readonly string[], {
69
- input?: unknown;
70
- type?: QueryType;
71
- }?];
72
-
73
- declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient, }: {
74
- queryClient: QueryClient;
75
- trpc: CreateTRPCClientOptions<TRouter>;
76
- }): DecoratedProcedureRecord<TRouter["_def"]["record"], TRouter>;
77
-
78
- export { type Exact, type TRPCQueryKey, createTRPCVueQueryClient };