UNPKG

counterfact

Version:

Generate a TypeScript-based mock server from an OpenAPI spec in seconds — with stateful routes, hot reload, and REPL support.

44 lines (43 loc) 1.96 kB
import { printObjectWithoutQuotes } from "./printers.js"; import { ResponseTypeCoder } from "./response-type-coder.js"; import { TypeCoder } from "./type-coder.js"; export class ResponsesTypeCoder extends TypeCoder { openApi2MediaTypes; constructor(requirement, version = "", openApi2MediaTypes = []) { super(requirement, version); this.openApi2MediaTypes = openApi2MediaTypes; } typeForDefaultStatusCode(listedStatusCodes) { const definedStatusCodes = listedStatusCodes.filter((key) => key !== "default"); if (definedStatusCodes.length === 0) { return "[statusCode in HttpStatusCode]"; } return `[statusCode in Exclude<HttpStatusCode, ${definedStatusCodes.join(" | ")}>]`; } normalizeStatusCode(statusCode) { if (statusCode === "default") { return this.typeForDefaultStatusCode(Object.keys(this.requirement.data)); } return statusCode; } buildResponseObjectType(script) { const entries = this.requirement.map((response, responseCode) => [ this.normalizeStatusCode(responseCode), new ResponseTypeCoder(response, this.version, this.openApi2MediaTypes).write(script), ]); const explicitEntries = entries.filter(([key]) => !key.startsWith("[")); const mappedEntries = entries.filter(([key]) => key.startsWith("[")); if (explicitEntries.length > 0 && mappedEntries.length > 0) { return `${printObjectWithoutQuotes(explicitEntries)} & ${printObjectWithoutQuotes(mappedEntries)}`; } return printObjectWithoutQuotes(entries); } writeCode(script) { script.importSharedType("ResponseBuilderFactory"); const text = `ResponseBuilderFactory<${this.buildResponseObjectType(script)}>`; if (text.includes("HttpStatusCode")) { script.importSharedType("HttpStatusCode"); } return text; } }