@typespec/openapi
Version:
TypeSpec library providing OpenAPI concepts
133 lines • 4.87 kB
TypeScript
import type { DecoratorContext, DecoratorValidatorCallbacks, Model, Namespace, Operation, Type } from "@typespec/compiler";
export interface AdditionalInfo {
readonly [key: string]: unknown;
readonly title?: string;
readonly summary?: string;
readonly version?: string;
readonly termsOfService?: string;
readonly contact?: Contact;
readonly license?: License;
}
export interface TagMetadataWithName {
readonly [key: string]: unknown;
readonly name: string;
readonly description?: string;
readonly externalDocs?: ExternalDocs;
readonly parent?: string;
readonly summary?: string;
readonly kind?: string;
}
export interface TagMetadata {
readonly [key: string]: unknown;
readonly description?: string;
readonly externalDocs?: ExternalDocs;
readonly parent?: string;
readonly summary?: string;
readonly kind?: string;
}
export interface Contact {
readonly [key: string]: unknown;
readonly name?: string;
readonly url?: string;
readonly email?: string;
}
export interface License {
readonly [key: string]: unknown;
readonly name: string;
readonly url?: string;
}
export interface ExternalDocs {
readonly [key: string]: unknown;
readonly url: string;
readonly description?: string;
}
/**
* Specify the OpenAPI `operationId` property for this operation.
*
* @param operationId Operation id value.
* @example
* ```typespec
* @operationId("download")
* op read(): string;
* ```
*/
export type OperationIdDecorator = (context: DecoratorContext, target: Operation, operationId: string) => DecoratorValidatorCallbacks | void;
/**
* Attach some custom data to the OpenAPI element generated from this type.
*
* @param key Extension key.
* @param value Extension value.
* @example
* ```typespec
* @extension("x-custom", "My value")
* @extension("x-pageable", #{nextLink: "x-next-link"})
* op read(): string;
* ```
*/
export type ExtensionDecorator = (context: DecoratorContext, target: Type, key: string, value: unknown) => DecoratorValidatorCallbacks | void;
/**
* Specify that this model is to be treated as the OpenAPI `default` response.
* This differs from the compiler built-in `@error` decorator as this does not necessarily represent an error.
*
* @example
* ```typespec
* @defaultResponse
* model PetStoreResponse is object;
*
* op listPets(): Pet[] | PetStoreResponse;
* ```
*/
export type DefaultResponseDecorator = (context: DecoratorContext, target: Model) => DecoratorValidatorCallbacks | void;
/**
* Specify the OpenAPI `externalDocs` property for this type.
*
* @param url Url to the docs
* @param description Description of the docs
* @example
* ```typespec
* @externalDocs("https://example.com/detailed.md", "Detailed information on how to use this operation")
* op listPets(): Pet[];
* ```
*/
export type ExternalDocsDecorator = (context: DecoratorContext, target: Type, url: string, description?: string) => DecoratorValidatorCallbacks | void;
/**
* Specify OpenAPI additional information.
* The service `title` is already specified using `@service`.
*
* @param additionalInfo Additional information
*/
export type InfoDecorator = (context: DecoratorContext, target: Namespace, additionalInfo: AdditionalInfo) => DecoratorValidatorCallbacks | void;
/**
* Specify OpenAPI tag metadata. Can be used in two forms:
* - Inline form: specify a single tag by name with optional metadata.
* - Array form: specify an ordered list of tags with their metadata in a single decorator call.
*
* @param name Tag name (inline form) or array of tags with metadata (array form).
* @param tagMetadata Additional information for the tag. Only used in inline form.
* @example Inline form
* ```typespec
* @service()
* @tagMetadata("Tag Name", #{description: "Tag description", externalDocs: #{url: "https://example.com", description: "More info.", `x-custom`: "string"}, `x-custom`: "string"})
* @tagMetadata("Child Tag", #{description: "Child tag description", parent: "Tag Name"})
* namespace PetStore {}
* ```
* @example Array form (preserves explicit tag order)
* ```typespec
* @service()
* @tagMetadata(#[
* #{ name: "First Tag", description: "First tag description" },
* #{ name: "Second Tag", description: "Second tag description" },
* ])
* namespace PetStore {}
* ```
*/
export type TagMetadataDecorator = (context: DecoratorContext, target: Namespace, name: string | readonly TagMetadataWithName[], tagMetadata?: TagMetadata) => DecoratorValidatorCallbacks | void;
export type TypeSpecOpenAPIDecorators = {
operationId: OperationIdDecorator;
extension: ExtensionDecorator;
defaultResponse: DefaultResponseDecorator;
externalDocs: ExternalDocsDecorator;
info: InfoDecorator;
tagMetadata: TagMetadataDecorator;
};
//# sourceMappingURL=TypeSpec.OpenAPI.d.ts.map