Генерация API
Установка
Заголовок раздела «Установка»https://heyapi.dev/openapi-ts/get-started#installation
pnpm add @hey-api/client-fetch && pnpm add @hey-api/openapi-ts -D
{ "scripts": { "generate-api": "openapi-ts" }}
VITE_API_SWAGGER=https://api.spaceapp.ru/swagger.jsonVITE_API_URL=https://api.spaceapp.ru
import { defaultPlugins, defineConfig } from "@hey-api/openapi-ts";import { loadEnv } from "vite";
export default defineConfig({ input: loadEnv("production", process.cwd()).VITE_API_SWAGGER, output: "src/shared/api/generated", plugins: [ ...defaultPlugins, { name: "@hey-api/client-fetch" }, { name: "@tanstack/react-query" }, { name: "@hey-api/typescript", enums: "typescript" }, { name: "@hey-api/sdk" }, ],});
Next.js
Заголовок раздела «Next.js»pnpm add @next/env
NEXT_API_SWAGGER=https://api.spaceapp.ru/swagger.jsonNEXT_PUBLIC_API_URL=https://api.spaceapp.ru
import { loadEnvConfig } from "@next/env";
const projectDir = process.cwd();loadEnvConfig(projectDir);
import { defaultPlugins, defineConfig } from "@hey-api/openapi-ts";import "./envConfig.ts";
export default defineConfig({ input: process.env.NEXT_API_SWAGGER!, output: "src/shared/api/generated", plugins: [ ...defaultPlugins, { name: "@hey-api/client-fetch" }, { name: "@tanstack/react-query" }, { name: "@hey-api/typescript", enums: "typescript" }, { name: "@hey-api/sdk" }, ],});
Генерация API
Заголовок раздела «Генерация API»pnpm generate-api
export * from "./generated";export * from "./generated/@tanstack/react-query.gen";
Client Setup
Заголовок раздела «Client Setup»https://heyapi.dev/openapi-ts/clients/fetch
import { createClient } from "@hey-api/client-fetch";
/** * Fetch клиент для API, пробрасывается в хуки Tanstack Query */export const apiClient = createClient({ // Vite baseUrl: import.meta.env.VITE_API_URL, // Next.js baseUrl: process.env.NEXT_PUBLIC_API_URL,});
apiClient.interceptors.request.use((config) => { return config;});
apiClient.interceptors.response.use(async (res) => { return res;});
Пример использования с TanStackQuery
Заголовок раздела «Пример использования с TanStackQuery»import { GetV1ProductsData, getV1ProductsOptions } from "@/shared/api";import { apiClient } from "@/shared/lib";import { Options } from "@hey-api/client-fetch";import { useQuery } from "@tanstack/react-query";
export const useGetProducts = (options?: Options<GetV1ProductsData>) => useQuery(getV1ProductsOptions({ client: apiClient, ...options }));
import { useGetProducts } from "@/shared/lib";---const { data } = useGetProducts();