apemandb
Version:
Database for apeman project.
63 lines (55 loc) • 1.72 kB
JavaScript
/**
* Format model files.
*/
process.chdir(`${__dirname}/..`)
const aglob = require('aglob')
const apeTasking = require('ape-tasking')
const co = require('co')
const path = require('path')
const fs = require('fs')
apeTasking.runTasks('format', [
() => co(function * () {
const priorities = {
topLevel: [
'$name', '$description', '$inherits', '$attributes', '$indices'
],
attributes: [
'$comment', '$type', '$nullable', '$unique', '$default', '$convert'
]
}
let filenames = yield aglob('models/**/*.json')
for (let filename of filenames) {
let data = require(path.resolve(filename))
data.$inherits = data.$inherits || []
data.$attributes = data.$attributes || {}
data.$indices = data.$indices || {}
data = _sortProps(data, priorities.topLevel)
for (let name of Object.keys(data.$attributes)) {
data.$attributes[ name ] = _sortProps(data.$attributes[ name ], priorities.attributes)
}
yield new Promise((resolve, reject) =>
fs.writeFile(filename, JSON.stringify(data, null, 2), (err) => err ? rejecct(err) : resolve())
)
console.log(`File generated: ${filename}`)
}
})
], true)
function _sortProps (data, priorities) {
return Object.keys(data)
.sort((a, b) => _compare(a, b, priorities))
.reduce((result, name) => Object.assign(result, {
[name]: data[ name ]
}), {})
}
function _compare (a, b, priorities) {
return _compare.order(a, priorities) - _compare.order(b, priorities)
}
_compare.order = (value, priorities) => {
let index = priorities.indexOf(value)
if (index === -1) {
return 9999
}
return index
}