UNPKG

@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
"use strict"; 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; }