Repository navigation
feat(api): Export API reference data as @sentry/api/docs - #130538
Closed
sentry-junior[bot] wants to merge 1 commit into
Closed
sentry-junior[bot] wants to merge 1 commit into
sentry-junior[bot] wants to merge 1 commit into
Conversation
sentry-junior
Bot
force-pushed
the
feat/api-docs-export
branch
from
November 12, 2026 21:36
80738e5 to
3662fc0
Compare
sentry-junior
Bot
force-pushed
the
feat/api-docs-export
branch
from
November 13, 2026 07:24
3662fc0 to
945e799
Compare
Contributor
Sentry Snapshot Testing
|
Add a docs generator next to the operations catalog. It projects the dereferenced spec onto what an API reference page shows: tags, full parameters, the request body's first content type, responses with schemas and examples, security and servers. It ships as the ./docs export with types, plus extractDocs() to build the same data from an unreleased spec. Tests pin the shape with a fixture and check the published export against the spec it was built from, so the two can't drift. Co-Authored-By: BYK <126780+BYK@users.noreply.github.com>
sentry-junior
Bot
force-pushed
the
feat/api-docs-export
branch
from
November 13, 2026 07:32
945e799 to
c1bd39b
Compare
Contributor
Author
|
Moved to getsentry/sentry-api-schema#150. |
BYK
added a commit
to getsentry/sentry-api-schema
that referenced
this pull request
Nov 13, 2026
Stacked on #149. Ported from getsentry/sentry#130538, per @BYK's request there: get the docs aligned here first, then move `@sentry/api` into getsentry/sentry. This adds the data sentry-docs needs to build the API reference from the `@sentry/api` version it pins, so it no longer has to read `openapi-derefed.json` from a pinned commit of this repository. The sentry-docs adapter is getsentry/sentry-docs#20679. ## Changes from the sentry version 2.0.0 (#148) made every path relative to the API base path and trimmed server URLs to their origin. The export now follows the same contract: - operation `path`s are relative, such as `/organizations/`, the same as `@sentry/api/operations`; - the base path ships as `API_BASE_PATH` (`/api/0`) and as `apiBasePath` in `extractDocs()` output, so a page builds the full path as `${API_BASE_PATH}${operation.path}`; - per-operation `servers` are origins. `extractDocs()` applies `splitApiBasePath` to a copy of the spec it gets, so the published data and a preview of a local spec have the same shape. It accepts both the current spec and one that declares the base path in `servers`. **sentry-docs#20679 needs a follow-up for this:** its adapter has to prepend `API_BASE_PATH` to paths, like sentry-docs#20787 does for 2.0.0. I'll push that once this shape is settled. ## What it adds - **`scripts/generate-docs.mjs`**, next to the `operations` generator. It runs `lib/docs-catalog.mjs` `extractDocs(spec)` on the original `openapi-derefed.json` and emits `src/docs.ts`. That file holds the data as a JSON string literal, so tsc doesn't infer a type for 3.7 MB of data. It ships as **`@sentry/api/docs`** (`dist/docs.js` plus `.d.ts`). - **Shape** (`lib/docs-types.ts`): - `apiBasePath` / `API_BASE_PATH`. - `tags`: name, description, `sidebarName` (`x-sidebar-name`) and `displayDescription` (`x-display-description`). - `operations`, in spec order: `operationId`, method and relative path, with summary and description copied as written. Also tags, `deprecated`, `experimental` (`x-sentry-experimental`), server origins, security requirements, and parameters (path-level merged with operation overrides) with `in`, `required`, description, `experimental` and schema. The request body comes from its first content type (content type, `required`, schema, example), and every response has its status, description, content type, schema and `example`/`examples`. - **`extractDocs` is exported too**, so sentry-docs' `OPENAPI_LOCAL_PATH` preview of an unreleased local spec goes through the same projection as the published data. - `lib/http-methods.mjs` holds the HTTP method set that both catalogs use. ## The export's shape is now a semver contract sentry-docs, and anything else that imports `@sentry/api/docs`, depends on these field names and types. Removing or renaming a field, or changing its type, is a **major** release. Adding fields is a minor release. The README says so. ## Size Measured with `npm pack --dry-run` from clean builds of #149 and this branch, using the spec in this repository: | | tgz | unpacked | files | |---|---|---|---| | #149 | 3,385,825 B | 35,812,862 B | 80 | | this PR | 3,828,867 B | 39,660,930 B | 86 | | change | **+443 KB (+13%)** | **+3.85 MB (+11%)** | +6 | Almost all of it is `dist/docs.js` (3,840,561 B). It's a separate entry point, so `@sentry/api` and `@sentry/api/client` users like toolkit don't load it unless they import `./docs`. They only pay for the download. ## Tests - `test/docs.test.ts`: - A fixture test pins the exact output shape. Its spec declares `/api/0` in `servers` and an operation server override under it, so the test also covers the relative paths, `apiBasePath` and origin-only servers. It also covers path-level parameter overrides, experimental flags, multiple content types, responses without content, named examples and security. - Drift tests compare the published `@sentry/api/docs` with `openapi-derefed.json`: - the export equals `extractDocs(spec)`, and `API_BASE_PATH` is `/api/0`; - tag and operation order matches the spec, with `API_BASE_PATH` plus each relative path equal to the spec's path; - for every operation, the text, parameters, request schema and example, and response schemas and examples match the spec directly. - `test/package.test.ts`: the packed-tarball smoke test imports `@sentry/api/docs`. `pnpm build`, `pnpm typecheck` and `pnpm test` pass locally (54 files, 679 tests). No UI change here. The sentry-docs PR carries the API reference screenshots. ## Merge order #149, this PR, the normal release of an `@sentry/api` version with `./docs`, then getsentry/sentry-docs#20679 with its `API_BASE_PATH` follow-up. That PR's dependency bump is its last step. Co-Authored-By: BYK <126780+BYK@users.noreply.github.com> <!-- junior-session-footer:start --> <!-- junior-conversation-id:agent%3A69da19b385017e68b7f9eace56e9477f --> -- [View Session](https://junior-prod.sentry.dev/conversations/agent%3A69da19b385017e68b7f9eace56e9477f) [[Sentry]](https://sentry.sentry.io/explore/conversations/agent%3A69da19b385017e68b7f9eace56e9477f/?project=4510944073809921) <!-- junior-session-footer:end --> --------- Co-authored-by: sentry-junior[bot] <264270552+sentry-junior[bot]@users.noreply.github.com> Co-authored-by: BYK <126780+BYK@users.noreply.github.com>
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #130518 (which is stacked on #130472). This adds the data sentry-docs needs to build the API reference from the
@sentry/apiversion it pins, so it no longer has to readopenapi-derefed.jsonfrom a pinned sentry-api-schema commit. The sentry-docs adapter is a separate PR in getsentry/sentry-docs.What it adds
scripts/generate-docs.mjs, next to theoperationsgenerator. It runslib/docs-catalog.mjsextractDocs(spec)on the release's original dereferenced spec and emitssrc/docs.ts. That file holds{ tags, operations }as a JSON string literal, so tsc doesn't infer a type for 3.7 MB of data, and it ships as@sentry/api/docs(dist/docs.jsplus.d.ts).lib/docs-types.ts):tags: name, description,sidebarName(x-sidebar-name) anddisplayDescription(x-display-description).operations, in spec order:operationId, method, path, and summary and description copied as written. Also tags,deprecated,experimental(x-sentry-experimental), server URLs, security requirements, and parameters (path-level merged with operation overrides) within,required, description,experimentaland schema. The request body comes from its first content type (content type,required, schema, example), and every response has its status, description, content type, schema andexample/examples.extractDocsis exported too, so sentry-docs'OPENAPI_LOCAL_PATHpreview of an unreleased local spec goes through the same projection as the published data.lib/http-methods.mjsholds the HTTP method set that both catalogs use.The export's shape is now a semver contract
sentry-docs, and anything else that imports
@sentry/api/docs, depends on these field names and types. Removing or renaming a field, or changing its type, is a major release. Adding fields is a minor release. The README says so.Size
Measured with
pnpm packagainst #130518, built from the same spec:Almost all of it is
dist/docs.js(3,736,140 B). It's a separate entry point, so@sentry/apiand@sentry/api/clientusers like toolkit don't load it unless they import./docs. They only pay for the download.Tests
test/docs.test.ts:@sentry/api/docsto the spec inspec/openapi-derefed.json:extractDocs(spec);test/package.test.ts: the packed-tarball smoke test imports@sentry/api/docs.Checks
build,typecheck(tsc6 test and browser configs) andtest:vitestall pass locally: 53 files, 661 tests. knip is clean.@sentry/api/docsis byte-identical to its current spec reader's output on the same spec, apart fromrequired: falsevs. absent on optional query params, which renders the same. The rendered<main>HTML is identical on 5 API pages. Details and screenshots are in the sentry-docs PR.static/packages/api/.Merge order
This PR, then publishing an
@sentry/apiversion with./docsthrough the normal release, then the sentry-docs PR, whose dependency bump is its last step.Co-Authored-By: BYK 126780+BYK@users.noreply.github.com
via @BYK.
--
View Session in Sentry