
Product
Announcing Socket Fix 2.0
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.
Generate React Query hooks, SWR hooks, Axios requests and Typescript types from OpenAPI files
Rapini is a tool that generates React Query (or SWR) hooks, Axios requests and Typescript types, based on an OpenAPI spec file. The generated code is packaged conveniently so that it can be published as a package on any NPM registry.
useQuery and useMutation hooks for each axios call. Optional to generate custom hooks that use SWR's useSWR hook.Rapini is a CLI tool so you can execute the remote npm package directly for convenience
npx rapini [library] [options]
eg:
# For React Query V3
npx rapini react-query -p path/to/openapi.yaml
# For TanStack Query 4
npx rapini react-query v4 -p path/to/openapi.yaml
# For TanStack Query 5
npx rapini react-query v5 -p path/to/openapi.yaml
# For SWR
npx rapini swr -p path/to/openapi.yaml
This will generate the package code based on an OpenAPI file at path/to/openapi.yaml. The outputted code will be packaged in a way to just publish it as your own NPM package and then import it in your React project.
rapini help outputs the following:Usage: rapini [options] [command]
Generate a package based on OpenAPI
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
react-query [options] [version] Generate a Package for TanStack Query V4 or React Query V3
swr [options] Generate a Package for SWR (stale-while-revalidate)
help [command] display help for command
rapini help react-query outputs the following:Usage: rapini react-query [options] [react-query-version]
Generate a Package for TanStack Query V4 or V5, or legacy React Query V3
Options:
-p, --path <path> Path to OpenAPI file
-n, --name [name] Name to use for the generated package (default: "rapini-generated-package")
-pv, --package-version [version] Semver version to use for the generated package (default: "1.0.0")
-o, --output-dir [directory] Directory to output the generated package (default: "rapini-generated-package")
-b, --base-url [url] Prefix every request with this url
-r, --replacer [oldString] [newString...] Replace part(s) of any route's path with simple string replacements. Ex: `-r /api/v1 /api/v2` would replace the v1 with v2 in every route
-h, --help display help for command
rapini help swr outputs the following:Usage: rapini swr [options]
Generate a Package for SWR (stale-while-revalidate)
Options:
-p, --path <path> Path to OpenAPI file
-n, --name [name] Name to use for the generated package (default: "rapini-generated-package")
-pv, --package-version [version] Semver version to use for the generated package (default: "1.0.0")
-o, --output-dir [directory] Directory to output the generated package (default: "rapini-generated-package")
-b, --base-url [url] Prefix every request with this url
-r, --replacer [oldString] [newString...] Replace part(s) of any route's path with simple string replacements. Ex: `-r /api/v1 /api/v2` would replace the v1 with v2 in every route
-h, --help display help for command
Let's say you have an OpenAPI file that looks like this one.
Once you run the CLI tool to generate the React Query code, you can then cd into the generated directory, run npm install && npm run build then npm publish with your own package name to publish it to your own registry, then import and use it like this:
import { initialize } from "your-custom-package";
import { axiosInstance } from "./your-custom-axios-instance";
// Can even import the generated Typescript Types if needed
import type { Pet } from "your-custom-package";
const config = initialize(axiosInstance);
const { usePets } = config.queries;
const MyComponent = () => {
const { data, isLoading, isError } = usePets();
return (
<ul>
{data.pets.map((pet) => (
<li key={pet.id}>{pet.name}</li>
))}
</ul>
);
};
You must call initialize(axiosInstance) with your custom axios instance. The return value from the initialize will give you an object with everything you need, here is the return value with examples:
import { queryKeys } from "generated-package";
// queryKeys = { pets: () => ['pets'] } ...
const rapini = initialize(axiosInstance);
rapini.queries; // { usePets, usePetById } ...
rapini.mutations; // { useUpdatePet, useDeletePet } ... if generated by SWR, there will be no property `mutations`
rapini.requests; // { pets: () => axios.get<Pet[]>(...) } ...
There may be times when you want extra functionality hooked into each hook's callbacks. You can do this normally by passing options to each hook, but if you want something more global - a config can be provided to the initialize function.
import { initialize, type Config } from "your-custom-package";
import type { QueryClient } from "react-query";
const config: Config = {
mutations: {
useCreatePet: (queryClient: QueryClient) => ({
onSuccess: () => showSuccessNotification(),
onError: () => showErrorNotification(),
}),
},
};
const rapini = initialize(axiosInstance, config);
operationId defined. The operationId is used in many places in the final generated code.FAQs
Generate React Query hooks, SWR hooks, Axios requests and Typescript types from OpenAPI files
We found that rapini demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.

Security News
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.

Product
Socket’s new Tier 1 Reachability filters out up to 80% of irrelevant CVEs, so security teams can focus on the vulnerabilities that matter.