let fs = require('fs'); let path = require('path'); var reactDocs = require('react-docgen'); // let TEXT = fs.readFileSync('../../node_modules/native-base/src/basic/Button.js'); // var componentInfo = reactDocs.parse(TEXT); // console.log("NativeBaseCI", componentInfo); //joining path of directory const directoryPath = "../../node_modules/native-base/src/basic/"; //passsing directoryPath and callback function fs.readdir(directoryPath, function (err, files) { //handling error if (err) { return console.log('Unable to scan directory: ' + err); } let Infos = []; //listing all files using forEach files.forEach(function (file, index) { // Do whatever you want to do with the file if(!file.endsWith('.js') || file.includes('.android') || file.includes('.ios')) return; console.log("No. " + index +" : ", file); let content = fs.readFileSync(directoryPath + file); try{ let info = reactDocs.parse(content); info.componentName = file.replace('.js', ''); Infos.push(info); } catch(e) { console.log("Error"); console.log(e); } }); let fileText = generateFile(Infos); fs.writeFileSync('./index.js', fileText); }); function generateFile(Infos) { let headers = ` import React from 'react'; import Types from '../../lib/Types'; import Module from '../../lib/Module';\n`; let IM = [], EX = [], PROPS = [], Names = []; Infos.forEach((info) => { let { im, ex, props} = createClass(info); Names.push(info.componentName); IM.push(im); EX.push(ex); PROPS.push(props); }) return headers + "\n\n" + IM.join('\n') + "\n\n" + EX.join('\n') + "\n\n" + PROPS.join('\n')+"\n\n" + `export default { \n\t${Names.join(',\n\t')} \n}`; } function createClass(item) { let name = item.componentName; let props = generatePropsText(item.props); let s = `export class ${name} extends Module { constructor(props) { super(props); } display() { return <${name+'Ctor'} {...this.props} /> } }`; let propsText = `${name}.Inputs = ${props}`; return { im: `import { ${name} as ${name+'Ctor'} } from 'native-base';`, ex: s, props: propsText } } function generatePropsText(props) { let Props = []; for(var name in props) { let p = props[name]; let validator; switch(p.type && p.type.name) { case 'number': validator = "new Types.Real()" break; case 'string': validator = "new Types.Text()" break; case 'bool': validator = "new Types.Bool()" break; default: console.log("Style type for ", name , p.type); continue; break; } if(p.required) validator += ".require()" if(p.defaultValue) validator += `.default(${p.defaultValue.value})` let s = `${name}: ${validator}`; Props.push(s); } return `{ ${Props.join(',\n\t')} }`; }