Skip to content

ci(frontend-store): generate frontend API client from committed OpenAPI contract#185

Open
spah-soptim wants to merge 1 commit into
chore/RDFA-483-central-frontend-storefrom
chore/RDFA-483-central-frontend-store-cicd
Open

ci(frontend-store): generate frontend API client from committed OpenAPI contract#185
spah-soptim wants to merge 1 commit into
chore/RDFA-483-central-frontend-storefrom
chore/RDFA-483-central-frontend-store-cicd

Conversation

@spah-soptim

Copy link
Copy Markdown
Member

Summary

The frontend now calls the backend through a typed client generated by @hey-api/openapi-ts from the backend's OpenAPI spec. The generated client (frontend/src/lib/api/generated) is git-ignored and was produced from a running backend at localhost:8080, so frontend build, lint and the Docker image had no way to obtain it in CI.

  • Backend: add gated OpenApiSpecExportTest (-Dopenapi.export=true) that writes a deterministic frontend/openapi.json (sorted keys, sorted required arrays, fixed newline, servers stripped). Skipped by default.
  • Frontend: openapi-ts.config.ts reads ./openapi.json by default, override with OPENAPI_INPUT for live-backend generation; ignore the spec and generated client in prettier; generate the client in the Dockerfile.
  • CI: frontend-ci and publish-test-images generate the client after install; backend-ci re-exports the spec and diff-checks it so the committed contract can never drift from the controllers.

The frontend now calls the backend through a typed client generated by
@hey-api/openapi-ts from the backend's OpenAPI spec. The generated client
(frontend/src/lib/api/generated) is git-ignored and was produced from a
running backend at localhost:8080, so frontend build, lint and the Docker
image had no way to obtain it in CI.

Commit the spec as a contract and generate the client offline from it:

- Backend: add gated OpenApiSpecExportTest (-Dopenapi.export=true) that
  writes a deterministic frontend/openapi.json (sorted keys, sorted
  required arrays, fixed newline, servers stripped). Skipped by default.
- Frontend: openapi-ts.config.ts reads ./openapi.json by default, override
  with OPENAPI_INPUT for live-backend generation; ignore the spec and
  generated client in prettier; generate the client in the Dockerfile.
- CI: frontend-ci and publish-test-images generate the client after
  install; backend-ci re-exports the spec and diff-checks it so the
  committed contract can never drift from the controllers.
@spah-soptim spah-soptim requested a review from tarn-soptim June 18, 2026 15:48
@spah-soptim

Copy link
Copy Markdown
Member Author

@tarn-soptim, added generation for the openapi spec and implemented in backend ci that it fails if out of date.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant