apemanmodule
Version:
Directory module index for apeman.
62 lines (55 loc) • 1.64 kB
JavaScript
/**
* @function _datasource
*/
const fs = require('fs')
const path = require('path')
const minimatch = require('minimatch')
const stringcase = require('stringcase')
const evaljson = require('evaljson')
const isModule = require('./is_module')
/** @lends _datasource */
function _datasource (dirname, options) {
options = options || {}
let vars = options.vars
let pascalPatterns = [].concat(options.pascal || [])
function _isPascal (name) {
for (let pattern of pascalPatterns) {
let hit = minimatch(name, pattern)
if (hit) {
return true
}
}
return false
}
let datasource = {}
fs.readdirSync(dirname)
.filter((filename) => !/^index\./.test(filename))
.filter((filename) => !/\.jsx$/.test(filename))
.filter((filename) => !/^[\.\_]/.test(filename))
.map((filename) => path.resolve(dirname, filename))
.filter(isModule)
.forEach((filename) => {
let name = path.basename(filename, path.extname(filename))
let isPascal = _isPascal(path.basename(filename)) || _isPascal(name) || _isPascal(stringcase.pascalcase(name))
if (isPascal) {
name = stringcase.pascalcase(name)
} else {
name = stringcase.camelcase(name)
}
Object.defineProperty(datasource, name, {
get: () => {
let data = require(filename)
if (path.extname(filename) === '.json') {
return evaljson(data, vars)
} else {
return data
}
},
configurable: true,
enumerable: true
})
})
return datasource
}
module.exports = _datasource