Skip to content

Swagger Codegen

mobx-tanstack-query-api

This project is based on swagger-typescript-api

Github: https://github.com/js2me/mobx-tanstack-query-api
NPM: http://npmjs.org/package/mobx-tanstack-query-api

WARNING

Currently mobx-tanstack-query-api is a WIP project.
This is not production ready.

Steps to use

Install

bash
npm install mobx-tanstack-query-api
bash
pnpm add mobx-tanstack-query-api
bash
yarn add mobx-tanstack-query-api

Create configuration file

Create a codegen configuration file with file name api-codegen.config.(js|mjs) at root of your project.
Add configuration using defineConfig

ts
import { defineConfig } from "mobx-tanstack-query-api/cli";
import { fileURLToPath } from "url";
import path from "path";

const __filename = fileURLToPath(import.meta.url); 
const __dirname = path.dirname(__filename);

export default defineConfig({
  // input: path.resolve(__dirname, './openapi.yaml'),
  input: "http://yourapi.com/url/openapi.yaml",
  output: path.resolve(__dirname, 'src/shared/api/__generated__'),
  httpClient: 'builtin',
  queryClient: 'builtin',
  endpoint: 'builtin',
  // namespace: 'collectedName',
  groupBy: 'tag',
  // groupBy: 'tag-1',
  // groupBy: 'path-segment',
  // groupBy: 'path-segment-1',
  filterEndpoints: () => true,
  // groupBy:  route => {
  //   const api = apis.find(api => api.urls.some(url => route.raw.route.startsWith(url)))
  //   return api?.name ?? 'other'
  // },
  formatExportGroupName: (groupName) => `${groupName}Api`,
})

Add script to package.json

json
...
"scripts": {
  ...
  "dev:api-codegen": "mobx-tanstack-query-api"
  ...
}
...

Run codegen

bash
npm run dev:api-codegen
bash
pnpm dev:api-codegen
bash
yarn dev:api-codegen

Use queries and mutations

ts
import {
  getFruits,
  createFruit,
  Tag,
} from "@/shared/api/__generated__";

export const fruitsQuery = getFruits.toQuery({
  enableOnDemand: true,
  params: {},
})

export const fruitCreateMutation = createFruit.toMutation({
  invalidateEndpoints: {
    tag: [Tag.Fruits]
  }
})

Another example with classes

ts
import { getFruits } from "@/shared/api/__generated__";

export class Fruits {
  private abortController = new AbortController();

  @observable
  accessor private params =  {
    search: ''
  }

  private fruitsQuery = getFruits.toQuery({
    abortSignal: this.abortController.signal,
    enableOnDemand: true,
    params: () => ({
      query: {
        search: this.params.search
      }
    }),
  })

  constructor(abortSignal?: AbortSignal) {
    // or you can use linked-abort-controller package
    abortSignal.addEventListener('abort', () => {
      this.abortController.abort();
    })
  }

  @computed.struct
  get data() {
    return this.fruitsQuery.result.data || [];
  }

  @computed.struct
  get isLoading() {
    return this.fruitsQuery.result.isLoading
  }

  destroy() {
    this.abortController.abort();
  }
}


const fruits = new FruitsModel();

console.log(fruits.data); // enable query

Released under the MIT License.