UNPKG

1.88 kBJavaScriptView Raw
1/**
2 * @function _datasource
3 */
4
5"use strict";
6
7const fs = require('fs'),
8 path = require('path'),
9 minimatch = require('minimatch'),
10 stringcase = require('stringcase'),
11 evaljson = require('evaljson'),
12 _isModule = require('./_is_module');
13
14/** @lends _datasource */
15function _datasource(dirname, options) {
16 options = options || {};
17 let vars = options.vars;
18 let pascalPatterns = [].concat(options.pascal || []);
19
20 function _isPascal(name) {
21 for (let pattern of pascalPatterns) {
22 let hit = minimatch(name, pattern);
23 if (hit) {
24 return true;
25 }
26 }
27 return false;
28 }
29
30 let datasource = {};
31 fs.readdirSync(dirname)
32 .filter(filename => !/^index\./.test(filename))
33 .filter(filename => !/\.jsx$/.test(filename))
34 .filter(filename => !/^[\.\_]/.test(filename))
35 .map(filename => path.resolve(dirname, filename))
36 .filter(_isModule)
37 .forEach(filename => {
38 let name = path.basename(filename, path.extname(filename));
39 let isPascal = _isPascal(path.basename(filename)) || _isPascal(name) || _isPascal(stringcase.pascalcase(name));
40 if (isPascal) {
41 name = stringcase.pascalcase(name);
42 } else {
43 name = stringcase.camelcase(name);
44 }
45 Object.defineProperty(datasource, name, {
46 get: () => {
47 let data = require(filename);
48 if (path.extname(filename) === '.json') {
49 return evaljson(data, vars);
50 } else {
51 return data;
52 }
53 },
54 configurable: true,
55 enumerable: true
56 })
57 });
58 return datasource;
59}
60
61module.exports = _datasource;