{"version":3,"file":"operation-object.mjs","sources":["../../src/transform/operation-object.ts"],"sourcesContent":["import ts from \"typescript\";\nimport { NEVER, QUESTION_TOKEN, addJSDocComment, oapiRef, tsModifiers, tsPropertyIndex } from \"../lib/ts.js\";\nimport { createRef } from \"../lib/utils.js\";\nimport type { OperationObject, RequestBodyObject, TransformNodeOptions } from \"../types.js\";\nimport { transformParametersArray } from \"./parameters-array.js\";\nimport transformRequestBodyObject from \"./request-body-object.js\";\nimport transformResponsesObject from \"./responses-object.js\";\n\n/**\n * Transform OperationObject nodes (4.8.10)\n * @see https://spec.openapis.org/oas/v3.1.0#operation-object\n */\nexport default function transformOperationObject(\n  operationObject: OperationObject,\n  options: TransformNodeOptions,\n): ts.TypeElement[] {\n  const type: ts.TypeElement[] = [];\n\n  // parameters\n  type.push(...transformParametersArray(operationObject.parameters ?? [], options));\n\n  // requestBody\n  if (operationObject.requestBody) {\n    const requestBodyType =\n      \"$ref\" in operationObject.requestBody\n        ? oapiRef(operationObject.requestBody.$ref)\n        : transformRequestBodyObject(operationObject.requestBody, {\n            ...options,\n            path: createRef([options.path, \"requestBody\"]),\n          });\n    const required = !!(\n      \"$ref\" in operationObject.requestBody\n        ? options.ctx.resolve<RequestBodyObject>(operationObject.requestBody.$ref)\n        : operationObject.requestBody\n    )?.required;\n    const property = ts.factory.createPropertySignature(\n      /* modifiers     */ tsModifiers({ readonly: options.ctx.immutable }),\n      /* name          */ tsPropertyIndex(\"requestBody\"),\n      /* questionToken */ required ? undefined : QUESTION_TOKEN,\n      /* type          */ requestBodyType,\n    );\n    addJSDocComment(operationObject.requestBody, property);\n    type.push(property);\n  } else {\n    type.push(\n      ts.factory.createPropertySignature(\n        /* modifiers     */ tsModifiers({ readonly: options.ctx.immutable }),\n        /* name          */ tsPropertyIndex(\"requestBody\"),\n        /* questionToken */ QUESTION_TOKEN,\n        /* type          */ NEVER,\n      ),\n    );\n  }\n\n  // responses\n  type.push(\n    ts.factory.createPropertySignature(\n      /* modifiers     */ tsModifiers({ readonly: options.ctx.immutable }),\n      /* name          */ tsPropertyIndex(\"responses\"),\n      /* questionToken */ undefined,\n      /* type          */ transformResponsesObject(operationObject.responses ?? {}, options),\n    ),\n  );\n\n  return type;\n}\n\n/** inject an operation at the top level */\nexport function injectOperationObject(\n  operationId: string,\n  operationObject: OperationObject,\n  options: TransformNodeOptions,\n): void {\n  // find or create top-level operations interface\n  let operations = options.ctx.injectFooter.find(\n    (node) => ts.isInterfaceDeclaration(node) && (node as ts.InterfaceDeclaration).name.text === \"operations\",\n  ) as unknown as ts.InterfaceDeclaration;\n  if (!operations) {\n    operations = ts.factory.createInterfaceDeclaration(\n      /* modifiers       */ tsModifiers({\n        export: true,\n        // important: do NOT make this immutable\n      }),\n      /* name            */ ts.factory.createIdentifier(\"operations\"),\n      /* typeParameters  */ undefined,\n      /* heritageClauses */ undefined,\n      /* members         */ [],\n    );\n    options.ctx.injectFooter.push(operations);\n  }\n\n  // inject operation object\n  const type = transformOperationObject(operationObject, options);\n  // @ts-expect-error this is OK to mutate\n  operations.members = ts.factory.createNodeArray([\n    ...operations.members,\n    ts.factory.createPropertySignature(\n      /* modifiers     */ tsModifiers({ readonly: options.ctx.immutable }),\n      /* name          */ tsPropertyIndex(operationId),\n      /* questionToken */ undefined,\n      /* type          */ ts.factory.createTypeLiteralNode(type),\n    ),\n  ]);\n}\n"],"names":[],"mappings":"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"}