mfdoc
Version:
Auto generate JS SDK and HTTP API documentation
112 lines • 3.55 kB
JavaScript
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