import { defineConfig } from 'orval'; const SKIP = new Set(['public', 'api', 'v1', 'v2', 'v3']); const VERB_PREFIX: Record = { get: 'get', post: 'create', put: 'update', patch: 'patch', delete: 'delete', }; // Converts path + HTTP verb → semantic camelCase name. // GET /users/public/{id}/posts → getUsersByIdPosts // POST /public/auth/login → createAuthLogin export function buildOperationName( _operation: unknown, route: string, verb: string, ): string { const prefix = VERB_PREFIX[verb] ?? verb; const parts = route .replace(/\{([^}]+)\}/g, (_, p) => 'By' + p.charAt(0).toUpperCase() + p.slice(1), ) .split('/') .filter((s) => s && !SKIP.has(s)) .map((s) => s .charAt(0) .toUpperCase() .concat(s.slice(1)) .replace(/-([a-z])/g, (_, c) => c.toUpperCase()), ); const deduped = parts.filter((p, i) => p !== parts[i - 1]); return prefix + deduped.join(''); } export default defineConfig({ api: { input: { // Replace with your OpenAPI/Swagger schema URL or local file path. target: process.env.OPENAPI_TARGET ?? 'http://localhost:8080/v3/api-docs', }, output: { mode: 'tags-split', target: 'services/generated', schemas: 'services/generated/model', client: 'react-query', httpClient: 'axios', baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL, override: { operationName: buildOperationName, mutator: { path: 'services/httpClient/orvalMutator.ts', name: 'customMutator', }, query: { useQuery: true, useMutation: true, signal: true, }, }, }, }, });