You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.8 KiB
69 lines
1.8 KiB
3 years ago
|
// 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));
|
||
|
});
|
||
|
};
|