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
JavaScript
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;
}
}