@sasonarik/nextapi-swagger
Version:
CLI tool to generate Next.js API routes and types from Swagger/OpenAPI specs
92 lines (91 loc) • 3.26 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.resolveType = resolveType;
exports.cleanTypeName = cleanTypeName;
exports.isApiResultSchema = isApiResultSchema;
exports.ensureApiBaseUrlsFile = ensureApiBaseUrlsFile;
exports.detectSrcRoot = detectSrcRoot;
exports.isNextJsProject = isNextJsProject;
const path_1 = __importDefault(require("path"));
const fs_extra_1 = __importDefault(require("fs-extra"));
function resolveType(property) {
if (!property || typeof property !== "object")
return "any";
if (property.$ref) {
return property.$ref.split("/").pop()?.split(".").pop() || "any";
}
switch (property.type) {
case "string":
return "string";
case "integer":
case "number":
return "number";
case "boolean":
return "boolean";
case "array":
return `${resolveType(property.items)}[]`;
case "object":
if (property.properties) {
const props = Object.entries(property.properties)
.map(([key, val]) => `${key}: ${resolveType(val)};`)
.join(" ");
return `{ ${props} }`;
}
return "Record<string, any>";
default:
return "any";
}
}
function cleanTypeName(nameRaw) {
return nameRaw.split(".").pop() || nameRaw;
}
function isApiResultSchema(schema) {
if (!schema || schema.type !== "object")
return false;
const props = schema.properties || {};
return (typeof props.status === "object" &&
typeof props.message === "object" &&
"data" in props);
}
async function ensureApiBaseUrlsFile(srcRoot, urls) {
const filePath = path_1.default.join(srcRoot, "utils", "apiBaseUrls.ts");
const lines = ["// Auto-generated API base URLs"];
urls.forEach((url, i) => {
const name = `apiBase${i + 1}`;
lines.push(`export const ${name} = '${url.replace(/\/swagger.*$/, "")}';`);
});
await fs_extra_1.default.writeFile(filePath, lines.join("\n"));
}
function detectSrcRoot() {
const cwd = process.cwd();
const srcPath = path_1.default.join(cwd, "src");
const appPath = path_1.default.join(cwd, "app");
if (fs_extra_1.default.existsSync(path_1.default.join(srcPath, "app"))) {
return path_1.default.join(srcPath);
}
else if (fs_extra_1.default.existsSync(appPath)) {
return cwd;
}
else {
return fs_extra_1.default.existsSync(srcPath) ? srcPath : cwd;
}
}
function isNextJsProject(projectRoot) {
const packageJsonPath = path_1.default.join(projectRoot, "package.json");
const nextConfigPath = path_1.default.join(projectRoot, "next.config.js");
if (fs_extra_1.default.existsSync(nextConfigPath)) {
return true;
}
if (fs_extra_1.default.existsSync(packageJsonPath)) {
const pkg = fs_extra_1.default.readJsonSync(packageJsonPath);
const deps = {
...pkg.dependencies,
...pkg.devDependencies,
};
return !!deps?.next;
}
return false;
}