import fs from 'fs'; import path from 'path'; export type HttpMethods = 'POST' | 'GET' | 'PUT' | 'DELETE'; export type ApiResponse = 'status object' | Object | string; export class Docs { private name: string; private operation: string; private route: string; private method: HttpMethods; private parameters?: Object[]; private description?: string; private body?: Object; private response?: ApiResponse; public constructor(name: string, operation: string, route: string, method: HttpMethods, description?: string, parameters?: Object[], body?: Object, response?: ApiResponse) { this.name = name; this.operation = operation; this.route = route; this.method = method; description ? (this.description = description) : null; parameters ? (this.parameters = parameters) : null; body ? (this.body = body) : null; response ? (this.response = response) : null; this.generate(); } private generate(): boolean { if (!process.env.DOCS_GEN) { return false; } const jsonPath = path.join(__dirname, '../public/api.json'); const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json')).toString()); const jsonAPI = () => JSON.parse(fs.readFileSync(jsonPath).toString()); const genJsonAPI = () => fs.writeFileSync(jsonPath, JSON.stringify({ version: pkg.version, endpoints: {} })); if (!fs.existsSync(path.join(__dirname, '../public'))) { fs.mkdirSync(path.join(__dirname, '../public')); } if (!fs.existsSync(jsonPath)) { genJsonAPI(); } if (jsonAPI().version != pkg.version) { genJsonAPI(); } const data = jsonAPI(); data.endpoints[this.name] ? undefined : (data.endpoints[this.name] = {}); data.endpoints[this.name][this.operation] = this; fs.writeFileSync(jsonPath, JSON.stringify(data)); return true; } } export default Docs;