Giter Site home page Giter Site logo

rapini's Introduction

npm License PR Test

๐Ÿฅฌ Rapini - OpenAPI to React Query (or SWR) & Axios

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.

Features

  • ๐Ÿšด Generates axios calls for every endpoint, with typed payload.
  • ๐ŸŒ๏ธ Generates custom react hooks that use React Query's useQuery and useMutation hooks for each axios call. Optional to generate custom hooks that use SWR's useSWR hook.
  • ๐Ÿšฃ Generates query keys for every hook.
  • ๐Ÿ‹๏ธ Generates strong typescript types for all inputs, outputs, and options.

Installation

Rapini is a CLI tool so you can install it globally for convenience

npm i -g rapini

Usage

rapini [library] [options]

eg:

# For React Query V3
rapini react-query -p path/to/openapi.yaml

# For React Query V4
rapini react-query v4 -p path/to/openapi.yaml

# For SWR
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.

CLI Arguments & Options

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] [version]

Generate a Package for TanStack Query V4 or 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

Example Usage

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:

const rapini = initialize(axiosInstance);
rapini.queries; // { usePets, usePetById } ...
rapini.mutations; // { useUpdatePet, useDeletePet } ... if generated by SWR, there will be no property `mutations`
rapini.queryIds; // { pets: () => ['pets'] } ...
rapini.requests; // { pets: () => axios.get<Pet[]>(...) } ...

With Global Config

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);

Important Notes

  • Every request must have an operationId defined. The operationId is used in many places in the final generated code.

rapini's People

Contributors

rametta avatar yuleicul avatar daniel-pulley avatar phlrss avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.