UNPKG

openapi-typescript

Version:

Convert OpenAPI 3.0 & 3.1 schemas to TypeScript

373 lines (372 loc) 11.3 kB
import type { Config as RedoclyConfig } from "@redocly/openapi-core"; import type { PathLike } from "node:fs"; import type ts from "typescript"; export interface Extensable { [key: `x-${string}`]: any; } export interface OpenAPI3 extends Extensable { openapi: string; info: InfoObject; jsonSchemaDialect?: string; servers?: ServerObject[]; paths?: PathsObject; webhooks?: { [id: string]: PathItemObject | ReferenceObject; }; components?: ComponentsObject; security?: SecurityRequirementObject[]; tags?: TagObject[]; externalDocs?: ExternalDocumentationObject; $defs?: $defs; } export interface InfoObject extends Extensable { title: string; summary?: string; description?: string; termsOfService?: string; contact?: ContactObject; license?: LicenseObject; version: string; } export interface ContactObject extends Extensable { name?: string; url?: string; email?: string; } export interface LicenseObject extends Extensable { name: string; identifier: string; url: string; } export interface ServerObject extends Extensable { url: string; description: string; variables: { [name: string]: ServerVariableObject; }; } export interface ServerVariableObject extends Extensable { enum?: string[]; default: string; description?: string; } export interface ComponentsObject extends Extensable { schemas?: Record<string, SchemaObject>; responses?: Record<string, ResponseObject | ReferenceObject>; parameters?: Record<string, ParameterObject | ReferenceObject>; examples?: Record<string, ExampleObject | ReferenceObject>; requestBodies?: Record<string, RequestBodyObject | ReferenceObject>; headers?: Record<string, HeaderObject | ReferenceObject>; securitySchemes?: Record<string, SecuritySchemeObject | ReferenceObject>; links?: Record<string, LinkObject | ReferenceObject>; callbacks?: Record<string, CallbackObject | ReferenceObject>; pathItems?: Record<string, PathItemObject | ReferenceObject>; } export interface PathsObject { [pathname: string]: PathItemObject | ReferenceObject; } export interface WebhooksObject { [name: string]: PathItemObject; } export interface PathItemObject extends Extensable { get?: OperationObject | ReferenceObject; put?: OperationObject | ReferenceObject; post?: OperationObject | ReferenceObject; delete?: OperationObject | ReferenceObject; options?: OperationObject | ReferenceObject; head?: OperationObject | ReferenceObject; patch?: OperationObject | ReferenceObject; trace?: OperationObject | ReferenceObject; servers?: ServerObject[]; parameters?: (ParameterObject | ReferenceObject)[]; } export interface OperationObject extends Extensable { tags?: string[]; summary?: string; description?: string; externalDocs?: ExternalDocumentationObject; operationId?: string; parameters?: (ParameterObject | ReferenceObject)[]; requestBody?: RequestBodyObject | ReferenceObject; responses?: ResponsesObject; callbacks?: Record<string, CallbackObject | ReferenceObject>; deprecated?: boolean; security?: SecurityRequirementObject[]; servers?: ServerObject[]; } export interface ExternalDocumentationObject extends Extensable { description?: string; url: string; } export interface ParameterObject extends Extensable { name: string; in: "query" | "header" | "path" | "cookie"; description?: string; required?: boolean; deprecated?: boolean; allowEmptyValue?: boolean; style?: string; explode?: boolean; allowReserved?: boolean; schema?: SchemaObject; example?: any; examples?: { [name: string]: ExampleObject | ReferenceObject; }; content?: { [contentType: string]: MediaTypeObject | ReferenceObject; }; } export interface RequestBodyObject extends Extensable { description?: string; content: { [contentType: string]: MediaTypeObject | ReferenceObject; }; required?: boolean; } export interface MediaTypeObject extends Extensable { schema?: SchemaObject | ReferenceObject; example?: any; examples?: { [name: string]: ExampleObject | ReferenceObject; }; encoding?: { [propertyName: string]: EncodingObject; }; } export interface EncodingObject extends Extensable { contentType?: string; headers?: { [name: string]: HeaderObject | ReferenceObject; }; style?: string; explode?: string; allowReserved?: string; } export type ResponsesObject = { [responseCode: string]: ResponseObject | ReferenceObject; } & { default?: ResponseObject | ReferenceObject; }; export interface ResponseObject extends Extensable { description: string; headers?: { [name: string]: HeaderObject | ReferenceObject; }; content?: { [contentType: string]: MediaTypeObject; }; links?: { [name: string]: LinkObject | ReferenceObject; }; } export type CallbackObject = Record<string, PathItemObject>; export interface ExampleObject extends Extensable { summary?: string; description?: string; value?: any; externalValue?: string; } export interface LinkObject extends Extensable { operationRef?: string; operationId?: string; parameters?: { [name: string]: `$${string}`; }; requestBody?: `$${string}`; description?: string; server?: ServerObject; } export type HeaderObject = Omit<ParameterObject, "name" | "in">; export interface TagObject extends Extensable { name: string; description?: string; externalDocs?: ExternalDocumentationObject; } export interface ReferenceObject extends Extensable { $ref: string; summary?: string; description?: string; } export type SchemaObject = { discriminator?: DiscriminatorObject; xml?: XMLObject; externalDocs?: ExternalDocumentationObject; example?: any; title?: string; description?: string; $comment?: string; deprecated?: boolean; readOnly?: boolean; writeOnly?: boolean; enum?: unknown[]; const?: unknown; default?: unknown; format?: string; nullable?: boolean; oneOf?: (SchemaObject | ReferenceObject)[]; allOf?: (SchemaObject | ReferenceObject)[]; anyOf?: (SchemaObject | ReferenceObject)[]; required?: string[]; [key: `x-${string}`]: any; } & (StringSubtype | NumberSubtype | IntegerSubtype | ArraySubtype | BooleanSubtype | NullSubtype | ObjectSubtype | { type: ("string" | "number" | "integer" | "array" | "boolean" | "null" | "object")[]; }); export interface TransformObject { schema: ts.TypeNode; questionToken: boolean; } export interface StringSubtype { type: "string" | ["string", "null"]; enum?: (string | ReferenceObject)[]; } export interface NumberSubtype { type: "number" | ["number", "null"]; minimum?: number; maximum?: number; enum?: (number | ReferenceObject)[]; } export interface IntegerSubtype { type: "integer" | ["integer", "null"]; minimum?: number; maximum?: number; enum?: (number | ReferenceObject)[]; } export interface ArraySubtype { type: "array" | ["array", "null"]; prefixItems?: (SchemaObject | ReferenceObject)[]; items?: SchemaObject | ReferenceObject | (SchemaObject | ReferenceObject)[]; minItems?: number; maxItems?: number; enum?: (SchemaObject | ReferenceObject)[]; } export interface BooleanSubtype { type: "boolean" | ["boolean", "null"]; enum?: (boolean | ReferenceObject)[]; } export interface NullSubtype { type: "null"; } export interface ObjectSubtype { type: "object" | ["object", "null"]; properties?: { [name: string]: SchemaObject | ReferenceObject; }; additionalProperties?: boolean | Record<string, never> | SchemaObject | ReferenceObject; required?: string[]; allOf?: (SchemaObject | ReferenceObject)[]; anyOf?: (SchemaObject | ReferenceObject)[]; enum?: (SchemaObject | ReferenceObject)[]; $defs?: $defs; } export interface DiscriminatorObject { propertyName: string; mapping?: Record<string, string>; oneOf?: string[]; } export interface XMLObject extends Extensable { name?: string; namespace?: string; prefix?: string; attribute?: boolean; wrapped?: boolean; } export type SecuritySchemeObject = { description?: string; [key: `x-${string}`]: any; } & ({ type: "apiKey"; name: string; in: "query" | "header" | "cookie"; } | { type: "http"; scheme: string; bearer?: string; } | { type: "mutualTLS"; } | { type: "oauth2"; flows: OAuthFlowsObject; } | { type: "openIdConnect"; openIdConnectUrl: string; }); export interface OAuthFlowsObject extends Extensable { implicit?: OAuthFlowObject; password?: OAuthFlowObject; clientCredentials?: OAuthFlowObject; authorizationCode?: OAuthFlowObject; } export interface OAuthFlowObject extends Extensable { authorizationUrl: string; tokenUrl: string; refreshUrl: string; scopes: { [name: string]: string; }; } export type SecurityRequirementObject = { [P in keyof ComponentsObject["securitySchemes"]]?: string[]; }; export interface OpenAPITSOptions { additionalProperties?: boolean; alphabetize?: boolean; arrayLength?: boolean; emptyObjectsUnknown?: boolean; cwd?: PathLike; defaultNonNullable?: boolean; excludeDeprecated?: boolean; transform?: (schemaObject: SchemaObject, options: TransformNodeOptions) => ts.TypeNode | TransformObject | undefined; postTransform?: (type: ts.TypeNode, options: TransformNodeOptions) => ts.TypeNode | undefined; immutable?: boolean; silent?: boolean; version?: number; exportType?: boolean; enum?: boolean; enumValues?: boolean; dedupeEnums?: boolean; pathParamsAsTypes?: boolean; propertiesRequiredByDefault?: boolean; rootTypes?: boolean; rootTypesNoSchemaPrefix?: boolean; redocly?: RedoclyConfig; inject?: string; makePathsEnum?: boolean; generatePathParams?: boolean; } export interface GlobalContext { additionalProperties: boolean; alphabetize: boolean; arrayLength: boolean; defaultNonNullable: boolean; discriminators: { objects: Record<string, DiscriminatorObject>; refsHandled: string[]; }; emptyObjectsUnknown: boolean; enum: boolean; enumValues: boolean; dedupeEnums: boolean; excludeDeprecated: boolean; exportType: boolean; immutable: boolean; injectFooter: ts.Node[]; pathParamsAsTypes: boolean; postTransform: OpenAPITSOptions["postTransform"]; propertiesRequiredByDefault: boolean; rootTypes: boolean; rootTypesNoSchemaPrefix: boolean; redoc: RedoclyConfig; silent: boolean; transform: OpenAPITSOptions["transform"]; resolve<T>($ref: string): T | undefined; inject?: string; makePathsEnum: boolean; generatePathParams: boolean; } export type $defs = Record<string, SchemaObject>; export interface TransformNodeOptions { path?: string; schema?: SchemaObject | ReferenceObject; ctx: GlobalContext; }