lib/apiScenario/templateGenerator.ts (71 lines of code) (raw):

import { injectable } from "inversify"; import { cloneDeep } from "@azure-tools/openapi-tools-common"; import { JsonLoader } from "../swagger/jsonLoader"; import { Operation } from "../swagger/swaggerTypes"; import { StepRestCall, StepArmTemplate, Variable } from "./apiScenarioTypes"; import { getBodyParam } from "./apiScenarioLoader"; import { replaceAllInObject } from "./variableUtils"; @injectable() export class TemplateGenerator { public constructor(private jsonLoader: JsonLoader) {} public armTemplateParameterConvention( step: Pick<StepArmTemplate, "armTemplatePayload" | "secretVariables">, variables: (name: string) => Variable ) { if (step.armTemplatePayload.parameters === undefined) { return; } for (const paramName of Object.keys(step.armTemplatePayload.parameters)) { if (variables(paramName) === undefined) { continue; } const param = step.armTemplatePayload.parameters[paramName]; if (param.type !== "string" && param.type !== "securestring") { continue; } param.defaultValue = `$(${paramName})`; if (param.type === "securestring" && !step.secretVariables.includes(paramName)) { step.secretVariables.push(paramName); } } } public exampleParameterConvention( step: Pick<StepRestCall, "parameters" | "responses" | "operation">, getVariable: (name: string) => any, operation: Operation ) { const toMatch: string[] = []; const matchReplace: { [toMatch: string]: string } = {}; const parameters = cloneDeep(step.parameters); for (const paramName of Object.keys(parameters)) { if (getVariable(paramName) === undefined) { continue; } const paramValue = parameters[paramName]; if (typeof paramValue !== "string") { continue; } const valueLower = paramValue.toLowerCase(); toMatch.push(valueLower); const toReplace = `$(${paramName})`; matchReplace[valueLower] = toReplace; parameters[paramName] = toReplace; } step.parameters = parameters; const bodyParam = getBodyParam(operation, this.jsonLoader); if (bodyParam !== undefined) { const requestBody = step.parameters[bodyParam.name]; replaceAllInObject(requestBody, toMatch, matchReplace); if (requestBody?.location !== undefined) { requestBody.location = "$(location)"; } } const statusCode = Object.keys(step.responses).sort()[0]; const responseBody = cloneDeep(step.responses[statusCode].body); replaceAllInObject(responseBody, toMatch, matchReplace); step.responses[statusCode].body = responseBody; if (responseBody.body?.location !== undefined) { responseBody.body.location = "$(location)"; } } }