Client
Since Clover routes are OpenAPI compliant, you can generate a client against the spec using any library of your choice e.g. Orval (opens in a new tab) or oazapfts (opens in a new tab).
If you'd rather not add a client generation step, Clover also provides a lightweight fetcher that can be used to make requests to the API.
// server.ts
 
import { makeRequestHandler } from "@sarim.garden/clover";
 
const { handler, clientConfig, openAPIPathsObject } = makeRequestHandler({
  input: z.object({
    name: z.string(),
  }),
  output: z.object({
    greeting: z.string(),
  }),
  run: async ({ request, input, sendOutput }) => {
    const { name } = input;
    return sendOutput({ greeting: `Hello, ${name}!` });
  },
  path: "/api/hello",
  method: "GET",
  description: "Greets the user",
  authenticate: async (req) => {
    return true;
  },
});
 
export type clientTypes = typeof clientConfig;// client.ts
 
import { makeFetcher } from "@sarim.garden/clover";
 
export const fetcher = makeFetcher({
  baseUrl: "https://api.example.com",
  headers: {},
});The fetcher is simply a typesafe wrapper around fetch that manages query params, path params, and request/response bodies. You can use the fetcher anywhere to make network requests to your API routes. The fetcher is generic; once you pass in the client types, you will get intellisense on all the fields.
// some/other/file.ts
 
import { fetcher } from "../../client";
import type { clientTypes } from "../../server";
 
const resp = fetcher<clientTypes>({
  input: {
    name: "Sarim",
  },
  method: "GET",
  path: "/api/hello",
});makeFetcher
Props
| Name | Type | Description | 
|---|---|---|
| baseUrl | string | Where your API routes can be reached e.g. https://api.example.com. | 
| headers | Headers | Common headers sent with each request. | 
fetcher
Props
| Name | Type | Description | 
|---|---|---|
| input | z.infer<AnyZodObject> | Input variables as described by your server route input schema. | 
| path | string | The relative path where your handler can be reached e.g. /api/hello-world. This will be constrained so there can only be one value. | 
| method | HTTPMethod | GET,POST,PUT,PATCHorDELETE. This will be constrained so there can only be one value. | 
| validator? | AnyZodObject | Parse the received response with a Zod schema. It must be the same as the server output schema or you will get a type error. |