@falcondev-oss/trpc-vue-query 0.5.0-rc.2 → 0.5.0-rc.20

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/dist/index.cjs CHANGED
@@ -18,11 +18,11 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var src_exports = {};
22
- __export(src_exports, {
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
23
  createTRPCVueQueryClient: () => createTRPCVueQueryClient
24
24
  });
25
- module.exports = __toCommonJS(src_exports);
25
+ module.exports = __toCommonJS(index_exports);
26
26
  var import_vue_query = require("@tanstack/vue-query");
27
27
  var import_client = require("@trpc/client");
28
28
  var import_server = require("@trpc/server");
@@ -58,27 +58,52 @@ function createVueQueryProxyDecoration(name, trpc, queryClient) {
58
58
  if (prop === "query") {
59
59
  return trpc.query(joinedPath, firstArg, opts);
60
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
+ }
61
79
  if (prop === "useQuery") {
62
80
  const { trpc: trpcOptions, ...queryOptions } = opts;
63
- return (0, import_vue_query.useQuery)({
64
- queryKey: (0, import_vue.computed)(() => getQueryKey(path, (0, import_core.toValue)(firstArg), "query")),
65
- queryFn: async ({ queryKey, signal }) => trpc.query(joinedPath, queryKey[1]?.input, {
66
- signal,
67
- ...trpcOptions
68
- }),
69
- ...maybeToRefs(queryOptions)
81
+ const input = firstArg;
82
+ return (0, import_vue_query.useQuery)(createQuery(input, { trpcOptions, queryOptions }));
83
+ }
84
+ if (prop === "useQueries") {
85
+ const { trpc: trpcOptions, combine, shallow, ...queryOptions } = opts;
86
+ const inputs = firstArg;
87
+ return (0, import_vue_query.useQueries)({
88
+ queries: (0, import_vue.computed)(
89
+ () => (0, import_vue.toValue)(inputs).map(
90
+ (i) => createQuery(i, { trpcOptions, queryOptions }, { type: "queries" })
91
+ )
92
+ ),
93
+ combine,
94
+ ...maybeToRefs({ shallow })
70
95
  });
71
96
  }
72
97
  if (prop === "invalidate") {
73
98
  return queryClient.invalidateQueries({
74
- queryKey: getQueryKey(path, (0, import_core.toValue)(firstArg), "query")
99
+ queryKey: getQueryKey(path, (0, import_vue.toValue)(firstArg), "query")
75
100
  });
76
101
  }
77
102
  if (prop === "setQueryData") {
78
- return queryClient.setQueryData(getQueryKey(path, (0, import_core.toValue)(opts), "query"), firstArg);
103
+ return queryClient.setQueryData(getQueryKey(path, (0, import_vue.toValue)(opts), "query"), firstArg);
79
104
  }
80
105
  if (prop === "key") {
81
- return getQueryKey(path, (0, import_core.toValue)(firstArg), "query");
106
+ return getQueryKey(path, (0, import_vue.toValue)(firstArg), "query");
82
107
  }
83
108
  if (prop === "mutate") {
84
109
  return trpc.mutation(joinedPath, firstArg, opts);
@@ -102,6 +127,7 @@ function createVueQueryProxyDecoration(name, trpc, queryClient) {
102
127
  (0, import_vue.watch)(
103
128
  inputData,
104
129
  () => {
130
+ if (inputData.value === import_vue_query.skipToken) return;
105
131
  subscription.value?.unsubscribe();
106
132
  subscription.value = trpc.subscription(joinedPath, inputData.value, {
107
133
  ...opts
@@ -117,7 +143,7 @@ function createVueQueryProxyDecoration(name, trpc, queryClient) {
117
143
  if (prop === "useInfiniteQuery") {
118
144
  const { trpc: trpcOptions, ...queryOptions } = opts;
119
145
  return (0, import_vue_query.useInfiniteQuery)({
120
- queryKey: (0, import_vue.computed)(() => getQueryKey(path, (0, import_core.toValue)(firstArg), "infinite")),
146
+ queryKey: (0, import_vue.computed)(() => getQueryKey(path, (0, import_vue.toValue)(firstArg), "infinite")),
121
147
  queryFn: async ({ queryKey, pageParam, signal }) => trpc.query(
122
148
  joinedPath,
123
149
  {
@@ -141,7 +167,7 @@ function createTRPCVueQueryClient({
141
167
  }) {
142
168
  const client = (0, import_client.createTRPCUntypedClient)(trpc);
143
169
  const decoratedClient = (0, import_server.createTRPCFlatProxy)((key) => {
144
- return createVueQueryProxyDecoration(key, client, queryClient);
170
+ return createVueQueryProxyDecoration(key.toString(), client, queryClient);
145
171
  });
146
172
  return decoratedClient;
147
173
  }
package/dist/index.d.cts CHANGED
@@ -1,46 +1,57 @@
1
- import { QueryKey, UseQueryOptions, UseQueryReturnType, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
1
+ import { QueryKey, SkipToken, UseQueryOptions, UseQueryReturnType, UseQueriesResults, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
2
2
  import { TRPCClientErrorLike, TRPCRequestOptions, OperationContext, CreateTRPCClientOptions } from '@trpc/client';
3
3
  import { AnyTRPCRouter, AnyTRPCProcedure, AnyTRPCQueryProcedure, inferTransformedProcedureOutput, inferProcedureInput, AnyTRPCMutationProcedure, AnyTRPCSubscriptionProcedure, inferProcedureOutput } from '@trpc/server';
4
4
  import { Unsubscribable } from '@trpc/server/observable';
5
- import { ProcedureOptions } from '@trpc/server/unstable-core-do-not-import';
6
- import { MaybeRefOrGetter, UnwrapRef } from 'vue';
5
+ import { Ref, MaybeRefOrGetter, UnwrapRef } from 'vue';
7
6
 
7
+ type inferAsyncIterableYield<T> = T extends AsyncIterable<infer U> ? U : T;
8
8
  type TRPCSubscriptionObserver<TValue, TError> = {
9
9
  onStarted: (opts: {
10
10
  context: OperationContext | undefined;
11
11
  }) => void;
12
- onData: (value: TValue) => void;
12
+ onData: (value: inferAsyncIterableYield<TValue>) => void;
13
13
  onError: (err: TError) => void;
14
14
  onStopped: () => void;
15
15
  onComplete: () => void;
16
16
  };
17
- type Exact<Shape, T extends Shape> = {
18
- [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never;
19
- };
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;
20
22
  type DecorateProcedure<TProcedure extends AnyTRPCProcedure, TRouter extends AnyTRPCRouter> = TProcedure extends AnyTRPCQueryProcedure ? {
21
- useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
23
+ useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
22
24
  trpc?: TRPCRequestOptions;
23
25
  queryKey?: TQueryKey;
24
26
  }>) => UseQueryReturnType<TData, TError>;
25
- query: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts?: ProcedureOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
26
- invalidate: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => Promise<void>;
27
- setQueryData: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => ReturnType<QueryClient['setQueryData']>;
28
- key: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => QueryKey;
27
+ useQueries: <TQueryFnData extends {
28
+ output: inferTransformedProcedureOutput<TRouter, TProcedure>;
29
+ input: inferProcedureInput<TProcedure>;
30
+ }, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 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
+ query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
37
+ invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
38
+ setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
39
+ key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
29
40
  } & (TProcedure['_def']['$types']['input'] extends {
30
41
  cursor?: infer CursorType;
31
42
  } ? {
32
- useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends InfiniteData<TQueryFnData>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends Omit<inferProcedureInput<TProcedure>, 'cursor'>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey' | keyof InitialPageParam> & {
43
+ useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends InfiniteData<TQueryFnData>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey' | keyof InitialPageParam> & {
33
44
  trpc?: TRPCRequestOptions;
34
45
  queryKey?: TQueryKey;
35
46
  } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
36
47
  } : object) : TProcedure extends AnyTRPCMutationProcedure ? {
37
- mutate: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts?: ProcedureOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
48
+ mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
38
49
  useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
39
50
  trpc?: TRPCRequestOptions;
40
51
  }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
41
52
  } : TProcedure extends AnyTRPCSubscriptionProcedure ? {
42
- subscribe: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts: ProcedureOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
43
- useSubscription: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts: ProcedureOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
53
+ subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
54
+ useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
44
55
  } : never;
45
56
  /**
46
57
  * @internal
@@ -49,14 +60,15 @@ type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter e
49
60
  [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>;
50
61
  };
51
62
 
52
- type QueryType = 'query' | 'infinite';
63
+ type QueryType = 'query' | 'queries' | 'infinite';
53
64
  type TRPCQueryKey = [readonly string[], {
54
65
  input?: unknown;
55
66
  type?: QueryType;
56
67
  }?];
68
+
57
69
  declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient, }: {
58
70
  queryClient: QueryClient;
59
71
  trpc: CreateTRPCClientOptions<TRouter>;
60
72
  }): DecoratedProcedureRecord<TRouter["_def"]["record"], TRouter>;
61
73
 
62
- export { type TRPCQueryKey, createTRPCVueQueryClient };
74
+ export { type Exact, type TRPCQueryKey, createTRPCVueQueryClient };
package/dist/index.d.ts CHANGED
@@ -1,46 +1,57 @@
1
- import { QueryKey, UseQueryOptions, UseQueryReturnType, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
1
+ import { QueryKey, SkipToken, UseQueryOptions, UseQueryReturnType, UseQueriesResults, QueryClient, InfiniteData, UseInfiniteQueryOptions, InitialPageParam, UseInfiniteQueryReturnType, UseMutationOptions, UseMutationReturnType } from '@tanstack/vue-query';
2
2
  import { TRPCClientErrorLike, TRPCRequestOptions, OperationContext, CreateTRPCClientOptions } from '@trpc/client';
3
3
  import { AnyTRPCRouter, AnyTRPCProcedure, AnyTRPCQueryProcedure, inferTransformedProcedureOutput, inferProcedureInput, AnyTRPCMutationProcedure, AnyTRPCSubscriptionProcedure, inferProcedureOutput } from '@trpc/server';
4
4
  import { Unsubscribable } from '@trpc/server/observable';
5
- import { ProcedureOptions } from '@trpc/server/unstable-core-do-not-import';
6
- import { MaybeRefOrGetter, UnwrapRef } from 'vue';
5
+ import { Ref, MaybeRefOrGetter, UnwrapRef } from 'vue';
7
6
 
7
+ type inferAsyncIterableYield<T> = T extends AsyncIterable<infer U> ? U : T;
8
8
  type TRPCSubscriptionObserver<TValue, TError> = {
9
9
  onStarted: (opts: {
10
10
  context: OperationContext | undefined;
11
11
  }) => void;
12
- onData: (value: TValue) => void;
12
+ onData: (value: inferAsyncIterableYield<TValue>) => void;
13
13
  onError: (err: TError) => void;
14
14
  onStopped: () => void;
15
15
  onComplete: () => void;
16
16
  };
17
- type Exact<Shape, T extends Shape> = {
18
- [Key in keyof T]: Key extends keyof Shape ? T[Key] extends Date ? T[Key] : T[Key] extends object ? Exact<Shape[Key], T[Key]> : T[Key] : never;
19
- };
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;
20
22
  type DecorateProcedure<TProcedure extends AnyTRPCProcedure, TRouter extends AnyTRPCRouter> = TProcedure extends AnyTRPCQueryProcedure ? {
21
- useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
23
+ useQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>>(input: inferProcedureInput<TProcedure> extends void ? inferProcedureInput<TProcedure> : Ref<Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken> | (() => Exact<inferProcedureInput<TProcedure>, TInput> | SkipToken), opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey'> & {
22
24
  trpc?: TRPCRequestOptions;
23
25
  queryKey?: TQueryKey;
24
26
  }>) => UseQueryReturnType<TData, TError>;
25
- query: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts?: ProcedureOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
26
- invalidate: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => Promise<void>;
27
- setQueryData: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => ReturnType<QueryClient['setQueryData']>;
28
- key: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input?: MaybeRefOrGetter<Exact<TInput, TTInput>>) => QueryKey;
27
+ useQueries: <TQueryFnData extends {
28
+ output: inferTransformedProcedureOutput<TRouter, TProcedure>;
29
+ input: inferProcedureInput<TProcedure>;
30
+ }, TError extends TRPCClientErrorLike<TRouter>, TData extends TQueryFnData, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>, TQueries extends UseQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 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
+ query: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
37
+ invalidate: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => Promise<void>;
38
+ setQueryData: <TInput extends inferProcedureInput<TProcedure>>(updater: inferTransformedProcedureOutput<TRouter, TProcedure>, input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => ReturnType<QueryClient['setQueryData']>;
39
+ key: <TInput extends inferProcedureInput<TProcedure>>(input?: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>) => QueryKey;
29
40
  } & (TProcedure['_def']['$types']['input'] extends {
30
41
  cursor?: infer CursorType;
31
42
  } ? {
32
- useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends InfiniteData<TQueryFnData>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends Omit<inferProcedureInput<TProcedure>, 'cursor'>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey' | keyof InitialPageParam> & {
43
+ useInfiniteQuery: <TQueryFnData extends inferTransformedProcedureOutput<TRouter, TProcedure>, TError extends TRPCClientErrorLike<TRouter>, TData extends InfiniteData<TQueryFnData>, TQueryData extends TQueryFnData, TQueryKey extends QueryKey, TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<Omit<inferProcedureInput<TProcedure>, 'cursor'>, TInput>>, opts?: MaybeRefOrGetter<Omit<UnwrapRef<UseInfiniteQueryOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>>, 'queryKey' | keyof InitialPageParam> & {
33
44
  trpc?: TRPCRequestOptions;
34
45
  queryKey?: TQueryKey;
35
46
  } & (undefined extends TProcedure['_def']['$types']['input']['cursor'] ? Partial<InitialPageParam<CursorType>> : InitialPageParam<CursorType>)>) => UseInfiniteQueryReturnType<TData, TError>;
36
47
  } : object) : TProcedure extends AnyTRPCMutationProcedure ? {
37
- mutate: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts?: ProcedureOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
48
+ mutate: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts?: TRPCRequestOptions) => Promise<inferTransformedProcedureOutput<TRouter, TProcedure>>;
38
49
  useMutation: <TData = inferTransformedProcedureOutput<TRouter, TProcedure>, TError = TRPCClientErrorLike<TRouter>, TVariables = inferProcedureInput<TProcedure>, TContext = unknown>(opts?: MaybeRefOrGetter<UseMutationOptions<TData, TError, TVariables, TContext> & {
39
50
  trpc?: TRPCRequestOptions;
40
51
  }>) => UseMutationReturnType<TData, TError, TVariables, TContext>;
41
52
  } : TProcedure extends AnyTRPCSubscriptionProcedure ? {
42
- subscribe: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: Exact<TInput, TTInput>, opts: ProcedureOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
43
- useSubscription: <TInput extends inferProcedureInput<TProcedure>, TTInput extends TInput>(input: MaybeRefOrGetter<Exact<TInput, TTInput>>, opts: ProcedureOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
53
+ subscribe: <TInput extends inferProcedureInput<TProcedure>>(input: Exact<inferProcedureInput<TProcedure>, TInput>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
54
+ useSubscription: <TInput extends inferProcedureInput<TProcedure>>(input: MaybeRefOrGetter<Exact<inferProcedureInput<TProcedure>, TInput>>, opts: TRPCRequestOptions & Partial<TRPCSubscriptionObserver<inferProcedureOutput<TProcedure>, TRPCClientErrorLike<TRouter>>>) => Unsubscribable;
44
55
  } : never;
45
56
  /**
46
57
  * @internal
@@ -49,14 +60,15 @@ type DecoratedProcedureRecord<TProcedures extends Record<string, any>, TRouter e
49
60
  [K in keyof TProcedures]: TProcedures[K] extends AnyTRPCProcedure ? DecorateProcedure<TProcedures[K], TRouter> : DecoratedProcedureRecord<TProcedures[K], TRouter>;
50
61
  };
51
62
 
52
- type QueryType = 'query' | 'infinite';
63
+ type QueryType = 'query' | 'queries' | 'infinite';
53
64
  type TRPCQueryKey = [readonly string[], {
54
65
  input?: unknown;
55
66
  type?: QueryType;
56
67
  }?];
68
+
57
69
  declare function createTRPCVueQueryClient<TRouter extends AnyTRPCRouter>({ trpc, queryClient, }: {
58
70
  queryClient: QueryClient;
59
71
  trpc: CreateTRPCClientOptions<TRouter>;
60
72
  }): DecoratedProcedureRecord<TRouter["_def"]["record"], TRouter>;
61
73
 
62
- export { type TRPCQueryKey, createTRPCVueQueryClient };
74
+ export { type Exact, type TRPCQueryKey, createTRPCVueQueryClient };
package/dist/index.mjs CHANGED
@@ -1,17 +1,17 @@
1
1
  // src/index.ts
2
2
  import {
3
+ queryOptions as defineQueryOptions,
3
4
  skipToken,
4
5
  useInfiniteQuery,
5
6
  useMutation,
7
+ useQueries,
6
8
  useQuery
7
9
  } from "@tanstack/vue-query";
8
- import {
9
- createTRPCUntypedClient
10
- } from "@trpc/client";
10
+ import { createTRPCUntypedClient } from "@trpc/client";
11
11
  import { createTRPCFlatProxy } from "@trpc/server";
12
12
  import { createRecursiveProxy } from "@trpc/server/unstable-core-do-not-import";
13
- import { toRef, toRefs, toValue } from "@vueuse/core";
14
- import { computed, isReactive, onScopeDispose, shallowRef, watch } from "vue";
13
+ import { toRef, toRefs } from "@vueuse/core";
14
+ import { computed, isReactive, onScopeDispose, shallowRef, toValue, watch } from "vue";
15
15
  function getQueryKey(path, input, type) {
16
16
  const splitPath = path.flatMap((part) => part.split("."));
17
17
  if (input === void 0 && !type) {
@@ -41,15 +41,40 @@ function createVueQueryProxyDecoration(name, trpc, queryClient) {
41
41
  if (prop === "query") {
42
42
  return trpc.query(joinedPath, firstArg, opts);
43
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
+ }
44
62
  if (prop === "useQuery") {
45
63
  const { trpc: trpcOptions, ...queryOptions } = opts;
46
- return useQuery({
47
- queryKey: computed(() => getQueryKey(path, toValue(firstArg), "query")),
48
- queryFn: async ({ queryKey, signal }) => trpc.query(joinedPath, queryKey[1]?.input, {
49
- signal,
50
- ...trpcOptions
51
- }),
52
- ...maybeToRefs(queryOptions)
64
+ const input = firstArg;
65
+ return useQuery(createQuery(input, { trpcOptions, queryOptions }));
66
+ }
67
+ if (prop === "useQueries") {
68
+ const { trpc: trpcOptions, combine, shallow, ...queryOptions } = opts;
69
+ const inputs = firstArg;
70
+ return useQueries({
71
+ queries: computed(
72
+ () => toValue(inputs).map(
73
+ (i) => createQuery(i, { trpcOptions, queryOptions }, { type: "queries" })
74
+ )
75
+ ),
76
+ combine,
77
+ ...maybeToRefs({ shallow })
53
78
  });
54
79
  }
55
80
  if (prop === "invalidate") {
@@ -85,6 +110,7 @@ function createVueQueryProxyDecoration(name, trpc, queryClient) {
85
110
  watch(
86
111
  inputData,
87
112
  () => {
113
+ if (inputData.value === skipToken) return;
88
114
  subscription.value?.unsubscribe();
89
115
  subscription.value = trpc.subscription(joinedPath, inputData.value, {
90
116
  ...opts
@@ -124,7 +150,7 @@ function createTRPCVueQueryClient({
124
150
  }) {
125
151
  const client = createTRPCUntypedClient(trpc);
126
152
  const decoratedClient = createTRPCFlatProxy((key) => {
127
- return createVueQueryProxyDecoration(key, client, queryClient);
153
+ return createVueQueryProxyDecoration(key.toString(), client, queryClient);
128
154
  });
129
155
  return decoratedClient;
130
156
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@falcondev-oss/trpc-vue-query",
3
3
  "type": "module",
4
- "version": "0.5.0-rc.2",
4
+ "version": "0.5.0-rc.20",
5
5
  "description": "A tRPC wrapper around '@tanstack/vue-query'",
6
6
  "license": "MIT",
7
7
  "repository": "github:falcondev-oss/trpc-vue-query",
@@ -15,6 +15,16 @@
15
15
  "tanstack-query",
16
16
  "typescript"
17
17
  ],
18
+ "exports": {
19
+ "import": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.mjs"
22
+ },
23
+ "require": {
24
+ "types": "./dist/index.d.cts",
25
+ "default": "./dist/index.cjs"
26
+ }
27
+ },
18
28
  "main": "dist/index.cjs",
19
29
  "module": "dist/index.mjs",
20
30
  "types": "dist/index.d.ts",
@@ -22,45 +32,44 @@
22
32
  "dist"
23
33
  ],
24
34
  "engines": {
25
- "node": "20",
26
- "pnpm": "9"
35
+ "node": "22",
36
+ "pnpm": "10"
27
37
  },
28
38
  "peerDependencies": {
29
39
  "@tanstack/vue-query": "^5.22.2",
30
- "@trpc/client": "11",
31
- "@trpc/server": "11",
40
+ "@trpc/client": "^11",
41
+ "@trpc/server": "^11",
32
42
  "vue": "^3.4.19"
33
43
  },
34
44
  "dependencies": {
35
- "@vueuse/core": "^11.1.0"
45
+ "@vueuse/core": "^13.0.0"
36
46
  },
37
47
  "devDependencies": {
38
- "@commitlint/cli": "^19.5.0",
39
- "@eslint/eslintrc": "^3.1.0",
40
- "@louishaftmann/commitlint-config": "^4.0.3",
41
- "@louishaftmann/eslint-config": "^4.0.3",
42
- "@louishaftmann/lintstaged-config": "^4.0.3",
43
- "@louishaftmann/prettier-config": "^4.0.3",
44
- "@tanstack/vue-query": "^5.56.2",
45
- "@trpc/client": "11.0.0-rc.490",
46
- "@trpc/server": "11.0.0-rc.490",
48
+ "@commitlint/cli": "^19.8.0",
49
+ "@eslint/eslintrc": "^3.3.1",
50
+ "@louishaftmann/commitlint-config": "^4.2.0",
51
+ "@louishaftmann/eslint-config": "^4.2.0",
52
+ "@louishaftmann/lintstaged-config": "^4.2.0",
53
+ "@louishaftmann/prettier-config": "^4.2.0",
54
+ "@tanstack/vue-query": "^5.71.10",
55
+ "@trpc/client": "11.0.2",
56
+ "@trpc/server": "11.0.2",
47
57
  "@types/eslint": "^9.6.1",
48
- "@types/eslint__eslintrc": "^2.1.2",
49
- "@types/ws": "^8.5.12",
50
- "@vitest/ui": "^2.1.1",
51
- "eslint": "^9.11.0",
52
- "husky": "^9.1.6",
53
- "lint-staged": "^15.2.10",
54
- "prettier": "^3.3.3",
55
- "start-server-and-test": "^2.0.8",
56
- "tsup": "^8.3.0",
57
- "tsx": "^4.19.1",
58
- "type-fest": "^4.26.1",
59
- "typescript": "^5.6.2",
60
- "vitest": "^2.1.1",
61
- "vue": "^3.5.7",
62
- "ws": "^8.18.0",
63
- "zod": "^3.23.8"
58
+ "@types/ws": "^8.18.1",
59
+ "@vitest/ui": "^3.1.1",
60
+ "eslint": "^9.24.0",
61
+ "husky": "^9.1.7",
62
+ "lint-staged": "^15.5.0",
63
+ "prettier": "^3.5.3",
64
+ "start-server-and-test": "^2.0.11",
65
+ "tsup": "^8.4.0",
66
+ "tsx": "^4.19.3",
67
+ "type-fest": "^4.39.1",
68
+ "typescript": "^5.8.3",
69
+ "vitest": "^3.1.1",
70
+ "vue": "^3.5.13",
71
+ "ws": "^8.18.1",
72
+ "zod": "^3.24.2"
64
73
  },
65
74
  "changelogithub": {
66
75
  "extends": "gh:falcondev-it/configs/changelogithub"