Skip to content

Commit 3f65909

Browse files
refactor: drop usage of ES6 Proxy (#142)
* refactor: drop usage of ES6 Proxy * chore: trigger SonarCloud Co-authored-by: Oliver Butler <dev@oliverbutler.uk>
1 parent 0f1edf9 commit 3f65909

4 files changed

Lines changed: 61 additions & 99 deletions

File tree

.changeset/giant-lizards-jam.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@ts-rest/core': patch
3+
'@ts-rest/react-query': patch
4+
'@ts-rest/solid-query': patch
5+
---
6+
7+
Drop usage of ES6 Proxy for clients (fixes IE11 support)

libs/ts-rest/core/src/lib/client.ts

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ export type ApiRouteResponse<T> =
7070
body: unknown;
7171
};
7272

73-
export type ApiResponseForRoute<T extends AppRoute> = ApiRouteResponse<T['responses']>
74-
73+
export type ApiResponseForRoute<T extends AppRoute> = ApiRouteResponse<
74+
T['responses']
75+
>;
7576

7677
/**
7778
* Returned from a mutation or query call
@@ -202,45 +203,30 @@ export const getRouteQuery = <TAppRoute extends AppRoute>(
202203
};
203204
};
204205

205-
const createNewProxy = (router: AppRouter, args: ClientArgs) => {
206-
return new Proxy(
207-
{},
208-
{
209-
get: (target, propKey): any => {
210-
if (typeof propKey === 'string' && propKey in router) {
211-
const subRouter = router[propKey];
212-
213-
if (isAppRoute(subRouter)) {
214-
// If the current router.X is a route, return a function to handle the users args
215-
return getRouteQuery(subRouter, args);
216-
} else {
217-
return createNewProxy(subRouter, args);
218-
}
219-
}
220-
221-
return createNewProxy(router, args);
222-
},
223-
}
224-
);
225-
};
226-
227206
export type InitClientReturn<T extends AppRouter> = RecursiveProxyObj<T>;
228207

229208
export const initClient = <T extends AppRouter>(
230209
router: T,
231210
args: ClientArgs
232211
): InitClientReturn<T> => {
233-
const proxy = createNewProxy(router, args);
234-
235-
return proxy as InitClientReturn<T>;
212+
return Object.fromEntries(
213+
Object.entries(router).map(([key, subRouter]) => {
214+
if (isAppRoute(subRouter)) {
215+
return [key, getRouteQuery(subRouter, args)];
216+
} else {
217+
return [key, initClient(subRouter, args)];
218+
}
219+
})
220+
);
236221
};
237222

238223
// takes a router and returns response types for each AppRoute
239224
// does not support nested routers, yet
240225

241226
export function getRouteResponses<T extends AppRouter>(router: T) {
242227
return {} as {
243-
[K in keyof typeof router]:
244-
typeof router[K] extends AppRoute ? ApiResponseForRoute<typeof router[K]> : 'not a route'
245-
}
246-
}
228+
[K in keyof typeof router]: typeof router[K] extends AppRoute
229+
? ApiResponseForRoute<typeof router[K]>
230+
: 'not a route';
231+
};
232+
}

libs/ts-rest/react-query/src/lib/react-query.ts

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -340,45 +340,29 @@ const getRouteUseMutation = <TAppRoute extends AppRoute>(
340340
};
341341
};
342342

343-
const createNewProxy = (router: AppRouter | AppRoute, args: ClientArgs) => {
344-
return new Proxy(
345-
{},
346-
{
347-
get: (_, propKey): unknown => {
348-
if (isAppRoute(router)) {
349-
switch (propKey) {
350-
case 'query':
351-
return getRouteQuery(router, args);
352-
case 'mutation':
353-
return getRouteQuery(router, args);
354-
case 'useQuery':
355-
return getRouteUseQuery(router, args);
356-
case 'useInfiniteQuery':
357-
return getRouteUseInfiniteQuery(router, args);
358-
case 'useQueries':
359-
return getRouteUseQueries(router, args);
360-
case 'useMutation':
361-
return getRouteUseMutation(router, args);
362-
default:
363-
throw new Error(`Unknown method called on ${String(propKey)}`);
364-
}
365-
} else {
366-
const subRouter = router[propKey as string];
367-
368-
return createNewProxy(subRouter, args);
369-
}
370-
},
371-
}
372-
);
373-
};
374-
375343
export type InitClientReturn<T extends AppRouter> = RecursiveProxyObj<T>;
376344

377345
export const initQueryClient = <T extends AppRouter>(
378346
router: T,
379347
args: ClientArgs
380348
): InitClientReturn<T> => {
381-
const proxy = createNewProxy(router, args);
382-
383-
return proxy as InitClientReturn<T>;
349+
return Object.fromEntries(
350+
Object.entries(router).map(([key, subRouter]) => {
351+
if (isAppRoute(subRouter)) {
352+
return [
353+
key,
354+
{
355+
query: getRouteQuery(subRouter, args),
356+
mutation: getRouteQuery(subRouter, args),
357+
useQuery: getRouteUseQuery(subRouter, args),
358+
useQueries: getRouteUseQueries(subRouter, args),
359+
useInfiniteQuery: getRouteUseInfiniteQuery(subRouter, args),
360+
useMutation: getRouteUseMutation(subRouter, args),
361+
},
362+
];
363+
} else {
364+
return [key, initQueryClient(subRouter, args)];
365+
}
366+
})
367+
);
384368
};

libs/ts-rest/solid-query/src/lib/solid-query.ts

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -246,43 +246,28 @@ const getRouteUseMutation = <TAppRoute extends AppRoute>(
246246
};
247247
};
248248

249-
const createNewProxy = (router: AppRouter | AppRoute, args: ClientArgs) => {
250-
return new Proxy(
251-
{},
252-
{
253-
get: (_, propKey): any => {
254-
if (isAppRoute(router)) {
255-
switch (propKey) {
256-
case 'query':
257-
return getRouteQuery(router, args);
258-
case 'mutation':
259-
return getRouteQuery(router, args);
260-
case 'createQuery':
261-
return getRouteUseQuery(router, args);
262-
case 'createInfiniteQuery':
263-
return getRouteUseInfiniteQuery(router, args);
264-
case 'createMutation':
265-
return getRouteUseMutation(router, args);
266-
default:
267-
throw new Error(`Unknown method called on ${String(propKey)}`);
268-
}
269-
} else {
270-
const subRouter = router[propKey as string];
271-
272-
return createNewProxy(subRouter, args);
273-
}
274-
},
275-
}
276-
);
277-
};
278-
279249
export type InitClientReturn<T extends AppRouter> = RecursiveProxyObj<T>;
280250

281251
export const initQueryClient = <T extends AppRouter>(
282252
router: T,
283253
args: ClientArgs
284254
): InitClientReturn<T> => {
285-
const proxy = createNewProxy(router, args);
286-
287-
return proxy as InitClientReturn<T>;
255+
return Object.fromEntries(
256+
Object.entries(router).map(([key, subRouter]) => {
257+
if (isAppRoute(subRouter)) {
258+
return [
259+
key,
260+
{
261+
query: getRouteQuery(subRouter, args),
262+
mutation: getRouteQuery(subRouter, args),
263+
createQuery: getRouteUseQuery(subRouter, args),
264+
createInfiniteQuery: getRouteUseInfiniteQuery(subRouter, args),
265+
createMutation: getRouteUseMutation(subRouter, args),
266+
},
267+
];
268+
} else {
269+
return [key, initQueryClient(subRouter, args)];
270+
}
271+
})
272+
);
288273
};

0 commit comments

Comments
 (0)