terra-props-table
Version:
React component to render a table view for the props metadata of another react component.
74 lines (62 loc) • 2.03 kB
JavaScript
/* eslint-disable no-console */
const fs = require('fs');
const path = require('path');
const commander = require('commander');
const glob = require('glob');
const { parse } = require('react-docgen');
const generateMarkdown = require('./generateMarkdown/generateMarkdown');
const pkg = require('../package.json');
commander
.version(pkg.version)
.option('-f, --filename [filename]', 'filename to use when reading from stdin')
.option('-d, --out-dir [out]', 'directory to output props-table')
.parse(process.argv);
const errors = [];
// get all filenames
let filenames = commander.args.reduce((globbed, input) => {
let files = glob.sync(input);
if (!files.length) {
files = [input];
}
return globbed.concat(files);
}, []);
// verify filenames are unique
filenames = [...new Set(filenames)];
// check if filenames exist
filenames.forEach((filename) => {
if (!fs.existsSync(filename)) {
errors.push(`${filename} does not exist`);
}
});
// verify output directory and filesnames exist
if (commander.outDir && !filenames.length) {
errors.push('filenames required for --out-dir');
}
// Iterate through files
filenames.forEach((filename) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) {
errors.push(`Error reading file ${filename} ${err}`);
} else {
// remove ext from filename
const currentComponent = path.basename(filename, path.extname(filename));
// create directory if it does not exist
if (!fs.existsSync(commander.outDir)) {
fs.mkdirSync(commander.outDir);
}
const outpath = `${path.join(commander.outDir, currentComponent)}.md`;
fs.writeFile(outpath, generateMarkdown(currentComponent, parse(data)), (error) => {
if (error) {
errors.push(`Error writing file ${outpath} ${err}`);
}
console.log(`${filename} -> ${outpath}`);
});
}
});
});
// Throw errors to console
if (errors.length) {
console.error(errors.join('. '));
process.exit(2);
}