UNPKG

@orpc/svelte-query

Version:

<div align="center"> <image align="center" src="https://orpc.unnoq.com/logo.webp" width=280 alt="oRPC logo" /> </div>

104 lines (99 loc) 3.63 kB
import { generateOperationKey } from '@orpc/tanstack-query'; export { generateOperationKey as buildKey } from '@orpc/tanstack-query'; import { isAsyncIteratorObject } from '@orpc/shared'; import { skipToken, experimental_streamedQuery } from '@tanstack/svelte-query'; function createGeneralUtils(path) { return { key(options) { return generateOperationKey(path, options); } }; } function createProcedureUtils(client, options) { return { call: client, queryOptions(...[optionsIn = {}]) { return { queryKey: generateOperationKey(options.path, { type: "query", input: optionsIn.input }), queryFn: ({ signal }) => { if (optionsIn.input === skipToken) { throw new Error("queryFn should not be called with skipToken used as input"); } return client(optionsIn.input, { signal, context: optionsIn.context }); }, enabled: optionsIn.input !== skipToken, ...optionsIn }; }, experimental_streamedOptions(...[optionsIn = {}]) { return { enabled: optionsIn.input !== skipToken, queryKey: generateOperationKey(options.path, { type: "streamed", input: optionsIn.input, fnOptions: optionsIn.queryFnOptions }), queryFn: experimental_streamedQuery({ queryFn: async ({ signal }) => { if (optionsIn.input === skipToken) { throw new Error("queryFn should not be called with skipToken used as input"); } const output = await client(optionsIn.input, { signal, context: optionsIn.context }); if (!isAsyncIteratorObject(output)) { throw new Error("streamedQuery requires an event iterator output"); } return output; }, ...optionsIn.queryFnOptions }), ...optionsIn }; }, infiniteOptions(optionsIn) { return { queryKey: generateOperationKey(options.path, { type: "infinite", input: optionsIn.input === skipToken ? skipToken : optionsIn.input(optionsIn.initialPageParam) }), queryFn: ({ pageParam, signal }) => { if (optionsIn.input === skipToken) { throw new Error("queryFn should not be called with skipToken used as input"); } return client(optionsIn.input(pageParam), { signal, context: optionsIn.context }); }, enabled: optionsIn.input !== skipToken, ...optionsIn }; }, mutationOptions(...[optionsIn = {}]) { return { mutationKey: generateOperationKey(options.path, { type: "mutation" }), mutationFn: (input) => client(input, { context: optionsIn.context }), ...optionsIn }; } }; } function createRouterUtils(client, options = {}) { const path = options.path ?? []; const generalUtils = createGeneralUtils(path); const procedureUtils = createProcedureUtils(client, { path }); const recursive = new Proxy({ ...generalUtils, ...procedureUtils }, { get(target, prop) { const value = Reflect.get(target, prop); if (typeof prop !== "string") { return value; } const nextUtils = createRouterUtils(client[prop], { ...options, path: [...path, prop] }); if (typeof value !== "function") { return nextUtils; } return new Proxy(value, { get(_, prop2) { return Reflect.get(nextUtils, prop2); } }); } }); return recursive; } export { createGeneralUtils, createRouterUtils as createORPCSvelteQueryUtils, createProcedureUtils, createRouterUtils };