UNPKG

mfdoc

Version:

Auto generate JS SDK and HTTP API documentation

112 lines 3.55 kB
import { uniq } from 'lodash-es'; export class Doc { props; disclaimer = '// This file is auto-generated, do not modify directly. \n' + '// Reach out to a code owner to suggest changes.\n'; endpointsText = ''; typesText = ''; docImports = {}; docTypeImports = {}; classes = {}; generatedTypeCache = new Map(); constructor(props) { this.props = props; } appendType(typeText) { this.typesText += typeText + '\n'; return this; } appendEndpoint(endpoint) { this.endpointsText += endpoint + '\n'; return this; } appendImport(importing, from) { let entry = this.docImports[from]; if (!entry) { entry = { from, importing }; this.docImports[from] = entry; } else { entry.importing = uniq(entry.importing.concat(importing)); } return this; } appendTypeImport(importing, from) { let entry = this.docTypeImports[from]; if (!entry) { entry = { from, importing }; this.docTypeImports[from] = entry; } else { entry.importing = uniq(entry.importing.concat(importing)); } return this; } appendImportFromGenTypes(importing) { let filename = this.props.genTypesFilepath; if (filename.endsWith('.ts')) { filename = filename.replace('.ts', '.js'); } else if (!filename.endsWith('.js')) { filename = filename + '.js'; } return this.appendImport(importing.map(i => `type ${i}`), filename); } appendToClass(entry, name, extendsName) { let classEntry = this.classes[name]; if (!classEntry) { classEntry = { name, extendsName, entries: [entry] }; this.classes[name] = classEntry; } else { if (extendsName && extendsName !== classEntry.extendsName) { classEntry.extendsName = extendsName; } classEntry.entries.push(entry); } return this; } compileText() { return (this.disclaimer + '\n' + this.compileImports() + '\n' + this.compileTypeImports() + '\n' + this.typesText + '\n' + this.endpointsText + '\n' + this.compileClasses()); } compileImports() { let importsText = ''; for (const from in this.docImports) { const { importing } = this.docImports[from]; importsText += `import {${importing.join(', ')}} from "${from}"\n`; } return importsText; } compileTypeImports() { let importsText = ''; for (const from in this.docTypeImports) { const { importing } = this.docTypeImports[from]; importsText += `import type {${importing.join(', ')}} from "${from}"\n`; } return importsText; } compileClasses() { let classesText = ''; for (const name in this.classes) { const { entries, extendsName } = this.classes[name]; const extendsText = extendsName ? ` extends ${extendsName}` : ''; classesText += `export class ${name}${extendsText} {\n`; entries.forEach(fieldEntry => { classesText += ` ${fieldEntry}\n`; }); classesText += '}\n'; } return classesText; } } //# sourceMappingURL=doc.js.map