{"version":3,"file":"operation-object.mjs","sources":["../../src/transform/operation-object.ts"],"sourcesContent":["import ts from \"typescript\";\nimport {\n  addJSDocComment,\n  NEVER,\n  TRUE,\n  oapiRef,\n  QUESTION_TOKEN,\n  tsModifiers,\n  tsPropertyIndex,\n} from \"../lib/ts.js\";\nimport { createRef } from \"../lib/utils.js\";\nimport type {\n  OperationObject,\n  RequestBodyObject,\n  TransformNodeOptions,\n} 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(\n    ...transformParametersArray(operationObject.parameters ?? [], options)\n  );\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>(\n            operationObject.requestBody.$ref\n          )\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(\n        operationObject.responses ?? {},\n        options\n      )\n    )\n  );\n\n  // security\n  if (operationObject.security) {\n    const securityItem = operationObject.security.find(\n      (item) => !!(item as any).bearerAuth\n    );\n    if (securityItem) {\n      type.push(\n        ts.factory.createPropertySignature(\n          /* modifiers     */\n          tsModifiers({ readonly: options.ctx.immutable }),\n          /* name          */\n          tsPropertyIndex(\"authToken\"),\n          /* questionToken */\n          void 0,\n          /* type          */\n          TRUE\n        )\n      );\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) =>\n      ts.isInterfaceDeclaration(node) &&\n      (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":";;;;;;;AAwBA,SAAwB,wBAAA,CACtB,iBACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAyB,EAAC;AAGhC,EAAA,IAAA,CAAK,IAAA;AAAA,IACH,GAAG,wBAAA,CAAyB,eAAA,CAAgB,UAAA,IAAc,IAAI,OAAO;AAAA,GACvE;AAGA,EAAA,IAAI,gBAAgB,WAAA,EAAa;AAC/B,IAAA,MAAM,eAAA,GACJ,MAAA,IAAU,eAAA,CAAgB,WAAA,GACtB,OAAA,CAAQ,eAAA,CAAgB,WAAA,CAAY,IAAI,CAAA,GACxC,0BAAA,CAA2B,eAAA,CAAgB,WAAA,EAAa;AAAA,MACtD,GAAG,OAAA;AAAA,MACH,MAAM,SAAA,CAAU,CAAC,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAC;AAAA,KAC9C,CAAA;AACP,IAAA,MAAM,WAAW,CAAC,CAAA,CAChB,UAAU,eAAA,CAAgB,WAAA,GACtB,QAAQ,GAAA,CAAI,OAAA;AAAA,MACV,gBAAgB,WAAA,CAAY;AAAA,KAC9B,GACA,gBAAgB,WAAA,GACnB,QAAA;AACH,IAAA,MAAM,QAAA,GAAW,GAAG,OAAA,CAAQ,uBAAA;AAAA;AAAA,MACN,YAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA;AAAA,MAC/C,gBAAgB,aAAa,CAAA;AAAA;AAAA,MAC7B,WAAW,MAAA,GAAY,cAAA;AAAA;AAAA,MACvB;AAAA,KACtB;AACA,IAAA,eAAA,CAAgB,eAAA,CAAgB,aAAa,QAAQ,CAAA;AACrD,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,IAAA;AAAA,MACH,GAAG,OAAA,CAAQ,uBAAA;AAAA;AAAA,QACW,YAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA;AAAA,QAC/C,gBAAgB,aAAa,CAAA;AAAA;AAAA,QAC7B,cAAA;AAAA;AAAA,QACA;AAAA;AACtB,KACF;AAAA,EACF;AAGA,EAAA,IAAA,CAAK,IAAA;AAAA,IACH,GAAG,OAAA,CAAQ,uBAAA;AAAA;AAAA,MACW,YAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA;AAAA,MAC/C,gBAAgB,WAAW,CAAA;AAAA;AAAA,MAC3B,MAAA;AAAA;AAAA,MACA,wBAAA;AAAA,QAClB,eAAA,CAAgB,aAAa,EAAC;AAAA,QAC9B;AAAA;AACF;AACF,GACF;AAGA,EAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,IAAA,MAAM,YAAA,GAAe,gBAAgB,QAAA,CAAS,IAAA;AAAA,MAC5C,CAAC,IAAA,KAAS,CAAC,CAAE,IAAA,CAAa;AAAA,KAC5B;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,IAAA,CAAK,IAAA;AAAA,QACH,GAAG,OAAA,CAAQ,uBAAA;AAAA;AAAA,UAET,YAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA;AAAA,UAE/C,gBAAgB,WAAW,CAAA;AAAA;AAAA,UAE3B,MAAA;AAAA;AAAA,UAEA;AAAA;AACF,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,qBAAA,CACd,WAAA,EACA,eAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAI,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,IAAA;AAAA,IACxC,CAAC,SACC,EAAA,CAAG,sBAAA,CAAuB,IAAI,CAAA,IAC7B,IAAA,CAAiC,KAAK,IAAA,KAAS;AAAA,GACpD;AACA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,UAAA,GAAa,GAAG,OAAA,CAAQ,0BAAA;AAAA;AAAA,MACA,WAAA,CAAY;AAAA,QAChC,MAAA,EAAQ;AAAA;AAAA,OAET,CAAA;AAAA;AAAA,MACqB,EAAA,CAAG,OAAA,CAAQ,gBAAA,CAAiB,YAAY,CAAA;AAAA;AAAA,MACxC,MAAA;AAAA;AAAA,MACA,MAAA;AAAA;AAAA,MACA;AAAC,KACzB;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,IAAA,CAAK,UAAU,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,eAAA,EAAiB,OAAO,CAAA;AAE9D,EAAA,UAAA,CAAW,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,eAAA,CAAgB;AAAA,IAC9C,GAAG,UAAA,CAAW,OAAA;AAAA,IACd,GAAG,OAAA,CAAQ,uBAAA;AAAA;AAAA,MACW,YAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA;AAAA,MAC/C,gBAAgB,WAAW,CAAA;AAAA;AAAA,MAC3B,MAAA;AAAA;AAAA,MACA,EAAA,CAAG,OAAA,CAAQ,qBAAA,CAAsB,IAAI;AAAA;AAC3D,GACD,CAAA;AACH;;;;"}