infinity-forge
Version:
114 lines • 5.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateOpenApiClient = generateOpenApiClient;
// Convert an OpenAPI schema (or reference) into a valid TypeScript type string.
function convertSchemaToTs(schema, indent) {
var _a;
if (indent === void 0) { indent = 0; }
var space = function (lvl) { return " ".repeat(lvl); };
if (!schema)
return "any";
// Handle plain object mapping (already processed params/request body)
if (typeof schema === "object" && !Array.isArray(schema) && !schema["type"] && !schema["$ref"]) {
var props = Object.entries(schema)
.map(function (_a) {
var k = _a[0], v = _a[1];
var safeKey = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(k) ? k : "'".concat(k, "'");
var valueTs = Array.isArray(v)
? v.length
? "".concat(convertSchemaToTs(v[0], indent + 2), "[]")
: "any[]"
: typeof v === "string"
? (function () {
var raw = v.trim();
var primitiveRegex = /^(string|number|boolean|any|unknown|void|never|object|Record<.*>|Date)$/;
var looksLikeType = primitiveRegex.test(raw) || raw.includes(" | ") || raw.includes("<") || raw.includes("| undefined") || raw.includes("[");
return looksLikeType ? raw : "'".concat(raw.replace(/'/g, "\\'"), "'");
})()
: typeof v === "number" || typeof v === "bigint"
? "".concat(v)
: typeof v === "boolean"
? "".concat(v)
: typeof v === "object"
? convertSchemaToTs(v, indent + 2)
: "any";
return "".concat(space(indent + 1)).concat(safeKey, ": ").concat(valueTs, ";");
})
.join("\n");
return "{\n".concat(props, "\n").concat(space(indent), "}");
}
// Handle $ref references
if (schema["$ref"]) {
return schema["$ref"].replace("#/components/schemas/", "");
}
var s = schema;
// Arrays
if (s.type === "array" && s.items) {
return "".concat(convertSchemaToTs(s.items, indent), "[]");
}
// Objects
if (s.type === "object" || s.properties || s.additionalProperties) {
// Dictionaries (additionalProperties)
if (s.additionalProperties) {
var valueTs = convertSchemaToTs(s.additionalProperties, indent + 1);
return "Record<string, ".concat(valueTs, ">");
}
// Regular object with defined props
if (s.properties) {
var props = Object.entries(s.properties)
.map(function (_a) {
var key = _a[0], value = _a[1];
var safeKey = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key)
? key
: "'".concat(key, "'");
return "".concat(space(indent + 1)).concat(safeKey, ": ").concat(convertSchemaToTs(value, indent + 1), ";");
})
.join("\n");
return "{\n".concat(props, "\n").concat(space(indent), "}");
}
// Fallback to generic object
return "Record<string, any>";
}
// Primitive & formatted types
switch (s.type) {
case "integer":
case "number":
return "number";
case "boolean":
return "boolean";
case "string":
if (s.format === "date-time" || s.format === "date") {
return "Date";
}
return "string";
default:
// allOf with single reference
if (((_a = s.allOf) === null || _a === void 0 ? void 0 : _a[0]) && s.allOf[0]["$ref"]) {
return s.allOf[0]["$ref"].replace("#/components/schemas/", "");
}
return "any";
}
}
function generateMethodsString(methods) {
return Object.keys(methods)
.map(function (method) {
var _a = methods[method], params = _a.params, requestBody = _a.requestBody, result = _a.result;
var paramsString = params ? convertSchemaToTs(params, 3) : "null";
var requestBodyString = requestBody
? convertSchemaToTs(requestBody, 3)
: "null";
var resultString = result ? convertSchemaToTs(result, 3) : "null";
return " ".concat(method, ": {\n params: ").concat(paramsString, ",\n requestBody: ").concat(requestBodyString, ",\n result: ").concat(resultString, "\n }");
})
.join(",\n");
}
function generateOpenApiClient(routesApi, interfacesOpenApi) {
var apiLiteral = Object.keys(routesApi)
.map(function (path) {
var methods = routesApi[path];
return " \"".concat(path, "\": {\n").concat(generateMethodsString(methods), "\n }");
})
.join(",\n");
return "export type Swagger = {\n".concat(apiLiteral, "\n};\n\n").concat(interfacesOpenApi);
}
//# sourceMappingURL=index.js.map