added script to generate open api scheme automatically - execute with npm run watch:openapi
This commit is contained in:
@ -1,41 +1,103 @@
|
||||
// fetch-openapi.js
|
||||
const fs = require('fs');
|
||||
const https = require('https');
|
||||
const { exec } = require('child_process');
|
||||
// fetch-and-generate-openapi.js
|
||||
import fs from 'fs';
|
||||
import http from 'http';
|
||||
import { exec } from 'child_process';
|
||||
import chokidar from 'chokidar';
|
||||
import path from 'path';
|
||||
import util from 'util';
|
||||
|
||||
// FastAPI server URL (make sure your server is running locally at this address)
|
||||
const OPENAPI_URL = 'http://127.0.0.1:8000/openapi.json';
|
||||
const SCHEMA_PATH = path.resolve('./src/openapi.json');
|
||||
const OUTPUT_DIRECTORY = path.resolve('./openapi');
|
||||
|
||||
// Path to save the OpenAPI schema file and TypeScript types
|
||||
const SCHEMA_PATH = './src/schema/openapi.json';
|
||||
const TYPES_PATH = './src/types/api-types.ts';
|
||||
console.log(`Using SCHEMA_PATH: ${SCHEMA_PATH}`);
|
||||
console.log(`Using OUTPUT_DIRECTORY: ${OUTPUT_DIRECTORY}`);
|
||||
|
||||
// Fetch OpenAPI JSON
|
||||
https.get(OPENAPI_URL, (res) => {
|
||||
let data = '';
|
||||
const execPromisified = util.promisify(exec);
|
||||
|
||||
res.on('data', chunk => {
|
||||
data += chunk;
|
||||
});
|
||||
let isGenerating = false;
|
||||
const debounceDelay = 500; // 500ms debounce
|
||||
|
||||
res.on('end', () => {
|
||||
// Save the fetched OpenAPI JSON to a file
|
||||
fs.writeFileSync(SCHEMA_PATH, data, 'utf8');
|
||||
console.log(`✅ OpenAPI schema saved to ${SCHEMA_PATH}`);
|
||||
function debounce(func, delay) {
|
||||
let timer;
|
||||
return (...args) => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => {
|
||||
func.apply(this, args);
|
||||
}, delay);
|
||||
};
|
||||
}
|
||||
|
||||
// Run openapi-typescript to generate TypeScript types
|
||||
exec(`npx openapi-typescript ${SCHEMA_PATH} --output ${TYPES_PATH}`, (error, stdout, stderr) => {
|
||||
if (error) {
|
||||
console.error(`❌ Error generating types: ${error}`);
|
||||
return;
|
||||
}
|
||||
if (stderr) {
|
||||
console.error(`⚠️ stderr: ${stderr}`);
|
||||
return;
|
||||
}
|
||||
console.log(`✅ TypeScript types generated at ${TYPES_PATH}`);
|
||||
async function fetchAndGenerate() {
|
||||
if (isGenerating) {
|
||||
console.log("⚠️ Generation is already running.");
|
||||
return;
|
||||
}
|
||||
isGenerating = true;
|
||||
|
||||
console.log("🚀 Fetching OpenAPI schema...");
|
||||
|
||||
try {
|
||||
const res = await new Promise((resolve, reject) => {
|
||||
http.get(OPENAPI_URL, resolve).on('error', reject);
|
||||
});
|
||||
});
|
||||
}).on("error", (err) => {
|
||||
console.error("Error fetching OpenAPI schema: " + err.message);
|
||||
});
|
||||
|
||||
let data = '';
|
||||
res.on('data', (chunk) => {
|
||||
data += chunk;
|
||||
});
|
||||
|
||||
res.on('end', async () => {
|
||||
try {
|
||||
fs.writeFileSync(SCHEMA_PATH, data, 'utf8');
|
||||
console.log(`✅ OpenAPI schema saved to ${SCHEMA_PATH}`);
|
||||
} catch (writeError) {
|
||||
console.error(`❌ Error saving OpenAPI schema: ${writeError}`);
|
||||
isGenerating = false;
|
||||
return;
|
||||
}
|
||||
|
||||
console.log("🧼 Cleaning output directory...");
|
||||
try {
|
||||
await fs.promises.rm(OUTPUT_DIRECTORY, { recursive: true, force: true });
|
||||
console.log(`✅ Output directory cleaned at ${OUTPUT_DIRECTORY}`);
|
||||
|
||||
// Verify directory removal
|
||||
if (fs.existsSync(OUTPUT_DIRECTORY)) {
|
||||
console.error(`❌ Output directory still exists: ${OUTPUT_DIRECTORY}`);
|
||||
} else {
|
||||
console.log(`✅ Confirmed removal of ${OUTPUT_DIRECTORY}`);
|
||||
}
|
||||
|
||||
const command = `npx openapi -i ${SCHEMA_PATH} -o ${OUTPUT_DIRECTORY}`;
|
||||
console.log(`Executing debug command: ${command}`);
|
||||
|
||||
const { stdout, stderr } = await execPromisified(command);
|
||||
console.log("🔍 Inside exec callback");
|
||||
if (stderr) {
|
||||
console.error(`⚠️ stderr while generating services: ${stderr}`);
|
||||
} else {
|
||||
console.log(`✅ Command executed successfully, output:\n${stdout}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Error cleaning or executing command: ${error}`);
|
||||
}
|
||||
|
||||
isGenerating = false;
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ Error fetching OpenAPI schema: ' + error.message);
|
||||
isGenerating = false;
|
||||
}
|
||||
}
|
||||
|
||||
const backendDirectory = '/Users/gotthardg/PycharmProjects/heidi-v2/backend/';
|
||||
console.log(`👀 Watching for changes in ${backendDirectory}`);
|
||||
const watcher = chokidar.watch(backendDirectory, { persistent: true, ignored: [SCHEMA_PATH, OUTPUT_DIRECTORY] });
|
||||
|
||||
watcher
|
||||
.on('add', debounce(fetchAndGenerate, debounceDelay))
|
||||
.on('change', debounce(fetchAndGenerate, debounceDelay))
|
||||
.on('unlink', debounce(fetchAndGenerate, debounceDelay));
|
||||
|
||||
console.log(`👀 Watching for changes in ${backendDirectory}`);
|
Reference in New Issue
Block a user