Skip to content

Commit 14e7239

Browse files
feat(spec)!: retire the docs-viewer keys — ApiDocumentationConfig.ui and the REST API plugin's openApi.uiPath / uiFramework (ADR-0049) (#25180)
Fixes #25159 Clause-②: no (narrowing) Metadata-protocol: narrowed Dispatched by the `domain:spec` seat 1 PM (claim `6333051310`), executed through the `spec-property-retirement` kit. Ruling executed: triage route A, record `6332269878` (retire with tombstones and an ADR-0087 entry, no staged window), following the maintainer's 「C 下线页面」 on #25104 (`6317642533`). ## What changed Three keys declared an HTML API documentation viewer that nothing ever served. Each is now a `retiredKey()` tombstone: a `tsc` error at the authoring site and a parse error at the key's path whose message is the prescription. | Key (authored as) | Def key | Was | |:--|:--|:--| | `ApiDocumentationConfig.ui` | `api/ApiDocumentationConfig:ui` | `ApiTestingUiConfigSchema.optional()`, "Testing UI configuration" | | `RestApiPluginConfig.openApi.uiPath` | `api/OpenApiGenerationConfig:uiPath` | `z.string().default('/api/docs')`, "URL path to serve documentation UI" | | `RestApiPluginConfig.openApi.uiFramework` | `api/OpenApiGenerationConfig:uiFramework` | `z.enum(['swagger-ui','redoc','rapidoc','elements']).default('swagger-ui')` | The orphan value defs `api/ApiTestingUiConfig` and `api/ApiTestingUiType` leave whole, with their exports `ApiTestingUiConfigSchema`, `ApiTestingUiConfig`, `ApiTestingUiConfigParsed` and `ApiTestingUiType` (kit §4, "orphan value schema"). Each prescription names the mechanism that is live: the OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on. Example, `uiPath`: "`RestApiPluginConfig.openApi.uiPath` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no documentation viewer was ever served at its path, the `/api/docs` default included, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at …" ### `uiFramework`: an in-place addition, not named on the card `uiFramework` sits one line below `uiPath` on the same schema and selects the viewer `uiPath` would have served. All four in-place conditions hold: ① same defect class (a viewer declaration with no viewer); ② mechanical, with the shape fixed by `uiPath` beside it; ③ the file is inside this claim's surface; ④ same gates, no new verification surface. Evidence: zero identifier hits outside `packages/spec` here and in objectui at its pin (readings below). Leaving it would keep the declaration the ruling removed: a framework choice for a viewer the platform does not serve, with a `swagger-ui` default materialised on every parse. It is a third narrowed key, so the maintainer report for this round should list it. ## Hypotheses, as measured - **H1 (no reader): holds.** At `origin/main` `b93c750c7`, `git grep -nE "ApiTestingUi|uiPath|documentation\.ui"` outside `packages/spec`, `content/docs/references` and `CHANGELOG.md` finds 2 hits, both `packages/rest/src/ui-routes.ts:79,85`: a local `uiPath` variable for the unrelated `/ui/view` route. `uiFramework`, `enableTryItOut` and `OpenApiGenerationConfig` find 0 each. Controls on the same instrument: `enableOpenApi` 16 and `generateOpenApi` 8. objectui at the pinned `.objectui-sha` `56cf4d8e89`: 0 for `ApiTestingUi|uiPath|uiFramework|documentation\.ui|ApiDocumentationConfig|OpenApiGenerationConfig|enableTryItOut`, against controls `@objectstack/spec/api` 103 and `openapi\.json` 12. So no objectui follow-up is owed. Inside `packages/spec`, nothing parses `ApiDocumentationConfigSchema`, `OpenApiGenerationConfigSchema` or `RestApiPluginConfigSchema` outside their own unit tests. The only importer is the `api` barrel. - **H2 (which def): holds.** `uiPath` is on `OpenApiGenerationConfigSchema` (`api/OpenApiGenerationConfig:uiPath`), which `RestApiPluginConfigSchema.openApi` embeds, so an author writes `RestApiPluginConfig.openApi.uiPath`. The pin asserts the refusal at both doors, the second located at `openApi.uiPath`. - **H3 (orphans): holds.** `ApiTestingUiConfigSchema` / `ApiTestingUiType` have no consumer besides `ui`. In this tree the only other references were their own unit tests and the ADR-0122 isomorphic pin line. They leave whole, so `api-surface/` moves. - **H4 (served path): refined.** The card's "`/openapi.json`" is incomplete. `registerRoutes` calls `registerOpenApiEndpoints(getApiBasePath())` while `api.enableOpenApi` is on, and `getApiBasePath()` = `apiPath ?? basePath/version`, so the route is `GET /api/v1/openapi.json` by default (`packages/rest/src/openapi-endpoints-read-decorations.test.ts:221` reads that route). The prescription spells the default path and says it follows `api.basePath` / `api.version`. - **H5 (family entry): own family.** New D3 entry `api-docs-viewer-keys-retired`. It is not folded into `rest-api-config-dead-keys-retired` (PR #25162), for three reasons. Those keys sit on `RestApiConfigSchema`, the REST server's construction argument, and were dead in the `rest_api` liveness census. These sit on two other schemas and retire because the viewer was taken offline. Different surface, different ruling. That landed entry is not edited. - **H6 (sibling estimate): re-measured, holds.** The H1 readings above were re-taken on this branch's base, not inherited. ## Kit surfaces - **Schema**: three tombstones with retirement records in `documentation.zod.ts` / `plugin-rest-api.zod.ts`, and the module and `@example` docblocks no longer show a viewer. - **Orphan defs**: both deleted. The `json-schema.manifest/` ratchet fired first, as the kit predicts for a whole-def removal, and the two manifest keys are removed deliberately. - **ADR-0087**: `RETIRED_KEYS_BY_MAJOR[18]` gets 3 entry files and `RETIRED_DEFS_BY_MAJOR[18]` gets 2. There is one D3 semantic entry, plus its `STEP18_RATIONALE` fragment (`order: 108`, inserted at its id's sort position). **No D2 conversion**: neither config is a stack collection member or a `sys_metadata` row, so no conversion seam would ever see one. This is the `kernel/Manifest:loading` disposition, the same one the `handlerStatus` and `rest-api-config` retirements on these files took. The defaults on `uiPath` / `uiFramework` leave no residue window, because nothing parses this config into a stored or built artifact. The old defaults are refused like any other value. - **Liveness ledger**: n/a. No ledger walks `ApiDocumentationConfigSchema` or `OpenApiGenerationConfigSchema`: neither is a registry type nor in `SPEC_ONLY_SCHEMAS`. So there is no row to keep `dead`. - **Generated**: `authorable-surface/api.json` has 3 `[RETIRED]` rows and the 12 `api/ApiTestingUiConfig:*` rows deleted. Gate (a) printed them, and check (c) accepted the deletion because the whole def leaves. Also regenerated: `authorable-defaults/api.json` (10 default rows), `json-schema.manifest/api.json` (2 defs), `api-surface/api.json` (5 exports), `export-origins/` and `declaration-map/`, the strictness-ledger counts, and the reference pages `api/documentation`, `api/plugin-rest-api` and `references/index` (1544 to 1542 schemas). All of these came from `check:generated --fix`. - **Forms / i18n / CLI advisory lint / examples / published skills / hand-written docs**: none teach either key (grep, 0 hits). - **`REST_API_PLUGIN.md`**: the example drops `uiPath` / `uiFramework`, the "Multiple UI frameworks" feature bullet is gone, and a paragraph names the document path. - **Spec Shape Gate registry**: not owed. Its `$comment` ties an entry to a downstream objectui card, and objectui has zero readers. - **Changeset**: `.changeset/25159-api-docs-viewer-keys-retired.md`, `@objectstack/spec` `minor`, with both declaration lines, the ADR-0087 marker (`registered api-docs-viewer-keys-retired`), the BREAKING banner, FROM → TO and the one-line fix. ## Tests - New pin `packages/spec/src/api/docs-viewer-keys-retirement.test.ts` (22 cases, in the `repo` vitest project because it reads outside the package): - `code` `invalid_type`, `path` and the prescription at each door, for every former value including the old defaults; - the `tsc` channel, with three `@ts-expect-error` checks (the file is in `tsconfig.test.json`'s program; `--listFilesOnly` finds it); - live controls; - zero holders for the 4 retired names, plus survivors; - the ADR-0087 registration; - a tree-scoped absence walk with two legs: references to retired names, and structural authorings of `uiPath` / `uiFramework` / a viewer `ui` block. - Radius: the five roots already declared for `@objectstack/spec` in `scripts/cross-package-test-inputs.mjs` and `turbo.json`. One structural exclusion, `authorable-surface.base.json`: the published-surface anchor, which only `gen:authorable-surface-base` writes. `check:cross-package-test-inputs` is green with the pin added to `vitest.repo-tests.json`. - Edited: `documentation.test.ts` and `plugin-rest-api.test.ts` no longer author the retired keys. `type-alias-convention.pin.test.ts` drops `Iso_api_documentation__ApiTestingUiType`, and its count goes from 789 to 788, with the history line added. - **Reverse verification** (committed first, run under `scripts/ablation-replace.mjs`): `uiPath: retiredKey(...)` was put back to `z.string().default('/api/docs')`. Predicted direction red; observed red, 6 failed / 16 passed of 22. Restored blob `f365b815fca0` equals HEAD and `git diff HEAD` is empty. - **Walk probe**: an untracked `examples/app-crm/zz-probe-25159.yaml` authoring `uiPath`, plus a `content/docs/zz-probe-25159.md` fence importing `ApiTestingUiConfigSchema`. Both legs fired (`...yaml:3 authors a retired docs-viewer key`, `... references { ApiTestingUiConfigSchema }`). The probes were deleted afterwards and the tree was clean. ### Readings at head `21ed122c3` The head is this branch merged with `origin/main` `ab488d9b7`, which moved no `packages/spec` path. - `pnpm --filter @objectstack/spec test` (vitest `local` project): Test Files 706 passed (706), Tests 21456 passed and 1 todo (21457). - The `repo`-project files this diff touches or reads (`docs-viewer-keys-retirement`, `scripts/step18-rationale-merge`, `shared/retired-key-migrate-sentence`, `api/rest-api-config-dead-keys-retirement`): Test Files 4 passed (4), Tests 69 passed (69). The rest of `test:repo` is CI's. - `pnpm --filter @objectstack/spec typecheck`: exit 0, test layer included (`check:test-typecheck` OK, no new debt). - `pnpm --filter @objectstack/spec check:generated`: exit 0. - Gates from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, no paths: 113 derived, 113 run, all exit 0. `--ran` reports "113 derived famil(ies) accounted for, 113 run, 0 NOT-MEASURED". - Eleven first refused with exit 3. Six were spec gates over a `dist` older than my last test-file edits; four needed `@objectstack/lint` / `@objectstack/objectql` / every package built (`check:dual-build-cjs-loads`); one, the teardown self-test, needed a pinned commit the shallow clone lacked. A fresh `check:generated` also reported the same stale `dist` (exit 1). - All twelve were re-run green after the spec build, the lint and objectql closure builds, a turbo build (77/77, 75 cached), and a depth-1 fetch of `621a48760`. - Outside the derivation: `pnpm check:dev-prereqs` exit 0; `node scripts/check-platform-checklist.mjs --changed-from origin/main` exit 0 (0 anchored files in the change set). - Dogfood battery, once on this head, `pnpm --filter @objectstack/dogfood test` under the verify lock, no shard: `VERDICT command-exit 0`, Test Files 287 passed and 3 skipped (290), Tests 2395 passed and 18 skipped (2413). - Consumer reading, direction downstream (`...@objectstack/spec`): measured by the tree-scoped pin and the grep with controls above, not by rebuilding the consumer closure (kit §4). Zero readers outside `packages/spec`. ## Acceptance notes - `OpenApiGenerationConfigSchema` and `RestApiPluginConfigSchema` as a whole, and every other key of `ApiDocumentationConfigSchema`, are parsed by nothing outside their own unit tests in this tree. The REST plugin's real config is the separate `RestApiPluginConfig` interface in `packages/rest`, which carries `api?: RestServerConfig`. Example: `openApi.outputPath` defaults to `/api/docs/openapi.json`, while the document is served at `GET {basePath}/openapi.json`. This is a dormant, zero-pull declaration, out of this card's scope. It is noted here and not filed: no named producer and no measured public-door reach. --- _Generated by [Claude Code](https://claude.ai/code/session_01T1Y1g92DfSEz93iuCisju4)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 02ad31a commit 14e7239

26 files changed

Lines changed: 979 additions & 346 deletions
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
'@objectstack/spec': minor
3+
---
4+
5+
feat(spec)!: the docs-viewer keys are retired — `ApiDocumentationConfig.ui` (with `ApiTestingUiConfigSchema` / `ApiTestingUiType`) and the REST API plugin config's `openApi.uiPath` / `openApi.uiFramework` are refused with a prescription naming the OpenAPI document (ADR-0049)
6+
7+
Clause-②: no (narrowing)
8+
Metadata-protocol: narrowed
9+
10+
<!-- adr-0087: registered api-docs-viewer-keys-retired -->
11+
12+
**BREAKING** — an accept-set narrowing on a published authoring surface, shipped as `minor` under the repo's launch-window convention for accept-set narrowings.
13+
14+
Three keys declared an HTML API documentation viewer, and nothing ever read any of them: `ApiDocumentationConfig.ui` (a viewer type such as `swagger-ui`, `redoc` or `scalar`, served at `ui.path`, default `/api-docs`), and on the REST API plugin config `openApi.uiPath` (default `/api/docs`) with its viewer selector `openApi.uiFramework` (default `swagger-ui`). Since the docs viewer page was taken offline, the API origin serves no HTML viewer at all, only the machine-readable OpenAPI document, so none of the three could be honoured. They are retired under ADR-0049 enforce-or-remove, with no staged window.
15+
16+
**What is refused:** each key is a `retiredKey()` tombstone. Authoring it is a `tsc` error at the site, and a parse error at the key's path whose message is the prescription, for every former value including the old defaults. The value schemas `ApiTestingUiConfigSchema` and `ApiTestingUiType`, with the `ApiTestingUiConfig`, `ApiTestingUiConfigParsed` and `ApiTestingUiType` types, are no longer exported: they had no consumer once `ui` was gone.
17+
18+
**What stays accepted:** every other key of `ApiDocumentationConfigSchema`, `OpenApiGenerationConfigSchema` and `RestApiPluginConfigSchema`, byte-identically, defaults included. The mounted REST surface is unchanged: none of the three keys ever reached it.
19+
20+
## FROM → TO
21+
22+
| you wrote | write instead |
23+
|:--|:--|
24+
| `ui: { type: 'swagger-ui', … }` on an `ApiDocumentationConfig` | nothing: delete the key |
25+
| `openApi: { uiPath: '/api/docs' }` on a REST API plugin config | nothing: delete the key |
26+
| `openApi: { uiFramework: 'redoc' }` on a REST API plugin config | nothing: delete the key |
27+
| `import { ApiTestingUiConfigSchema, ApiTestingUiType } from '@objectstack/spec/api'` | nothing: no replacement exists |
28+
29+
The one-line fix: delete `ui`, `uiPath` and `uiFramework`, and point any viewer or client generator you run yourself at the OpenAPI document, `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both), mounted while `api.enableOpenApi` is on.
30+
31+
## Who is affected, measured
32+
33+
- **objectstack** at `b93c750c7`: zero readers and zero authorings outside `packages/spec`. The only identifier hits were a local `uiPath` variable for the unrelated `/ui/view` route in `packages/rest`; nothing in the tree parses the three schemas outside their own unit tests. A tree-scoped absence pin now holds that zero.
34+
- **objectui** at the console pin `.objectui-sha` `56cf4d8e89`: zero hits for any of the keys or exported names, so the console build at the pin is unaffected.
35+
- **Deployed configuration** was not measured.
36+
37+
## The ADR-0087 disposition
38+
39+
- `RETIRED_KEYS_BY_MAJOR[18]` gains `api/ApiDocumentationConfig:ui`, `api/OpenApiGenerationConfig:uiPath` and `api/OpenApiGenerationConfig:uiFramework`; `RETIRED_DEFS_BY_MAJOR[18]` gains `api/ApiTestingUiConfig` and `api/ApiTestingUiType`.
40+
- The D3 semantic entry `api-docs-viewer-keys-retired` and its step-18 rationale fragment carry the prescription to `os migrate meta`, the upgrade guide and `spec-changes.json`.
41+
- No D2 conversion: neither config is a stack collection member or a stored row, so no conversion seam would ever see one. `uiPath` and `uiFramework` carried Zod defaults, but nothing parses the REST API plugin config into a stored or built artifact, so no emitted default needs tolerating.
42+
43+
The retirement kit:
44+
45+
- the three tombstones and their retirement records (`packages/spec/src/api/documentation.zod.ts`, `packages/spec/src/api/plugin-rest-api.zod.ts`); the two value defs deleted; `REST_API_PLUGIN.md`'s example and feature list no longer name a viewer
46+
- pin test `docs-viewer-keys-retirement.test.ts`: `code`, `path` and the prescription at each door (each schema and `RestApiPluginConfigSchema.openApi`), the `tsc` channel, the live controls, zero holders for the retired names, the ADR-0087 registration, and a tree-scoped absence walk
47+
- generated artifacts follow the schema: `authorable-surface/`, `authorable-defaults/`, `json-schema.manifest/`, `api-surface/`, `export-origins/`, `declaration-map/`, the strictness-ledger counts and the reference pages for `api/documentation` and `api/plugin-rest-api`

‎content/docs/references/api/documentation.mdx‎

Lines changed: 12 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
11
---
22
title: Documentation schema — API Protocol reference
33
navTitle: Documentation
4-
description: "Provides schemas for generating interactive API documentation and testing interfaces similar to Swagger UI, Postman, etc."
4+
description: "Provides schemas for describing API documentation and test collections."
55
---
66

77
{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
88

99
API Documentation & Testing Interface Protocol
1010

11-
Provides schemas for generating interactive API documentation and testing
12-
interfaces similar to Swagger UI, Postman, etc.
11+
Provides schemas for describing API documentation and test collections.
1312

1413
Features:
1514
- OpenAPI/Swagger specification generation
16-
- Interactive API testing playground
15+
- API test requests and collections
1716
- API versioning and changelog
1817
- Code generation templates
1918
- Mock server configuration
2019

2120
Architecture Alignment:
22-
- Swagger UI: Interactive API documentation
21+
- OpenAPI: the machine-readable API description
2322
- Postman: API testing collections
24-
- Redoc: Documentation rendering
23+
24+
The platform serves no HTML documentation viewer: the API origin publishes
25+
the OpenAPI document (`GET {basePath}/openapi.json`) and nothing else, so
26+
this module declares no viewer — the retired `ui` key is refused at parse
27+
with that prescription.
2528

2629
**Documentation Config**
2730
```typescript
@@ -30,11 +33,6 @@ const docConfig: ApiDocumentationConfig = {
3033
title: 'ObjectStack API',
3134
version: '1.0.0',
3235
servers: [{ url: 'https://api.example.com', description: 'Production' }],
33-
ui: {
34-
type: 'swagger-ui',
35-
theme: 'light',
36-
enableTryItOut: true
37-
}
3836
}
3937
```
4038

@@ -45,8 +43,8 @@ const docConfig: ApiDocumentationConfig = {
4543
## TypeScript Usage
4644

4745
```typescript
48-
import { ApiChangelogEntrySchema, ApiDocumentationConfigSchema, ApiTestCollectionSchema, ApiTestRequestSchema, ApiTestingUiConfigSchema, ApiTestingUiType, CodeGenerationTemplateSchema, GeneratedApiDocumentationSchema, OpenApiSecuritySchemeSchema, OpenApiServerSchema, OpenApiSpecSchema } from '@objectstack/spec/api';
49-
import type { ApiChangelogEntry, ApiDocumentationConfig, ApiTestCollection, ApiTestRequest, ApiTestingUiConfig, ApiTestingUiType, CodeGenerationTemplate, GeneratedApiDocumentation, OpenApiSecurityScheme, OpenApiServer, OpenApiSpec } from '@objectstack/spec/api';
46+
import { ApiChangelogEntrySchema, ApiDocumentationConfigSchema, ApiTestCollectionSchema, ApiTestRequestSchema, CodeGenerationTemplateSchema, GeneratedApiDocumentationSchema, OpenApiSecuritySchemeSchema, OpenApiServerSchema, OpenApiSpecSchema } from '@objectstack/spec/api';
47+
import type { ApiChangelogEntry, ApiDocumentationConfig, ApiTestCollection, ApiTestRequest, CodeGenerationTemplate, GeneratedApiDocumentation, OpenApiSecurityScheme, OpenApiServer, OpenApiSpec } from '@objectstack/spec/api';
5048

5149
// Validate data
5250
const result = ApiChangelogEntrySchema.parse(data);
@@ -90,7 +88,7 @@ const result = ApiChangelogEntrySchema.parse(data);
9088
| **version** | `string` | ✅ | API version |
9189
| **description** | `string` | optional | API description |
9290
| **servers** | `{ url: string; description?: string; variables?: Record<string, object> }[]` | optional (default: `[]`) | API server URLs |
93-
| **ui** | `{ type: Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphiql' \| 'postman' \| 'custom'>; path?: string; theme?: Enum<'light' \| 'dark' \| 'auto'>; enableTryItOut?: boolean; … }` | optional | Testing UI configuration |
91+
| **ui** | `never` | optional | [REMOVED] `ApiDocumentationConfig.ui` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no viewer was ever mounted from it, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on; point any viewer or client generator you run yourself at that document. |
9492
| **generateOpenApi** | `boolean` | optional (default: `true`) | Generate OpenAPI 3.0 specification |
9593
| **generateTestCollections** | `boolean` | optional (default: `true`) | Generate API test collections |
9694
| **testCollections** | `{ name: string; description?: string; variables?: Record<string, any>; requests: object[]; … }[]` | optional (default: `[]`) | Predefined test collections |
@@ -111,23 +109,6 @@ const result = ApiChangelogEntrySchema.parse(data);
111109
| **description** | `string` | optional | Server description |
112110
| **variables** | `Record<string, { default: string; description?: string; enum?: string[] }>` | optional | URL template variables |
113111

114-
### Nested Shape: `ApiDocumentationConfig.ui`
115-
116-
| Property | Type | Required | Description |
117-
| :--- | :--- | :--- | :--- |
118-
| **type** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphiql' \| 'postman' \| 'custom'>` | ✅ | Testing UI implementation |
119-
| **path** | `string` | optional (default: `"/api-docs"`) | URL path for documentation UI |
120-
| **theme** | `Enum<'light' \| 'dark' \| 'auto'>` | optional (default: `"light"`) | UI color theme |
121-
| **enableTryItOut** | `boolean` | optional (default: `true`) | Enable interactive API testing |
122-
| **enableFilter** | `boolean` | optional (default: `true`) | Enable endpoint filtering |
123-
| **enableCors** | `boolean` | optional (default: `true`) | Enable CORS for browser testing |
124-
| **defaultModelsExpandDepth** | `integer` | optional (default: `1`) | Default expand depth for schemas (-1 = fully expand) |
125-
| **displayRequestDuration** | `boolean` | optional (default: `true`) | Show request duration |
126-
| **syntaxHighlighting** | `boolean` | optional (default: `true`) | Enable syntax highlighting |
127-
| **customCssUrl** | `string` | optional | Custom CSS stylesheet URL |
128-
| **customJsUrl** | `string` | optional | Custom JavaScript URL |
129-
| **layout** | `{ showExtensions?: boolean; showCommonExtensions?: boolean; deepLinking?: boolean; displayOperationId?: boolean; … }` | optional | Layout configuration |
130-
131112
### Nested Shape: `ApiDocumentationConfig.testCollections[number]`
132113

133114
| Property | Type | Required | Description |
@@ -218,57 +199,6 @@ const result = ApiChangelogEntrySchema.parse(data);
218199
| **expectedResponse** | `{ statusCode: integer; body?: any }` | optional | Expected response for validation |
219200

220201

221-
---
222-
223-
## ApiTestingUiConfig
224-
225-
### Properties
226-
227-
| Property | Type | Required | Description |
228-
| :--- | :--- | :--- | :--- |
229-
| **type** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'stoplight' \| 'scalar' \| 'graphiql' \| 'postman' \| 'custom'>` | ✅ | Testing UI implementation |
230-
| **path** | `string` | optional (default: `"/api-docs"`) | URL path for documentation UI |
231-
| **theme** | `Enum<'light' \| 'dark' \| 'auto'>` | optional (default: `"light"`) | UI color theme |
232-
| **enableTryItOut** | `boolean` | optional (default: `true`) | Enable interactive API testing |
233-
| **enableFilter** | `boolean` | optional (default: `true`) | Enable endpoint filtering |
234-
| **enableCors** | `boolean` | optional (default: `true`) | Enable CORS for browser testing |
235-
| **defaultModelsExpandDepth** | `integer` | optional (default: `1`) | Default expand depth for schemas (-1 = fully expand) |
236-
| **displayRequestDuration** | `boolean` | optional (default: `true`) | Show request duration |
237-
| **syntaxHighlighting** | `boolean` | optional (default: `true`) | Enable syntax highlighting |
238-
| **customCssUrl** | `string` | optional | Custom CSS stylesheet URL |
239-
| **customJsUrl** | `string` | optional | Custom JavaScript URL |
240-
| **layout** | `{ showExtensions?: boolean; showCommonExtensions?: boolean; deepLinking?: boolean; displayOperationId?: boolean; … }` | optional | Layout configuration |
241-
242-
### Nested Shape: `ApiTestingUiConfig.layout`
243-
244-
| Property | Type | Required | Description |
245-
| :--- | :--- | :--- | :--- |
246-
| **showExtensions** | `boolean` | optional (default: `false`) | Show vendor extensions |
247-
| **showCommonExtensions** | `boolean` | optional (default: `false`) | Show common extensions |
248-
| **deepLinking** | `boolean` | optional (default: `true`) | Enable deep linking |
249-
| **displayOperationId** | `boolean` | optional (default: `false`) | Display operation IDs |
250-
| **defaultModelRendering** | `Enum<'example' \| 'model'>` | optional (default: `"example"`) | Default model rendering mode |
251-
| **defaultModelsExpandDepth** | `integer` | optional (default: `1`) | Models expand depth |
252-
| **defaultModelExpandDepth** | `integer` | optional (default: `1`) | Single model expand depth |
253-
| **docExpansion** | `Enum<'list' \| 'full' \| 'none'>` | optional (default: `"list"`) | Documentation expansion mode |
254-
255-
256-
---
257-
258-
## ApiTestingUiType
259-
260-
### Allowed Values
261-
262-
* `swagger-ui`
263-
* `redoc`
264-
* `rapidoc`
265-
* `stoplight`
266-
* `scalar`
267-
* `graphiql`
268-
* `postman`
269-
* `custom`
270-
271-
272202
---
273203

274204
## CodeGenerationTemplate

‎content/docs/references/api/plugin-rest-api.mdx‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ const result = ErrorHandlingConfigSchema.parse(data);
104104
| **description** | `string` | optional | API description |
105105
| **apiVersion** | `string` | optional (default: `"1.0.0"`) | API version |
106106
| **outputPath** | `string` | optional (default: `"/api/docs/openapi.json"`) | URL path to serve OpenAPI JSON |
107-
| **uiPath** | `string` | optional (default: `"/api/docs"`) | URL path to serve documentation UI |
108-
| **uiFramework** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'elements'>` | optional (default: `"swagger-ui"`) | Documentation UI framework |
107+
| **uiPath** | `never` | optional | [REMOVED] `RestApiPluginConfig.openApi.uiPath` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no documentation viewer was ever served at its path, the `/api/docs` default included, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on; point any viewer or client generator you run yourself at that document. |
108+
| **uiFramework** | `never` | optional | [REMOVED] `RestApiPluginConfig.openApi.uiFramework` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no `swagger-ui`, `redoc`, `rapidoc` or `elements` viewer was ever rendered from it, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on; point any viewer or client generator you run yourself at that document. |
109109
| **includeInternal** | `boolean` | optional (default: `false`) | Include internal endpoints in documentation |
110110
| **generateSchemas** | `boolean` | optional (default: `true`) | Auto-generate schemas from Zod definitions |
111111
| **includeExamples** | `boolean` | optional (default: `true`) | Include request/response examples |
@@ -279,8 +279,8 @@ const result = ErrorHandlingConfigSchema.parse(data);
279279
| **description** | `string` | optional | API description |
280280
| **apiVersion** | `string` | optional (default: `"1.0.0"`) | API version |
281281
| **outputPath** | `string` | optional (default: `"/api/docs/openapi.json"`) | URL path to serve OpenAPI JSON |
282-
| **uiPath** | `string` | optional (default: `"/api/docs"`) | URL path to serve documentation UI |
283-
| **uiFramework** | `Enum<'swagger-ui' \| 'redoc' \| 'rapidoc' \| 'elements'>` | optional (default: `"swagger-ui"`) | Documentation UI framework |
282+
| **uiPath** | `never` | optional | [REMOVED] `RestApiPluginConfig.openApi.uiPath` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no documentation viewer was ever served at its path, the `/api/docs` default included, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on; point any viewer or client generator you run yourself at that document. |
283+
| **uiFramework** | `never` | optional | [REMOVED] `RestApiPluginConfig.openApi.uiFramework` was removed in @objectstack/spec 18.1.0 (ADR-0049 enforce-or-remove) — nothing ever read it: no `swagger-ui`, `redoc`, `rapidoc` or `elements` viewer was ever rendered from it, and the platform serves no HTML API documentation viewer at all, only the machine-readable OpenAPI document. Delete the key. The OpenAPI document is served at `GET /api/v1/openapi.json` under the REST server's default `api.basePath` and `api.version` (the path follows both) while `api.enableOpenApi` is on; point any viewer or client generator you run yourself at that document. |
284284
| **includeInternal** | `boolean` | optional (default: `false`) | Include internal endpoints in documentation |
285285
| **generateSchemas** | `boolean` | optional (default: `true`) | Auto-generate schemas from Zod definitions |
286286
| **includeExamples** | `boolean` | optional (default: `true`) | Include request/response examples |

0 commit comments

Comments
 (0)