UNPKG

openapi-ts-json-schema

Version:

Generate TypeScript-first JSON schemas from OpenAPI definitions

100 lines (99 loc) 4.69 kB
import type { JSONSchema4, JSONSchema6, JSONSchema7 } from 'json-schema'; import type { OpenAPIObject as OpenAPIObject_v3_0, ParameterObject as ParameterObject_v3_0, PathItemObject as PathItemObject_v3_0, ReferenceObject as ReferenceObject_v3_0, SchemaObject as SchemaObject_v3_0 } from 'openapi3-ts/oas30'; import type { OpenAPIObject as OpenAPIObject_v3_1, ParameterObject as ParameterObject_v3_1, PathItemObject as PathItemObject_v3_1, ReferenceObject as ReferenceObject_v3_1, SchemaObject as SchemaObject_v3_1 } from 'openapi3-ts/oas31'; import type { Merge, OmitIndexSignature, SetRequired } from 'type-fest'; import type { formatTypeScript, makeRelativeImportPath, saveFile } from './utils/index.js'; export type OpenApiDocument = Omit<OpenAPIObject_v3_0 | OpenAPIObject_v3_1, 'openapi' | 'info'>; type OpenApiObject_v3_0 = PathItemObject_v3_0 | SchemaObject_v3_0 | ParameterObject_v3_0 | ReferenceObject_v3_0; type OpenApiObject_v3_1 = PathItemObject_v3_1 | SchemaObject_v3_1 | ParameterObject_v3_1 | ReferenceObject_v3_1; export type OpenApiObject = OpenApiObject_v3_0 | OpenApiObject_v3_1; type OpenApiParameter_v3_0 = ParameterObject_v3_0 | ReferenceObject_v3_0; type OpenApiParameter_v3_1 = ParameterObject_v3_1 | ReferenceObject_v3_1; export type OpenApiParameter = OpenApiParameter_v3_0 | OpenApiParameter_v3_1; export type JSONSchema = OmitIndexSignature<JSONSchema4 | JSONSchema6 | JSONSchema7>; export type SchemaPatcher = (params: { schema: JSONSchema; }) => void; export type RefHandling = 'import' | 'inline' | 'keep'; export type ModuleSystem = 'cjs' | 'esm'; export type IdMapper = (input: { id: string; }) => string; export type Options = { openApiDocument: string; targets: { collections?: string[]; single?: string[]; }; moduleSystem?: ModuleSystem; schemaPatcher?: SchemaPatcher; outputPath?: string; plugins?: ReturnType<Plugin>[]; silent?: boolean; refHandling?: RefHandling; idMapper?: IdMapper; }; export type OptionsWithDefaults = Merge<SetRequired<Options, 'refHandling' | 'moduleSystem' | 'idMapper' | 'plugins'>, { targets: Required<Options['targets']>; }>; /** * Meta data for representing a specific openApi definition * @property `id` - Internal unique schema identifier. Eg `"/components/schemas/MySchema"` * @property `$id` - JSON schema Compound Schema Document `$id`. Eg `"/components/schemas/MySchema"` * @property `isRef` - True if schemas is used as `$ref` * @property `shouldBeGenerated` - True is the schema has to be generated * @property `uniqueName` - Unique JavaScript identifier used as import name. Eg: `"componentsSchemasMySchema"` * @property `openApiDefinition` - Original dereferenced openAPI definition * @property `originalSchema` - Original dereferenced JSON schema * @property `fileContent` - Text content of schema file * * @property `absoluteDirName` - Absolute path pointing to schema folder (posix or win32). Eg: `"Users/username/output/path/components/schemas"` * @property `absolutePath` - Absolute path pointing to schema file (posix or win32). Eg: `"Users/username/output/path/components/schemas/MySchema.ts"` * @property `absoluteImportPath` - Absolute import path (posix or win32, without extension). Eg: `"Users/username/output/path/components/schemas/MySchema"` */ export type SchemaMetaData = { id: string; $id: string; isRef: boolean; shouldBeGenerated: boolean; uniqueName: string; openApiDefinition?: OpenApiObject; originalSchema: JSONSchema; fileContent?: string; absoluteDirName: string; absolutePath: string; absoluteImportPath: string; }; export type SchemaMetaDataMap = Map<string, // Schema file relative path SchemaMetaData>; export type ReturnPayload = { outputPath: string; metaData: { schemas: SchemaMetaDataMap; }; }; type OnInitInput = { options: OptionsWithDefaults; }; type OnBeforeGenerationInput = ReturnPayload & { options: OptionsWithDefaults; utils: { makeRelativeImportPath: typeof makeRelativeImportPath; formatTypeScript: typeof formatTypeScript; saveFile: typeof saveFile; }; }; type OnBeforeFileSave = ReturnPayload & { options: OptionsWithDefaults; utils: { makeRelativeImportPath: typeof makeRelativeImportPath; formatTypeScript: typeof formatTypeScript; saveFile: typeof saveFile; }; }; export type Plugin<PluginOptions = void> = (options: PluginOptions) => { onInit?: (input: OnInitInput) => Promise<void>; onBeforeGeneration?: (input: OnBeforeGenerationInput) => Promise<void>; onBeforeSaveFile?: (input: OnBeforeFileSave) => Promise<void>; }; export {};