From 542a01fa20dd66638f78be33e374a9105809116a Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Thu, 23 Jul 2026 12:03:21 +0200 Subject: [PATCH] API: generate /api/state documentation from UI types (#31530) --- .github/workflows/documentation.yml | 2 +- .github/workflows/openapi-validate.yml | 3 +- .gitignore | 1 + .../components/ChargingPlans/ChargingPlan.vue | 4 +- .../ChargingPlans/ChargingPlanModal.vue | 8 +- .../components/ChargingPlans/PlanStrategy.vue | 2 +- .../ChargingPlans/PlansRepeatingSettings.vue | 2 +- .../ChargingPlans/PlansSettings.vue | 16 +- .../js/components/ChargingPlans/Warnings.vue | 3 +- assets/js/components/ChargingPlans/types.d.ts | 39 - assets/js/components/Forecast/Chart.vue | 3 +- assets/js/components/Forecast/GridDetails.vue | 3 +- assets/js/components/Forecast/PriceChart.vue | 3 +- assets/js/components/Forecast/SolarChart.vue | 2 +- .../js/components/Forecast/SolarDetails.vue | 2 +- assets/js/components/Forecast/ValueChart.vue | 2 +- .../js/components/Forecast/ValueDetails.vue | 2 +- assets/js/components/Forecast/echarts.ts | 2 +- assets/js/components/Forecast/types.ts | 27 - assets/js/components/Loadpoints/Loadpoint.vue | 2 +- .../js/components/Tariff/SmartCostLimit.vue | 3 +- assets/js/components/Vehicles/Title.vue | 2 +- assets/js/components/Vehicles/Vehicle.vue | 2 +- assets/js/types/evcc.ts | 627 +- assets/js/utils/forecast.ts | 2 +- cmd/openapi/openapi.go | 28 - eslint.config.mts | 1 + go.mod | 1 - package-lock.json | 412 +- package.json | 10 +- scripts/state-schema/index.ts | 33 + scripts/state-schema/openapi.ts | 40 + scripts/state-schema/schemas.ts | 221 + scripts/state-schema/validate.ts | 114 + server/mcp/openapi.json | 8445 +++++++++++------ server/mcp/openapi.md | 44 +- server/openapi.go | 3 +- server/openapi.state.yaml | 1814 ++++ server/openapi.yaml | 176 +- server/openapi_test.go | 1 + tests/state-api.spec.ts | 28 + tsconfig.json | 2 +- 42 files changed, 8786 insertions(+), 3351 deletions(-) delete mode 100644 assets/js/components/ChargingPlans/types.d.ts delete mode 100644 assets/js/components/Forecast/types.ts delete mode 100644 cmd/openapi/openapi.go create mode 100644 scripts/state-schema/index.ts create mode 100644 scripts/state-schema/openapi.ts create mode 100644 scripts/state-schema/schemas.ts create mode 100644 scripts/state-schema/validate.ts create mode 100644 server/openapi.state.yaml create mode 100644 tests/state-api.spec.ts diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 37d36e1a4..f5dc4598c 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -58,7 +58,7 @@ jobs: - name: Prepare OpenAPI spec run: | mkdir -p ./openapi-deploy - cp ./server/openapi.yaml ./openapi-deploy/openapi.yaml + npx --yes @redocly/cli@2 bundle ./server/openapi.yaml -o ./openapi-deploy/openapi.yaml - name: Deploy OpenAPI spec to docs repo uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4 diff --git a/.github/workflows/openapi-validate.yml b/.github/workflows/openapi-validate.yml index 6e0999ad6..3a6176d76 100644 --- a/.github/workflows/openapi-validate.yml +++ b/.github/workflows/openapi-validate.yml @@ -8,6 +8,7 @@ on: pull_request: paths: - "server/openapi.yaml" + - "server/openapi.state.yaml" - ".github/workflows/openapi-validate.yml" jobs: @@ -22,4 +23,4 @@ jobs: with: go-version: stable - name: Validate OpenAPI spec - run: go run github.com/getkin/kin-openapi/cmd/validate@v0.133.0 -- server/openapi.yaml + run: go run github.com/getkin/kin-openapi/cmd/validate@v0.133.0 -ext -- server/openapi.yaml diff --git a/.gitignore b/.gitignore index 48573ca2a..dd0405372 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ testdata/**/* !assets/js/**/*.yaml !package*.json !evcc.dist.yaml +!server/openapi.state.yaml !.coderabbit.yaml !tests/**/*.evcc.yaml !tests/**/*.tpl.yaml diff --git a/assets/js/components/ChargingPlans/ChargingPlan.vue b/assets/js/components/ChargingPlans/ChargingPlan.vue index ab3edd481..96eeda0bc 100644 --- a/assets/js/components/ChargingPlans/ChargingPlan.vue +++ b/assets/js/components/ChargingPlans/ChargingPlan.vue @@ -38,9 +38,7 @@ import formatter from "@/mixins/formatter"; import minuteTicker from "@/mixins/minuteTicker"; import { optionStep, fmtEnergy } from "@/utils/energyOptions.ts"; import { defineComponent, type PropType } from "vue"; -import type { CURRENCY, Vehicle } from "@/types/evcc"; -import type { PlanStrategy } from "./types"; -import type { Forecast } from "@/types/evcc.ts"; +import type { CURRENCY, Forecast, PlanStrategy, Vehicle } from "@/types/evcc"; export default defineComponent({ name: "ChargingPlan", diff --git a/assets/js/components/ChargingPlans/ChargingPlanModal.vue b/assets/js/components/ChargingPlans/ChargingPlanModal.vue index bc019dd27..9a4784ebe 100644 --- a/assets/js/components/ChargingPlans/ChargingPlanModal.vue +++ b/assets/js/components/ChargingPlans/ChargingPlanModal.vue @@ -47,13 +47,17 @@ import GenericModal from "../Helper/GenericModal.vue"; import PlansSettings from "./PlansSettings.vue"; import api from "@/api"; import type { + CURRENCY, + Forecast, PlanStrategy, RepeatingPlan, + SMART_COST_TYPE, StaticEnergyPlan, StaticPlan, StaticSocPlan, -} from "./types"; -import type { CURRENCY, Forecast, SMART_COST_TYPE, UiLoadpoint, Vehicle } from "@/types/evcc"; + UiLoadpoint, + Vehicle, +} from "@/types/evcc"; export default defineComponent({ name: "ChargingPlanModal", diff --git a/assets/js/components/ChargingPlans/PlanStrategy.vue b/assets/js/components/ChargingPlans/PlanStrategy.vue index a8014a76b..0e63f3f83 100644 --- a/assets/js/components/ChargingPlans/PlanStrategy.vue +++ b/assets/js/components/ChargingPlans/PlanStrategy.vue @@ -64,7 +64,7 @@