UNPKG

@kubb/plugin-oas

Version:

OpenAPI Specification (OAS) plugin for Kubb, providing core functionality for parsing and processing OpenAPI/Swagger schemas for code generation.

178 lines (158 loc) 4.63 kB
import type { Group, Output, Plugin, PluginFactoryOptions, ResolveNameParams } from '@kubb/core' import type { KubbFile } from '@kubb/fabric-core/types' import type { contentType, HttpMethod, Oas, Operation, SchemaObject } from '@kubb/oas' import type { Generator } from './generators/types.ts' type Context = { getOas(): Promise<Oas> getBaseURL(): Promise<string | undefined> } declare global { namespace Kubb { interface PluginContext extends Context {} } } export type ResolvePathOptions = { pluginKey?: Plugin['key'] group?: { tag?: string path?: string } type?: ResolveNameParams['type'] } export type Options = { /** * Validate your input(see kubb.config) based on '@readme/openapi-parser'. * @default true */ validate?: boolean /** * Specify the export location for the files and define the behavior of the output * @default { path: 'schemas', barrelType: 'named' } */ output?: Output<Oas> /** * Group the JSON files based on the provided name. */ group?: Group /** * Which server to use from the array of `servers.url[serverIndex]` * @example * - `0` will return `http://petstore.swagger.io/api` * - `1` will return `http://localhost:3000` */ serverIndex?: number /** * Define which contentType should be used. * By default, the first JSON valid mediaType will be used */ contentType?: contentType /** * Defines how the discriminator value should be interpreted during processing. * * @default 'strict' * * @example * - `inherit`: Replaces the `oneOf` schema with the schema referenced by `discriminator.mapping[key]`. * - `strict`: Uses the `oneOf` schemas as defined, without modification. * * @see https://github.com/kubb-labs/kubb/issues/1736 */ discriminator?: 'strict' | 'inherit' /** * Override some behaviour of the Oas class instance, see '@kubb/oas' */ oasClass?: typeof Oas /** * Define some generators next to the JSON generation */ generators?: Array<Generator<PluginOas>> } /** * `propertyName` is the ref name + resolved with the nameResolver * @example import { Pet } from './Pet' * * `originalName` is the original name used(in PascalCase), only used to remove duplicates * * `pluginKey` can be used to override the current plugin being used, handy when you want to import a type/schema out of another plugin * @example import a type(plugin-ts) for a mock file(swagger-faker) */ export type Ref = { propertyName: string originalName: string path: KubbFile.Path pluginKey?: Plugin['key'] } export type Refs = Record<string, Ref> export type Resolver = { /** * Original name or name resolved by `resolveName({ name: operation?.getOperationId() as string, pluginName })` */ name: string baseName: KubbFile.BaseName path: KubbFile.Path } export type OperationSchema = { /** * Converted name, contains already `PathParams`, `QueryParams`, ... */ name: string schema: SchemaObject operation?: Operation /** * OperationName in PascalCase, only being used in OperationGenerator */ operationName: string description?: string statusCode?: number keys?: string[] keysToOmit?: string[] withData?: boolean } export type OperationSchemas = { pathParams?: OperationSchema & { keysToOmit?: never } queryParams?: OperationSchema & { keysToOmit?: never } headerParams?: OperationSchema & { keysToOmit?: never } request?: OperationSchema response: OperationSchema responses: Array<OperationSchema> statusCodes?: Array<OperationSchema> errors?: Array<OperationSchema> } type ByTag = { type: 'tag' pattern: string | RegExp } type ByOperationId = { type: 'operationId' pattern: string | RegExp } type ByPath = { type: 'path' pattern: string | RegExp } type ByMethod = { type: 'method' pattern: HttpMethod | RegExp } // TODO implement as alternative for ByMethod // type ByMethods = { // type: 'methods' // pattern: Array<HttpMethod> // } type BySchemaName = { type: 'schemaName' pattern: string | RegExp } type ByContentType = { type: 'contentType' pattern: string | RegExp } export type Exclude = ByTag | ByOperationId | ByPath | ByMethod | ByContentType export type Include = ByTag | ByOperationId | ByPath | ByMethod | ByContentType export type Override<TOptions> = (ByTag | ByOperationId | ByPath | ByMethod | BySchemaName | ByContentType) & { options: Partial<TOptions> } type ResolvedOptions = Options & { output: Output<Oas> } export type PluginOas = PluginFactoryOptions<'plugin-oas', Options, ResolvedOptions, Context, ResolvePathOptions>