UNPKG

openapi-typescript

Version:

Convert OpenAPI 3.0 & 3.1 schemas to TypeScript

504 lines (486 loc) 19.2 kB
import { Readable } from 'node:stream'; import ts from 'typescript'; import { Config, Referenced } from '@redocly/openapi-core'; import { PathLike } from 'node:fs'; export { default as c } from 'ansi-colors'; interface Extensable { [key: `x-${string}`]: any; } 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; } interface InfoObject extends Extensable { title: string; summary?: string; description?: string; termsOfService?: string; contact?: ContactObject; license?: LicenseObject; version: string; } interface ContactObject extends Extensable { name?: string; url?: string; email?: string; } interface LicenseObject extends Extensable { name: string; identifier: string; url: string; } interface ServerObject extends Extensable { url: string; description: string; variables: { [name: string]: ServerVariableObject; }; } interface ServerVariableObject extends Extensable { enum?: string[]; default: string; description?: string; } 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>; } interface PathsObject { [pathname: string]: PathItemObject | ReferenceObject; } interface WebhooksObject { [name: string]: PathItemObject; } 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)[]; } 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[]; } interface ExternalDocumentationObject extends Extensable { description?: string; url: string; } 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; }; } interface RequestBodyObject extends Extensable { description?: string; content: { [contentType: string]: MediaTypeObject | ReferenceObject; }; required?: boolean; } interface MediaTypeObject extends Extensable { schema?: SchemaObject | ReferenceObject; example?: any; examples?: { [name: string]: ExampleObject | ReferenceObject; }; encoding?: { [propertyName: string]: EncodingObject; }; } interface EncodingObject extends Extensable { contentType?: string; headers?: { [name: string]: HeaderObject | ReferenceObject; }; style?: string; explode?: string; allowReserved?: string; } type ResponsesObject = { [responseCode: string]: ResponseObject | ReferenceObject; } & { default?: ResponseObject | ReferenceObject; }; interface ResponseObject extends Extensable { description: string; headers?: { [name: string]: HeaderObject | ReferenceObject; }; content?: { [contentType: string]: MediaTypeObject; }; links?: { [name: string]: LinkObject | ReferenceObject; }; } type CallbackObject = Record<string, PathItemObject>; interface ExampleObject extends Extensable { summary?: string; description?: string; value?: any; externalValue?: string; } interface LinkObject extends Extensable { operationRef?: string; operationId?: string; parameters?: { [name: string]: `$${string}`; }; requestBody?: `$${string}`; description?: string; server?: ServerObject; } type HeaderObject = Omit<ParameterObject, "name" | "in">; interface TagObject extends Extensable { name: string; description?: string; externalDocs?: ExternalDocumentationObject; } interface ReferenceObject extends Extensable { $ref: string; summary?: string; description?: string; } 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")[]; }); interface TransformObject { schema: ts.TypeNode; questionToken: boolean; } interface StringSubtype { type: "string" | ["string", "null"]; enum?: (string | ReferenceObject)[]; } interface NumberSubtype { type: "number" | ["number", "null"]; minimum?: number; maximum?: number; enum?: (number | ReferenceObject)[]; } interface IntegerSubtype { type: "integer" | ["integer", "null"]; minimum?: number; maximum?: number; enum?: (number | ReferenceObject)[]; } interface ArraySubtype { type: "array" | ["array", "null"]; prefixItems?: (SchemaObject | ReferenceObject)[]; items?: SchemaObject | ReferenceObject | (SchemaObject | ReferenceObject)[]; minItems?: number; maxItems?: number; enum?: (SchemaObject | ReferenceObject)[]; } interface BooleanSubtype { type: "boolean" | ["boolean", "null"]; enum?: (boolean | ReferenceObject)[]; } interface NullSubtype { type: "null"; } 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; } interface DiscriminatorObject { propertyName: string; mapping?: Record<string, string>; oneOf?: string[]; } interface XMLObject extends Extensable { name?: string; namespace?: string; prefix?: string; attribute?: boolean; wrapped?: boolean; } 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; }); interface OAuthFlowsObject extends Extensable { implicit?: OAuthFlowObject; password?: OAuthFlowObject; clientCredentials?: OAuthFlowObject; authorizationCode?: OAuthFlowObject; } interface OAuthFlowObject extends Extensable { authorizationUrl: string; tokenUrl: string; refreshUrl: string; scopes: { [name: string]: string; }; } type SecurityRequirementObject = { [P in keyof ComponentsObject["securitySchemes"]]?: string[]; }; 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?: Config; inject?: string; makePathsEnum?: boolean; generatePathParams?: boolean; } 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: Config; silent: boolean; transform: OpenAPITSOptions["transform"]; resolve<T>($ref: string): T | undefined; inject?: string; makePathsEnum: boolean; generatePathParams: boolean; } type $defs = Record<string, SchemaObject>; interface TransformNodeOptions { path?: string; schema?: SchemaObject | ReferenceObject; ctx: GlobalContext; } declare const JS_PROPERTY_INDEX_RE: RegExp; declare const JS_ENUM_INVALID_CHARS_RE: RegExp; declare const JS_PROPERTY_INDEX_INVALID_CHARS_RE: RegExp; declare const SPECIAL_CHARACTER_MAP: Record<string, string>; declare const BOOLEAN: ts.KeywordTypeNode<ts.SyntaxKind.BooleanKeyword>; declare const FALSE: ts.LiteralTypeNode; declare const NEVER: ts.KeywordTypeNode<ts.SyntaxKind.NeverKeyword>; declare const NULL: ts.LiteralTypeNode; declare const NUMBER: ts.KeywordTypeNode<ts.SyntaxKind.NumberKeyword>; declare const QUESTION_TOKEN: ts.PunctuationToken<ts.SyntaxKind.QuestionToken>; declare const STRING: ts.KeywordTypeNode<ts.SyntaxKind.StringKeyword>; declare const TRUE: ts.LiteralTypeNode; declare const UNDEFINED: ts.KeywordTypeNode<ts.SyntaxKind.UndefinedKeyword>; declare const UNKNOWN: ts.KeywordTypeNode<ts.SyntaxKind.UnknownKeyword>; interface AnnotatedSchemaObject { const?: unknown; default?: unknown; deprecated?: boolean; description?: string; enum?: unknown[]; example?: string; format?: string; nullable?: boolean; summary?: string; title?: string; type?: string | string[]; } declare function addJSDocComment(schemaObject: AnnotatedSchemaObject, node: ts.PropertySignature): void; type OapiRefResolved = Referenced<ParameterObject>; declare function oapiRef(path: string, resolved?: OapiRefResolved): ts.TypeNode; interface AstToStringOptions { fileName?: string; sourceText?: string; formatOptions?: ts.PrinterOptions; } declare function astToString(ast: ts.Node | ts.Node[] | ts.TypeElement | ts.TypeElement[], options?: AstToStringOptions): string; declare function stringToAST(source: string): unknown[]; declare function tsDedupe(types: ts.TypeNode[]): ts.TypeNode[]; declare const enumCache: Map<string, ts.EnumDeclaration>; declare function tsEnum(name: string, members: (string | number)[], metadata?: { name?: string; description?: string; }[], options?: { export?: boolean; shouldCache?: boolean; }): ts.EnumDeclaration; declare function tsArrayLiteralExpression(name: string, elementType: ts.TypeNode, values: (string | number)[], options?: { export?: boolean; readonly?: boolean; injectFooter?: ts.Node[]; }): ts.VariableStatement; declare function tsEnumMember(value: string | number, metadata?: { name?: string; description?: string; }): ts.EnumMember; declare function tsIntersection(types: ts.TypeNode[]): ts.TypeNode; declare function tsIsPrimitive(type: ts.TypeNode): boolean; declare function tsLiteral(value: unknown): ts.TypeNode; declare function tsModifiers(modifiers: { readonly?: boolean; export?: boolean; }): ts.Modifier[]; declare function tsNullable(types: ts.TypeNode[]): ts.TypeNode; declare function tsOmit(type: ts.TypeNode, keys: string[]): ts.TypeNode; declare function tsRecord(key: ts.TypeNode, value: ts.TypeNode): ts.TypeReferenceNode; declare function tsPropertyIndex(index: string | number): ts.Identifier | ts.NumericLiteral | ts.StringLiteral; declare function tsUnion(types: ts.TypeNode[]): ts.TypeNode; declare function tsWithRequired(type: ts.TypeNode, keys: string[], injectFooter: ts.Node[]): ts.TypeNode; declare function tsReadonlyArray(type: ts.TypeNode, injectFooter?: ts.Node[]): ts.TypeNode; declare function createDiscriminatorProperty(discriminator: DiscriminatorObject, { path, readonly }: { path: string; readonly?: boolean; }): ts.TypeElement; declare function createRef(parts: (number | string | undefined | null)[]): string; declare function debug(msg: string, group?: string, time?: number): void; declare function error(msg: string): void; declare function formatTime(t: number): string; declare function getEntries<T>(obj: ArrayLike<T> | Record<string, T>, options?: { alphabetize?: boolean; excludeDeprecated?: boolean; }): [string, T][]; declare function resolveRef<T>(schema: any, $ref: string, { silent, visited }: { silent: boolean; visited?: string[]; }): T | undefined; declare function scanDiscriminators(schema: OpenAPI3, options: OpenAPITSOptions): { objects: Record<string, DiscriminatorObject>; refsHandled: string[]; }; declare function walk(obj: unknown, cb: (value: Record<string, unknown>, path: (string | number)[]) => void, path?: (string | number)[]): void; declare function warn(msg: string, silent?: boolean): void; declare function transformSchema(schema: OpenAPI3, ctx: GlobalContext): ts.Node[]; declare function transformComponentsObject(componentsObject: ComponentsObject, ctx: GlobalContext): ts.Node[]; declare function transformHeaderObject(headerObject: HeaderObject, options: TransformNodeOptions): ts.TypeNode; declare function transformMediaTypeObject(mediaTypeObject: MediaTypeObject, options: TransformNodeOptions): ts.TypeNode; declare function transformOperationObject(operationObject: OperationObject, options: TransformNodeOptions): ts.TypeElement[]; declare function injectOperationObject(operationId: string, operationObject: OperationObject, options: TransformNodeOptions): void; declare function transformParameterObject(parameterObject: ParameterObject, options: TransformNodeOptions): ts.TypeNode; type Method = "get" | "put" | "post" | "delete" | "options" | "head" | "patch" | "trace"; declare function transformPathItemObject(pathItem: PathItemObject, options: TransformNodeOptions): ts.TypeNode; declare function transformPathsObject(pathsObject: PathsObject, ctx: GlobalContext): ts.TypeNode; declare function transformRequestBodyObject(requestBodyObject: RequestBodyObject, options: TransformNodeOptions): ts.TypeNode; declare function transformResponseObject(responseObject: ResponseObject, options: TransformNodeOptions): ts.TypeNode; declare function transformResponsesObject(responsesObject: ResponsesObject, options: TransformNodeOptions): ts.TypeNode; declare function transformSchemaObject(schemaObject: SchemaObject | ReferenceObject, options: TransformNodeOptions): ts.TypeNode; declare function transformSchemaObjectWithComposition(schemaObject: SchemaObject | ReferenceObject, options: TransformNodeOptions): ts.TypeNode; declare const COMMENT_HEADER = "/**\n * This file was auto-generated by openapi-typescript.\n * Do not make direct changes to the file.\n */\n\n"; declare function openapiTS(source: string | URL | OpenAPI3 | Buffer | Readable, options?: OpenAPITSOptions): Promise<ts.Node[]>; // @ts-ignore export = openapiTS; export { BOOLEAN, COMMENT_HEADER, FALSE, JS_ENUM_INVALID_CHARS_RE, JS_PROPERTY_INDEX_INVALID_CHARS_RE, JS_PROPERTY_INDEX_RE, NEVER, NULL, NUMBER, QUESTION_TOKEN, SPECIAL_CHARACTER_MAP, STRING, TRUE, UNDEFINED, UNKNOWN, addJSDocComment, astToString, createDiscriminatorProperty, createRef, debug, enumCache, error, formatTime, getEntries, injectOperationObject, oapiRef, resolveRef, scanDiscriminators, stringToAST, transformComponentsObject, transformHeaderObject, transformMediaTypeObject, transformOperationObject, transformParameterObject, transformPathItemObject, transformPathsObject, transformRequestBodyObject, transformResponseObject, transformResponsesObject, transformSchema, transformSchemaObject, transformSchemaObjectWithComposition, tsArrayLiteralExpression, tsDedupe, tsEnum, tsEnumMember, tsIntersection, tsIsPrimitive, tsLiteral, tsModifiers, tsNullable, tsOmit, tsPropertyIndex, tsReadonlyArray, tsRecord, tsUnion, tsWithRequired, walk, warn }; export type { $defs, AnnotatedSchemaObject, ArraySubtype, AstToStringOptions, BooleanSubtype, CallbackObject, ComponentsObject, ContactObject, DiscriminatorObject, EncodingObject, ExampleObject, Extensable, ExternalDocumentationObject, GlobalContext, HeaderObject, InfoObject, IntegerSubtype, LicenseObject, LinkObject, MediaTypeObject, Method, NullSubtype, NumberSubtype, OAuthFlowObject, OAuthFlowsObject, ObjectSubtype, OpenAPI3, OpenAPITSOptions, OperationObject, ParameterObject, PathItemObject, PathsObject, ReferenceObject, RequestBodyObject, ResponseObject, ResponsesObject, SchemaObject, SecurityRequirementObject, SecuritySchemeObject, ServerObject, ServerVariableObject, StringSubtype, TagObject, TransformNodeOptions, TransformObject, WebhooksObject, XMLObject };