// Read all the api from current documents const glob = require('glob'); const fs = require('fs'); const COMPONENT_NAME = /components\/([^/]*)/; const PROP_NAME = /^\s*\|\s*([^\s|]*)/; const components = {}; function mappingPropLine(component, line) { const propMatch = line.match(PROP_NAME); if (!propMatch) return; const propName = propMatch[1]; if (!/^[a-z]/.test(propName)) return; components[component] = Array.from(new Set([...(components[component] || []), propName])); } function apiReport(entities) { const apis = {}; Object.keys(entities).forEach(component => { const apiList = entities[component]; apiList.forEach(api => { if (typeof apis[api] === 'function') { apis[api] = []; } apis[api] = [...(apis[api] || []), component]; }); }); return apis; } function printReport(apis) { const apiList = Object.keys(apis).map(api => ({ name: api, componentList: apis[api], })); apiList.sort((a, b) => b.componentList.length - a.componentList.length); // eslint-disable-next-line no-console console.log('| name | components | comments |'); // eslint-disable-next-line no-console console.log('| ---- | ---------- | -------- |'); apiList.forEach(({ name, componentList }) => { // eslint-disable-next-line no-console console.log('|', name, '|', componentList.join(', '), '| |'); }); } module.exports = () => { glob('components/*/*.md', (error, files) => { files.forEach(filePath => { // Read md file to parse content const content = fs.readFileSync(filePath, 'utf8'); const component = filePath.match(COMPONENT_NAME)[1]; // Parse lines to get API const lines = content.split(/[\r\n]+/); lines.forEach(line => { mappingPropLine(component, line); }); }); printReport(apiReport(components)); }); };