tin-react-components
Version:
All components used for Omadi apps
104 lines (98 loc) • 2.93 kB
JavaScript
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
}
}
}