69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
// 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));
 | 
						|
  });
 | 
						|
};
 |