Effortlessly turn Hydra, Swagger/OpenAPI, and GraphQL specs into actionable data for your tools and apps.
api-doc-parser
is a standalone TypeScript library that parses Hydra, Swagger, OpenAPI, and GraphQL documentation into a unified, intermediate representation.
This normalized structure enables smart API clients, code generators, admin interfaces, and more.
It integrates seamlessly with the API Platform framework.
- Unified output β one normalized
Api
object covering resources, fields, operations, parameters, and relations - TypeScript-first β strict typings for every parsed element
- Embedded & referenced resources resolved automatically
- Framework integration β easily integrates with the API Platform ecosystem
- Supports all major API formats β Hydra, Swagger/OpenAPI v2, OpenAPI v3, and GraphQL
Using NPM:
npm install @api-platform/api-doc-parser
Using Pnpm:
pnpm add @api-platform/api-doc-parser
With Yarn:
yarn add @api-platform/api-doc-parser
Using Bun:
bun add @api-platform/api-doc-parser
Hydra
import { parseHydraDocumentation } from "@api-platform/api-doc-parser"; const { api, response, status } = await parseHydraDocumentation( "https://demo.api-platform.com", );
OpenAPI v2 (formerly known as Swagger)
import { parseSwaggerDocumentation } from "@api-platform/api-doc-parser"; const { api, response, status } = await parseSwaggerDocumentation( "https://demo.api-platform.com/docs.json", );
OpenAPI v3
import { parseOpenApi3Documentation } from "@api-platform/api-doc-parser"; const { api, response, status } = await parseOpenApi3Documentation( "https://demo.api-platform.com/docs.jsonopenapi?spec_version=3.0.0", );
GraphQL
import { parseGraphQl } from "@api-platform/api-doc-parser"; const { api, response } = await parseGraphQl( "https://demo.api-platform.com/graphql", );
Each parse function returns a Promise that resolves to an object containing the normalized API structure, the raw documentation, and the HTTP status code:
function parseOpenApi3Documentation( entrypointUrl: string, options?: RequestInitExtended, ): Promise<{ api: Api; response: OpenAPIV3.Document; status: number; }>;
function parseSwaggerDocumentation(entrypointUrl: string): Promise<{ api: Api; response: OpenAPIV2.Document; status: number; }>;
function parseHydraDocumentation( entrypointUrl: string, options?: RequestInitExtended, ): Promise<{ api: Api; response: Response; status: number; }>;
function parseGraphQl( entrypointUrl: string, options?: RequestInit, ): Promise<{ api: Api; response: Response; }>;
Represents the root of the parsed API, containing the entrypoint URL, an optional title, and a list of resources.
interface Api { entrypoint: string; title?: string; resources?: Resource[]; }
Describes an API resource (such as an entity or collection), including its fields, operations, and metadata.
interface Resource { name: string | null; url: string | null; id?: string | null; title?: string | null; description?: string | null; deprecated?: boolean | null; fields?: Field[] | null; readableFields?: Field[] | null; writableFields?: Field[] | null; parameters?: Parameter[] | null; getParameters?: () => Promise<Parameter[]> | null; operations?: Operation[] | null; }
Represents a property of a resource, including its type, constraints, and metadata.
interface Field { name: string | null; id?: string | null; range?: string | null; type?: FieldType | null; arrayType?: FieldType | null; enum?: { [key: string | number]: string | number } | null; reference?: string | Resource | null; embedded?: Resource | null; required?: boolean | null; nullable?: boolean | null; description?: string | null; maxCardinality?: number | null; deprecated?: boolean | null; }
Represents a query parameter for a collection/list operation, such as a filter or pagination variable.
interface Parameter { variable: string; range: string | null; required: boolean; description: string; deprecated?: boolean; }
Enumerates the possible types for a field, such as string, integer, date, etc.
type FieldType = | "string" | "integer" | "negativeInteger" | "nonNegativeInteger" | "positiveInteger" | "nonPositiveInteger" | "number" | "decimal" | "double" | "float" | "boolean" | "date" | "dateTime" | "duration" | "time" | "byte" | "binary" | "hexBinary" | "base64Binary" | "array" | "object" | "email" | "url" | "uuid" | "password" | string;
Represents an operation (such as GET, POST, PUT, PATCH, DELETE) that can be performed on a resource.
interface Operation { name: string | null; type: "show" | "edit" | "delete" | "list" | "create" | null; method?: string | null; expects?: any | null; returns?: string | null; types?: string[] | null; deprecated?: boolean | null; }
api-doc-parser
applies a predictable set of rules when interpreting an OpenAPI document.
If a rule is not met, the resource concerned is silently skipped.
Rule | Details |
---|---|
Single-item path pattern | A GET (read) or PUT /PATCH (update) endpoint must match:/books/{id} (regexΒ ^[^{}]+/{[^{}]+}/?$ ).books may be singular (/book/{id} ). |
Schema discovery | GET β first searches responses β 200 β content β application/json ; if missing, falls back to components (component name must be singular, e.g. Book ).PUT/PATCH β only requestBody β content β application/json is considered.If both GET & PUT/PATCH schemas exist, their fields are merged. |
Collection paths | A create (POST ) or list (GET ) endpoint must be plural:/books . |
Deletion path | DELETE must live under the single-item GET path (/books/{id} ). |
Relations & Embeddeds | Links between resources are inferred from property names and their JSON schema: β’ Plural object/array properties (e.g. reviews , authors ) become embedded resources when their item schema matches an existing resource (Review , Author ).β’ ID-like properties (e.g. review_id , reviewId , review_ids , reviewIds , authorId ) are treated as references to that resource.β’ As a result, fields such as reviews (object/array) and review_ids (scalar/array of IDs) each point to the same Review resource, one flagged embedded, the other reference. |
Parameter extraction | Parameters are read only from the list path (/books ). |
API Doc Parser is designed to parse any API documentation format and convert it in the same intermediate representation. If you develop a parser for another format, please open a Pull Request to include it in the library.
Contributions are welcome! To contribute:
-
Read our Code of Conduct.
-
Fork the repository and create a feature branch.
-
Ensure you have the latest version of pnpm installed.
-
Install dependencies
pnpm install
-
Adhere to the code style and lint rules
pnpm lint:fix
pnpm format
-
Run tests
pnpm test
-
Ensure type correctness
pnpm typecheck
-
Submit a pull request with a clear description of your changes.
Created by KΓ©vin Dunglas. Sponsored by Les-Tilleuls.coop.
This project is licensed under the MIT License - see the LICENSE file for details.