veza/apps/web/orval.config.ts
senke a170504784
Some checks failed
Veza CI / Backend (Go) (push) Failing after 0s
Veza CI / Frontend (Web) (push) Failing after 0s
Veza CI / Rust (Stream Server) (push) Failing after 0s
Frontend CI / test (push) Failing after 0s
Security Scan / Secret Scanning (gitleaks) (push) Failing after 0s
Veza CI / Notify on failure (push) Failing after 0s
chore(web): install orval + mutator for OpenAPI code generation (v1.0.8 P1)
Phase 1 of the OpenAPI typegen migration. Brings orval@8.8.1 into the
monorepo (workspace-hoisted) and wires a custom mutator so generated
calls route through the existing Axios instance — interceptors for
auth / CSRF / retry / offline-queue / logging keep firing unchanged.

200 .ts files generated from veza-backend-api/openapi.yaml (3441 LOC),
covering 13 tags (auth, track, user, playlist, marketplace, chat,
dashboard, webhook, validation, logging, audit, comment, users).

Changes:

- apps/web/orval.config.ts (NEW): generator config, output
  src/services/generated/, tags-split mode, vezaMutator.
- apps/web/src/services/api/orval-mutator.ts (NEW): translates
  orval's (url, RequestInit) convention into AxiosRequestConfig
  then apiClient. Forwards AbortSignal for React Query cancellation.
- apps/web/scripts/generate-types.sh: runs BOTH generators during
  the migration (legacy typescript-axios + orval). B9 drops step 1.
- apps/web/scripts/check-types-sync.sh: extended to check drift on
  both output trees.
- apps/web/eslint.config.js: ignores src/services/generated/
  (orval emits overloaded function declarations that trip no-redeclare).
- .gitignore: narrowed the bare `api` SELinux rule to `/api` plus
  `/veza-backend-api/api`. The old rule silently ignored
  apps/web/src/services/api/ new files including orval-mutator.ts.
- apps/web/package.json + package-lock.json: orval@^8.8.1 added
  as devDependency, plus @commitlint/cli + @commitlint/config-conventional
  (referenced by .husky/commit-msg but missing from deps).

Out of scope: no hand-written service changes. Pilot developer.ts
lands in B2, bulk migration in B3-B8, cleanup in B9.

npm run typecheck and npm run lint both green (0 errors).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 00:18:14 +02:00

50 lines
1.8 KiB
TypeScript

/**
* orval configuration — OpenAPI client generation for Veza frontend.
*
* v1.0.8 Phase 1 (B1). Generates typed Axios services + React Query hooks
* from `veza-backend-api/openapi.yaml` (produced by swaggo). Output lives
* alongside hand-written services during the migration, then supersedes
* them in Phase 3.
*
* Design choices (cf. /home/senke/.claude/plans/audit-fonctionnel-wild-hickey.md D8):
* - client: 'react-query' → emits hooks directly (useXxx / useXxxMutation)
* - mode: 'tags-split' → one folder per `@Tags` → smaller bundles + easier diff
* - mutator: './src/services/api/orval-mutator.ts' vezaMutator
* Routes every generated call through the existing Axios instance so
* auth / retry / CSRF / offline-queue interceptors keep applying.
* - mock: false → MSW handlers stay manual (endpoint-shape
* matching, not spec-schema matching). Phase 2
* may revisit once drift is eliminated.
*
* Run: npx orval --config orval.config.ts
* Or: npm run generate:types (check-types-sync.sh → scripts/generate-types.sh)
*/
import { defineConfig } from 'orval';
export default defineConfig({
veza: {
input: {
target: '../../veza-backend-api/openapi.yaml',
},
output: {
target: 'src/services/generated/veza.ts',
schemas: 'src/services/generated/model',
client: 'react-query',
mode: 'tags-split',
mock: false,
prettier: true,
clean: true,
override: {
mutator: {
path: './src/services/api/orval-mutator.ts',
name: 'vezaMutator',
},
query: {
useQuery: true,
useMutation: true,
signal: true,
},
},
},
},
});