🖍️
Developer Note
  • Welcome
  • Git
    • Eslint & Prettier & Stylelint & Husky
  • Programming Language
    • JavaScript
      • Script Async vs Defer
      • Module
      • Const VS Let VS Var
      • Promise
      • Event Loop
      • Execution Context
      • Hoisting
      • Closure
      • Event Buddling and Capturing
      • Garbage Collection
      • This
      • Routing
      • Debounce and Throttle
      • Web Component
      • Iterator
      • Syntax
      • String
      • Array
      • Object
      • Proxy & Reflect
      • ProtoType
      • Class
      • Immutability
      • Typeof & Instanceof
      • Npm (Node package manager)
    • TypeScript
      • Utility Type
      • Type vs Interface
      • Any vs Unknown vs Never
      • Void and undefined
      • Strict Mode
      • Namespace
      • Enum
      • Module
      • Generic
    • Python
      • Local Development
      • Uv
      • Asyncio & Event loop
      • Context Manager
      • Iterator & Generator
      • Fast API
      • Pydantic & Data Class
    • Java
      • Compilation and Execution
      • Data Type
      • Enumeration
      • Data Structure
      • Try Catch
      • InputStream and OutputStream
      • Concurrent
      • Unicode Block
      • Build Tools
      • Servlet
      • Java 8
  • Coding Pattern
    • MVC vs MVVM
    • OOP vs Functional
    • Error Handling
    • MVC vs Flux
    • Imperative vs Declarative
    • Design Pattern
  • Web Communication
    • REST API
      • Web Hook
      • CORS issue
    • HTTPS
    • GraphQL
      • REST API vs GraphQL
      • Implementation (NodeJS + React)
    • Server-Sent Event
    • Web Socket
    • IP
    • Domain Name System (DNS)
  • Frontend
    • Progressive Web App (PWA)
    • Single Page & Multiple Page Application
    • Search Engine Optimiaztion (SEO)
    • Web bundling & Micro-frontend
      • Webpack
        • Using Webpack to build React Application
        • Using Webpack to build react library
      • Vite
      • Using rollup to build react library
      • Implementing micro frontend
    • Web Security
      • CSRF & Nonce
      • XSS
      • Click hijacking
    • Cypress
    • CSS
      • Core
        • Box Model
        • Inline vs Block
        • Flexbox & Grid
        • Pseudo Class
        • Position
      • Tailwind CSS
        • Shadcn
      • CSS In JS
        • Material UI
    • React
      • Core
        • Component Pattern
        • React Lazy & Suspense
        • React Portal
        • Error Boundary
        • Rendering Methods
        • Environment Variable
        • Conditional CSS
        • Memo
        • Forward Reference
        • High Order Component (HOC) & Custom Hook
        • TypeScript
      • State Management
        • Redux
        • Recoil
        • Zustand
      • Routing
        • React Router Dom
      • Data Fetching
        • Axios & Hook
        • React Query
        • Orval
      • Table
        • React Table
      • Form & Validation
        • React Hook Form
        • Zod
      • NextJS
        • Page Router
        • App Router
      • React Native
    • Angular
    • Svelte
      • Svelte Kit
  • Backend
    • Cache
      • Browser Cache
      • Web Browser Storage
      • Proxy
      • Redis
    • Rate limit
    • Monitoring
      • Logging
      • Distributed Tracing
    • Load Test
    • Encryption
    • Authentication
      • Password Protection
      • Cookie & Session
      • JSON Web Token
      • SSO
        • OAuth 2.0
        • OpenID Connect (OIDC)
        • SAML
    • Payment
      • Pre-built
      • Custom
    • File Handling
      • Upload & Download (Front-end)
      • Stream & Buffer
    • Microservice
      • API Gateway
      • Service Discovery
      • Load Balancer
      • Circuit Breaker
      • Message Broker
      • BulkHead & Zipkin
    • Elastic Search
    • Database
      • SQL
        • Group By vs Distinct
        • Index
        • N + 1 problem
        • Normalization
        • Foreign Key
        • Relationship
        • Union & Join
        • User Defined Type
      • NOSQL (MongoDB)
      • Transaction
      • Sharding
      • Lock (Concurrency Control)
    • NodeJS
      • NodeJS vs Java Spring
      • ExpressJS
      • NestJS
        • Swagger
        • Class Validator & Validation Pipe
        • Passport (Authentication)
      • Path Module
      • Database Connection
        • Integrating with MYSQL
        • Sequalize
        • Integrating with MongoDB
        • Prisma
        • MikroORM
        • Mongoose
      • Streaming
      • Worker Thread
      • Passport JS
      • JSON Web Token
      • Socket IO
      • Bull MQ
      • Pino (Logging)
      • Yeoman
    • Spring
      • Spring MVC
      • Spring REST
      • Spring Actuator
      • Aspect Oriented Programming (AOP)
      • Controller Advice
      • Filter
      • Interceptor
      • Concurrent
      • Spring Security
      • Spring Boot
      • Spring Cloud
        • Resilience 4j
      • Quartz vs Spring Batch
      • JPA and Hibernate
      • HATEOS
      • Swagger
      • Unit Test (Java Spring)
      • Unit Test (Spring boot)
  • DevOp
    • Docker
    • Kubernetes
      • Helm
    • Nginx
    • File System
    • Cloud
      • AWS
        • EC2 (Virtual Machine)
        • Network
        • IAM
          • Role-Service Binding
        • Database
        • Route 53
        • S3
        • Message Queue
        • Application Service
        • Serverless Framework
        • Data Analysis
        • Machine Learning
        • Monitoring
        • Security
      • Azure
        • Identity
        • Compute Resource
        • Networking
        • Storage
        • Monitoring
      • Google Cloud
        • IAM
          • Workload Identity Federation
        • Compute Engine
        • VPC Network
        • Storage
        • Kubernetes Engine
        • App Engine
        • Cloud function
        • Cloud Run
        • Infra as Code
        • Pub/Sub
    • Deployment Strategy
    • Jenkins
    • Examples
      • Deploy NextJS on GCP
      • Deploy Spring on Azure
      • Deploy React on Azure
  • Domain Knowledge
    • Web 3
      • Blockchain
      • Cryptocurrency
    • AI
      • Prompt
      • Chain & Agent
      • LangChain
      • Chunking
      • Search
      • Side Products
Powered by GitBook
On this page
  • Introduction
  • Configuration
  • Generated File

Was this helpful?

  1. Frontend
  2. React
  3. Data Fetching

Orval

Introduction

  • orval is able to generate client with appropriate type-signatures (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in yaml or json formats.

Configuration

orval.config.js
const { defineConfig } = require("orval");
module.exports = defineConfig({
  "famchest-api": {
    input: "https://dty6p2hiuf.us-east-1.awsapprunner.com/api-json",
    output: {
      mode: "tags-split",
      // generate type into a singgle file
      target: "./src/api/famchest.ts",
      // generate type into multiple files on same directory
      // schemas: "./lib/model",
      client: "react-query",
      prettier: true,
      // override the react-query fetching function
      override: {
        mutator: {
          path: "./src/api/fetcher.ts",
          name: "fetcher",
        },
      },
    },
  },
});
npx orval

Generated File

  • Type

famchest.schemas.ts
export interface CreateProfileDto { [key: string]: unknown }

export interface PageDto {
  count: number;
}

export interface Profile {
  /** Profile ID */
  id: string;
  /** Shopify ID */
  shopifyId?: string;
  /** Gender */
  gender?: string;
  /** Phone */
  phone?: string;
  /** HKID */
  hkid?: string;
  /** Octopus */
  octopus?: string;
  /** Address 1 */
  address1?: string;
  /** Address 2 */
  address2?: string;
  /** Referrer */
  referrer?: string;
  /** Emergency Contact Name */
  emergencyContactName?: string;
  /** Emergency Contact Phone */
  emergencyContactPhone?: string;
  /** Beneficiary Name */
  beneficiaryName?: string;
  /** Beneficiary HKID */
  beneficiaryHkid?: string;
  /** Beneficiary Phone */
  beneficiaryPhone?: string;
  /** Email */
  email?: string;
  /** Famchest Username */
  famchestUsername?: string;
  /** Year of Birth */
  yearOfBirth?: number;
  /** Day of Birth */
  dayOfBirth?: number;
  /** Month of Birth */
  monthOfBirth?: number;
  /** Name */
  name?: string;
  /** Receive Promotion */
  receivePromotion?: boolean;
  /** Emergency Contact Relation */
  emergencyContactRelation?: string;
  /** Avatar Path */
  avatarPath?: string;
}
// ...
  • React query hooks

    /**
     * Generated by orval v7.8.0 🍺
     * Do not edit manually.
     * Famchest API
     * Famchest API description
     * OpenAPI spec version: 1.0
     */
    import { useQuery } from "@tanstack/react-query";
    
    import { fetcher } from ".././fetcher";
    
    import type { ErrorType } from ".././fetcher";
    import type {
      DataTag,
      DefinedInitialDataOptions,
      DefinedUseQueryResult,
      QueryClient,
      QueryFunction,
      QueryKey,
      UndefinedInitialDataOptions,
      UseQueryOptions,
      UseQueryResult,
    } from "@tanstack/react-query";
    
    type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];
    
    // the fetching function
    export const appControllerGetHello = (
      options?: SecondParameter<typeof fetcher>,
      signal?: AbortSignal,
    ) => {
      return fetcher<string>({ url: `/`, method: "GET", signal }, options);
    };
    
    // query key, mainly using api path as key
    export const getAppControllerGetHelloQueryKey = () => {
      return [`/`] as const;
    };
    
    // declare query option and apply query function and query key
    export const getAppControllerGetHelloQueryOptions = <
      TData = Awaited<ReturnType<typeof appControllerGetHello>>,
      TError = ErrorType<unknown>,
    >(options?: {
      query?: Partial<
        UseQueryOptions<
          Awaited<ReturnType<typeof appControllerGetHello>>,
          TError,
          TData
        >
      >;
      request?: SecondParameter<typeof fetcher>;
    }) => {
      const { query: queryOptions, request: requestOptions } = options ?? {};
    
      const queryKey = queryOptions?.queryKey ?? getAppControllerGetHelloQueryKey();
    
      const queryFn: QueryFunction<
        Awaited<ReturnType<typeof appControllerGetHello>>
      > = ({ signal }) => appControllerGetHello(requestOptions, signal);
    
      return { queryKey, queryFn, ...queryOptions } as UseQueryOptions<
        Awaited<ReturnType<typeof appControllerGetHello>>,
        TError,
        TData
      > & { queryKey: DataTag<QueryKey, TData, TError> };
    };
    
    // result type
    export type AppControllerGetHelloQueryResult = NonNullable<
      Awaited<ReturnType<typeof appControllerGetHello>>
    >;
    
    // error type
    export type AppControllerGetHelloQueryError = ErrorType<unknown>;
    
    // react query hook type
    export function useAppControllerGetHello<
      TData = Awaited<ReturnType<typeof appControllerGetHello>>,
      TError = ErrorType<unknown>,
    >(
      options: {
        query: Partial<
          UseQueryOptions<
            Awaited<ReturnType<typeof appControllerGetHello>>,
            TError,
            TData
          >
        > &
          Pick<
            DefinedInitialDataOptions<
              Awaited<ReturnType<typeof appControllerGetHello>>,
              TError,
              Awaited<ReturnType<typeof appControllerGetHello>>
            >,
            "initialData"
          >;
        request?: SecondParameter<typeof fetcher>;
      },
      queryClient?: QueryClient,
    ): DefinedUseQueryResult<TData, TError> & {
      queryKey: DataTag<QueryKey, TData, TError>;
    };
    export function useAppControllerGetHello<
      TData = Awaited<ReturnType<typeof appControllerGetHello>>,
      TError = ErrorType<unknown>,
    >(
      options?: {
        query?: Partial<
          UseQueryOptions<
            Awaited<ReturnType<typeof appControllerGetHello>>,
            TError,
            TData
          >
        > &
          Pick<
            UndefinedInitialDataOptions<
              Awaited<ReturnType<typeof appControllerGetHello>>,
              TError,
              Awaited<ReturnType<typeof appControllerGetHello>>
            >,
            "initialData"
          >;
        request?: SecondParameter<typeof fetcher>;
      },
      queryClient?: QueryClient,
    ): UseQueryResult<TData, TError> & {
      queryKey: DataTag<QueryKey, TData, TError>;
    };
    export function useAppControllerGetHello<
      TData = Awaited<ReturnType<typeof appControllerGetHello>>,
      TError = ErrorType<unknown>,
    >(
      options?: {
        query?: Partial<
          UseQueryOptions<
            Awaited<ReturnType<typeof appControllerGetHello>>,
            TError,
            TData
          >
        >;
        request?: SecondParameter<typeof fetcher>;
      },
      queryClient?: QueryClient,
    ): UseQueryResult<TData, TError> & {
      queryKey: DataTag<QueryKey, TData, TError>;
    };
    
    // react query hook implementation
    export function useAppControllerGetHello<
      TData = Awaited<ReturnType<typeof appControllerGetHello>>,
      TError = ErrorType<unknown>,
    >(
      options?: {
        query?: Partial<
          UseQueryOptions<
            Awaited<ReturnType<typeof appControllerGetHello>>,
            TError,
            TData
          >
        >;
        request?: SecondParameter<typeof fetcher>;
      },
      queryClient?: QueryClient,
    ): UseQueryResult<TData, TError> & {
      queryKey: DataTag<QueryKey, TData, TError>;
    } {
      const queryOptions = getAppControllerGetHelloQueryOptions(options);
    
      const query = useQuery(queryOptions, queryClient) as UseQueryResult<
        TData,
        TError
      > & { queryKey: DataTag<QueryKey, TData, TError> };
    
      query.queryKey = queryOptions.queryKey;
    
      return query;
    }
PreviousReact QueryNextTable

Last updated 5 days ago

Was this helpful?