UNPKG

tin-react-components

Version:
104 lines (98 loc) 2.93 kB
const fs = require('fs-extra') const mkdir = require('mkdirp') const reactDocs = require('react-docgen') var babel = require('babel-core') var exec = require('child_process').exec const author = /@author: (.+)/ const def = /@default: (.+)/ const structure = /@structure:[\s|\S]+({[\s\S]*})/ const args = /@arguments:[\s|\S]+({[\s\S]*})/ const options = /@options: (.+)/ const message = process.argv[2] function findInfo (ci, name, addName, reg, func) { if (reg.test(ci[name])) { const newValue = ci[name].match(reg)[1] ci[name] = ci[name].replace(reg, '') if (func) { ci[addName] = func(newValue) } else { ci[addName] = newValue } } } fs.readdir('./src', (err, files) => { if (err) process.exit(1) const docs = [] files.forEach(folder => { const file = `./src/${folder}/index.js` docs.push(new Promise((resolve, reject) => { fs.readFile(file, 'utf8', function (err, contents) { if (err) resolve({}) try { if (!contents) { resolve({}) return } const componentInfo = reactDocs.parse(contents) findInfo(componentInfo, 'description', 'author', author) Object.keys(componentInfo.props || {}).forEach(propName => { const prop = componentInfo.props[propName] findInfo(prop, 'description', 'defaultValue', def) findInfo(prop, 'description', 'structure', structure) findInfo(prop, 'description', 'arguments', args) findInfo(prop, 'description', 'options', options, (newValue) => newValue.split(',')) }) componentInfo.name = folder componentInfo.example = buildComponent(componentInfo) resolve(componentInfo) } catch (e) { resolve({}) } }) })) }) Promise.all(docs).then(results => { fs.writeFile('./docs.json', JSON.stringify(results, null, ' '), () => {}) exec(`./publish.sh ${message}`, (err, sdout) => { if (err) console.log(err) console.log(sdout) }) }) }) function buildComponent (doc) { if (!doc || !doc.props) return '' const hasChildren = doc.props.children if (hasChildren) { delete doc.props.children } const props = Object.keys(doc.props || []).map(propName => { return `${propName}={${propName}}` }) let end = hasChildren ? `>\n {children}\n </${doc.name}>` : '/>' return ` <${doc.name} ${props.join('\n ')} ${end} ` } function copyFile (source, target, cb) { var cbCalled = false var rd = fs.createReadStream(source) rd.on('error', function (err) { done(err) }) var wr = fs.createWriteStream(target) wr.on('error', function (err) { done(err) }) wr.on('close', function (ex) { done() }) rd.pipe(wr) function done (err) { if (!cbCalled) { cb(err) cbCalled = true } } }