1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const 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 |
|
15 | function _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 |
|
61 | module.exports = _datasource;
|