@dloizides/orval-preset
v1.0.1
Published
Shared Orval generation setup for the dloizides.com SaaS frontends: a 6-API config factory (defineOrvalConfig), the per-service mutator registry, and the axios-bridge createHttpClient factory (transport injected as a port). Owned shape erevna-web and kata
Downloads
232
Maintainers
Readme
@dloizides/orval-preset
Shared Orval generation setup for the dloizides.com SaaS
frontends (erevna-web + katalogos-web).
Both apps generate React Query hooks from the same six OpenAPI services
(onlineMenu / identity / questioner / content / notification / payment) with a
byte-for-byte identical config, mutator registry, and axios-bridge http client.
This package owns that shared shape. Each app keeps only its own
swagger/*.json inputs, output paths, and the generated client dirs.
Surface
| Export | When | Purpose |
| --- | --- | --- |
| defineOrvalConfig(opts) | build-time | Builds the 6-API Orval config from app paths. |
| customInstance, identityInstance, questionerInstance, contentInstance, notificationInstance, paymentInstance | runtime | The mutators referenced by the generated hooks; they delegate to the registry. |
| registerMutators / getMutator | runtime | The registry the app populates at startup with the real http clients. |
| createHttpClient(httpService, opts) | runtime | Axios-bridge factory; the app injects its own httpService transport (port). |
Build-time: orval.config.js
const { defineOrvalConfig } = require('@dloizides/orval-preset');
module.exports = defineOrvalConfig({
swaggerDir: './src/server/swagger',
outDir: './src/server/autoGeneratedHooks',
mutatorPath: './src/server/mutators',
});mutatorPath is the directory the generated hooks import their mutator from.
Keep a thin local shim at that path that re-exports from this package, so the
generated import paths stay stable across regenerations:
// src/server/mutators/onlineMenuMutator.ts
export { customInstance, customInstance as default } from '@dloizides/orval-preset';Runtime: registration + http client
// src/server/httpClient.ts
import { createHttpClient } from '@dloizides/orval-preset';
import * as httpService from '../lib/httpService';
import { BFF_API_BASE } from './bffRoutes';
export const customInstance = createHttpClient(httpService, {
baseURL: BFF_API_BASE.menus,
withCredentials: true,
});// app entry point
import { registerMutators } from '@dloizides/orval-preset';
import { customInstance } from './server/httpClient';
// …the other five httpClient* files…
registerMutators({ customInstance /* , … */ });The httpService port must expose get / post / postForm / put /
patch / deleteMethod (the surface the apps' axios bridge already provides).
Why a port, not a baked-in axios
createHttpClient takes the transport as an argument so the package never
imports a product, a realm, or a concrete axios instance. The app's UI axios
(@dloizides/bff-web-client) and this mutator transport remain separate
instances by design; unifying them is a future optimization.
