UNPKG

openapi-typescript

Version:

Convert OpenAPI 3.0 & 3.1 schemas to TypeScript

79 lines (76 loc) 2.98 kB
import ts from 'typescript'; import { tsModifiers, tsPropertyIndex, QUESTION_TOKEN, NEVER, oapiRef, addJSDocComment } from '../lib/ts.mjs'; import { createRef } from '../lib/utils.mjs'; import transformOperationObject, { injectOperationObject } from './operation-object.mjs'; import { transformParametersArray } from './parameters-array.mjs'; function transformPathItemObject(pathItem, options) { const type = []; type.push( ...transformParametersArray(pathItem.parameters ?? [], { ...options, path: createRef([options.path, "parameters"]) }) ); for (const method of ["get", "put", "post", "delete", "options", "head", "patch", "trace"]) { const operationObject = pathItem[method]; if (!operationObject || options.ctx.excludeDeprecated && ("$ref" in operationObject ? options.ctx.resolve(operationObject.$ref) : operationObject)?.deprecated) { type.push( ts.factory.createPropertySignature( /* modifiers */ tsModifiers({ readonly: options.ctx.immutable }), /* name */ tsPropertyIndex(method), /* questionToken */ QUESTION_TOKEN, /* type */ NEVER ) ); continue; } const keyedParameters = {}; if (!("$ref" in operationObject)) { for (const parameter of [...pathItem.parameters ?? [], ...operationObject.parameters ?? []]) { const name = "$ref" in parameter ? `${options.ctx.resolve(parameter.$ref)?.in}-${options.ctx.resolve(parameter.$ref)?.name}` : `${parameter.in}-${parameter.name}`; if (name) { keyedParameters[name] = parameter; } } } let operationType; if ("$ref" in operationObject) { operationType = oapiRef(operationObject.$ref); } else if (operationObject.operationId) { const operationId = operationObject.operationId.replace(HASH_RE, "/"); operationType = oapiRef(createRef(["operations", operationId])); injectOperationObject( operationId, { ...operationObject, parameters: Object.values(keyedParameters) }, { ...options, path: createRef([options.path, method]) } ); } else { operationType = ts.factory.createTypeLiteralNode( transformOperationObject( { ...operationObject, parameters: Object.values(keyedParameters) }, { ...options, path: createRef([options.path, method]) } ) ); } const property = ts.factory.createPropertySignature( /* modifiers */ tsModifiers({ readonly: options.ctx.immutable }), /* name */ tsPropertyIndex(method), /* questionToken */ void 0, /* type */ operationType ); addJSDocComment(operationObject, property); type.push(property); } return ts.factory.createTypeLiteralNode(type); } const HASH_RE = /#/g; export { transformPathItemObject as default }; //# sourceMappingURL=path-item-object.mjs.map