Files
react-native-mapbox-gl/scripts/generateDocJSON.js
T

65 lines
1.6 KiB
JavaScript

const docgen = require('react-docgen');
const dir = require('node-dir');
const fs = require('fs');
const path = require('path');
const INPUT_PATH = path.join(__dirname, '..', 'javascript', 'components');
const OUTPUT_PATH = path.join(__dirname, '..', 'docs', 'docs.json');
class DocJSONBuilder {
constructor (filePath) {
this._filePath = filePath;
}
get options () {
return {
match: /.js$/,
shortName: true,
};
}
isPrivateMethod (methodName = '') {
return !methodName || methodName.charAt(0) === '_';
}
postprocess (component) {
// Remove all private methods and parse examples from docblock
if (!Array.isArray(component.methods)) {
return;
}
const privateMethods = [];
for (let method of component.methods) {
if (this.isPrivateMethod(method.name)) {
privateMethods.push(method.name);
continue;
}
const examples = method.docblock.split('@').filter((block) => block.startsWith('example'));
method.examples = examples.map((example) => example.substring('example'.length));
}
component.methods = component.methods.filter((method) => !privateMethods.includes(method.name));
}
generate () {
let results = {};
dir.readFiles(this._filePath, this.options, (err, content, fileName, next) => {
if (err) {
throw err;
}
fileName = fileName.replace('.js', '');
results[fileName] = docgen.parse(content);
this.postprocess(results[fileName]);
next();
}, () => fs.writeFileSync(OUTPUT_PATH, JSON.stringify(results, null, 2)));
}
}
const docJSONBuilder = new DocJSONBuilder(INPUT_PATH);
docJSONBuilder.generate();