UNPKG

openapi-typescript

Version:

Convert OpenAPI 3.0 & 3.1 schemas to TypeScript

1 lines 8.54 kB
{"version":3,"file":"paths-object.mjs","sources":["../../src/transform/paths-object.ts"],"sourcesContent":["import ts from \"typescript\";\nimport { performance } from \"node:perf_hooks\";\nimport { addJSDocComment, oapiRef, stringToAST, tsModifiers, tsPropertyIndex } from \"../lib/ts.js\";\nimport { createRef, debug, getEntries } from \"../lib/utils.js\";\nimport type {\n GlobalContext,\n OperationObject,\n ParameterObject,\n PathItemObject,\n PathsObject,\n ReferenceObject,\n} from \"../types.js\";\nimport transformPathItemObject, { type Method } from \"./path-item-object.js\";\n\nconst PATH_PARAM_RE = /\\{[^}]+\\}/g;\n\n/**\n * Transform the PathsObject node (4.8.8)\n * @see https://spec.openapis.org/oas/v3.1.0#operation-object\n */\nexport default function transformPathsObject(pathsObject: PathsObject, ctx: GlobalContext): ts.TypeNode {\n const type: ts.TypeElement[] = [];\n for (const [url, pathItemObject] of getEntries(pathsObject, ctx)) {\n if (!pathItemObject || typeof pathItemObject !== \"object\") {\n continue;\n }\n\n const pathT = performance.now();\n\n // handle $ref\n if (\"$ref\" in pathItemObject) {\n const property = ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({ readonly: ctx.immutable }),\n /* name */ tsPropertyIndex(url),\n /* questionToken */ undefined,\n /* type */ oapiRef(pathItemObject.$ref),\n );\n addJSDocComment(pathItemObject, property);\n type.push(property);\n } else {\n const pathItemType = transformPathItemObject(pathItemObject, {\n path: createRef([\"paths\", url]),\n ctx,\n });\n\n // pathParamsAsTypes\n if (ctx.pathParamsAsTypes && url.includes(\"{\")) {\n const pathParams = extractPathParams(pathItemObject, ctx);\n const matches = url.match(PATH_PARAM_RE);\n let rawPath = `\\`${url}\\``;\n if (matches) {\n for (const match of matches) {\n const paramName = match.slice(1, -1);\n const param = pathParams[paramName];\n switch (param?.schema?.type) {\n case \"number\":\n case \"integer\":\n rawPath = rawPath.replace(match, \"${number}\");\n break;\n case \"boolean\":\n rawPath = rawPath.replace(match, \"${boolean}\");\n break;\n default:\n rawPath = rawPath.replace(match, \"${string}\");\n break;\n }\n }\n // note: creating a string template literal’s AST manually is hard!\n // just pass an arbitrary string to TS\n const pathType = (stringToAST(rawPath)[0] as any)?.expression;\n if (pathType) {\n type.push(\n ts.factory.createIndexSignature(\n /* modifiers */ tsModifiers({ readonly: ctx.immutable }),\n /* parameters */ [\n ts.factory.createParameterDeclaration(\n /* modifiers */ undefined,\n /* dotDotDotToken */ undefined,\n /* name */ \"path\",\n /* questionToken */ undefined,\n /* type */ pathType,\n /* initializer */ undefined,\n ),\n ],\n /* type */ pathItemType,\n ),\n );\n continue;\n }\n }\n }\n\n type.push(\n ts.factory.createPropertySignature(\n /* modifiers */ tsModifiers({ readonly: ctx.immutable }),\n /* name */ tsPropertyIndex(url),\n /* questionToken */ undefined,\n /* type */ pathItemType,\n ),\n );\n\n debug(`Transformed path \"${url}\"`, \"ts\", performance.now() - pathT);\n }\n }\n\n return ts.factory.createTypeLiteralNode(type);\n}\n\nfunction extractPathParams(pathItemObject: PathItemObject, ctx: GlobalContext) {\n const params: Record<string, ParameterObject> = {};\n for (const p of pathItemObject.parameters ?? []) {\n const resolved = \"$ref\" in p && p.$ref ? ctx.resolve<ParameterObject>(p.$ref) : (p as ParameterObject);\n if (resolved && resolved.in === \"path\") {\n params[resolved.name] = resolved;\n }\n }\n for (const method of [\"get\", \"put\", \"post\", \"delete\", \"options\", \"head\", \"patch\", \"trace\"] as Method[]) {\n if (!(method in pathItemObject)) {\n continue;\n }\n const resolvedMethod = (pathItemObject[method] as ReferenceObject).$ref\n ? ctx.resolve<OperationObject>((pathItemObject[method] as ReferenceObject).$ref)\n : (pathItemObject[method] as OperationObject);\n if (resolvedMethod?.parameters) {\n for (const p of resolvedMethod.parameters) {\n const resolvedParam = \"$ref\" in p && p.$ref ? ctx.resolve<ParameterObject>(p.$ref) : (p as ParameterObject);\n if (resolvedParam && resolvedParam.in === \"path\") {\n params[resolvedParam.name] = resolvedParam;\n }\n }\n }\n }\n return params;\n}\n"],"names":[],"mappings":"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"}