UNPKG

query-with-axios

Version:

A utility package for making API requests with Axios and managing queries and mutations using TanStack Query.

225 lines (153 loc) 4.9 kB
# Query With Axios A comprehensive and type-safe utility package designed for Vue developers to streamline API interactions using **Axios** and **TanStack Query**. This package provides hooks and interfaces to manage API requests and responses efficiently while maintaining type safety and scalability. > **Note:** This package is specifically designed for Vue developers. --- ## Features - **Type-safe API interactions**: Built with TypeScript for type safety and maintainability. - **Modular and reusable**: Includes predefined routes and utility hooks for common API operations. - **Seamless integration with Vue**: Designed to work flawlessly with Vue and TanStack Query. - **Error handling**: Supports Axios error handling out of the box. - **Reactive support**: Leverages Vue's `Ref` for reactivity in API queries. --- ## Installation Install the package via npm or yarn: ```bash npm install query-with-axios ``` or ```bash yarn add query-with-axios ``` --- ## Getting Started ### 1. **Axios Configuration** Before using this package, ensure you have your Axios instance configured. - [Axios Configuration Guide](https://axios-http.com/docs/intro) - [Axios Interceptor Example](https://github.com/AbdelhadiAlkayal/query-with-axios/blob/master/src/boot/axios.ts) Example Axios configuration: ```typescript // src/api/axios-config/axios.ts import axios from "axios"; export const api = axios.create({ baseURL: "https://your-api-endpoint.com", timeout: 10000, }); ``` --- ### 2. **Setup TanStack Query** Ensure you have installed TanStack Query and configured it in your Vue application: ```typescript import { VueQueryPlugin } from "@tanstack/vue-query"; const app = createApp(App); app.use(VueQueryPlugin); app.mount("#app"); ``` --- ### 3. **Usage** #### a. Define Your Routes Define your API routes and their associated methods in a TypeScript file. ```typescript import type { IResponse } from "query-with-axios"; // Example response interface export interface IGetPosts { userId: string; id: string; title: string; body: string; } // Example route interface export interface IPostsRoute { // Fetch all posts getPosts: () => IResponse<IGetPosts[]>; // Fetch a post by ID getPostById: (payload: string) => IResponse<IGetPosts>; } ``` #### b. Initialize Routes in `App.vue` ```typescript import { InitAxiosRoute, type RoutesType } from "query-with-axios"; import { api } from "./your-path/axios"; import type { IPostsRoute } from "./your-path/posts"; // Extend route definitions declare module "query-with-axios" { namespace RouteDefinitions { interface Routes { posts: IPostsRoute; } } } // Define API routes const axiosRoute: RoutesType = { posts: { getPostById: (payload) => api.get(`posts/${payload}`), getPosts: () => api.get(`posts`), }, }; // Initialize the routes InitAxiosRoute.createAxiosRoute(axiosRoute); ``` #### c. Reactivity with `useQueryWithAxios` Perform reactive GET requests with `useQueryWithAxios`: ```typescript import { ref } from "vue"; import { useQueryWithAxios } from "query-with-axios"; const postId = ref("123"); const { data, error, isLoading } = useQueryWithAxios( "posts", "getPostById", postId ); ``` #### d. Mutations with `useMutationWithAxios` Perform mutations (POST, PUT, DELETE) with `useMutationWithAxios`: ```typescript import { useMutationWithAxios } from "query-with-axios"; const { mutate } = useMutationWithAxios("posts", "getPostById"); const updatePost = (id: string) => { mutate(id, { onSuccess: (response) => { console.log("Post updated:", response.data); }, }); }; ``` --- ### Utility Interfaces #### **IAxiosData** Represents the structure of API response data. ```typescript interface IAxiosData<T> { data: T; message: string; } ``` #### **IResponse** A promise-based response structure. ```typescript type IResponse<T> = Promise<IAxiosData<T>>; ``` --- ### Utility Hooks #### `useQueryWithAxios` Performs reactive `GET` requests using TanStack Query. #### `useMutationWithAxios` Performs reactive `POST`, `PUT`, or `DELETE` operations. --- ## Folder Structure Organize your project as follows: ```plaintext src/ ├── api/ └── axios-config/ └── axios.ts // Axios configuration ├── interfaces/ └── axios.types.ts // Axios response types ├── util/ └── Route.ts // Predefined API route utilities ├── useQueryAxios.ts // Main hook for reactive GET, POST, DELETE, PUT requests ``` --- ## License MIT License © 2024 Abdelhadi Alkayal --- **Happy coding! 🎉**