counterfact
Version:
Generate a TypeScript-based mock server from an OpenAPI spec in seconds — with stateful routes, hot reload, and REPL support.
45 lines (44 loc) • 1.71 kB
JavaScript
import { pathJoin } from "../util/forward-slash-path.js";
import { buildJsDoc } from "./jsdoc.js";
import { SchemaTypeCoder } from "./schema-type-coder.js";
import { TypeCoder } from "./type-coder.js";
export class ParametersTypeCoder extends TypeCoder {
placement;
constructor(requirement, version = "", placement = "") {
super(requirement, version);
this.placement = placement;
}
names() {
return super.names("parameters");
}
writeCode(script) {
const typeDefinitions = (this.requirement?.data ?? [])
.map((_, index) => {
return this.requirement.get(index);
})
.filter((parameter) => parameter.get("in").data === this.placement)
.map((parameter) => {
const name = parameter.get("name")?.data;
const required = parameter.get("required")?.data;
const optionalFlag = required ? "" : "?";
const schema = parameter.has("schema")
? parameter.get("schema")
: parameter;
const comment = buildJsDoc(parameter.data);
const commentPrefix = comment ? `\n${comment}` : "";
const typeString = new SchemaTypeCoder(schema, this.version).write(script);
return `${commentPrefix}"${name}"${optionalFlag}: ${typeString}`;
});
if (typeDefinitions.length === 0) {
return "never";
}
return `{${typeDefinitions.join(", ")}}`;
}
modulePath() {
const pathString = this.requirement.url
.split("/")
.at(-2)
.replaceAll("~1", "/");
return `${pathJoin("parameters", pathString)}.types.ts`;
}
}