-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathindex.js
115 lines (107 loc) · 4.25 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Robert Krüger
*/
var path = require("path");
var fs = require("fs");
var _ = require("lodash");
module.exports = function (indexContent) {
this.cacheable && this.cacheable();
var options = new URLSearchParams(this.query);
var include;
if (options.has('include')) {
include = new RegExp(options.get('include'));
}
var exclude;
if (options.has('exclude')) {
exclude = new RegExp(options.get('exclude'));
}
var baseDirectory = path.dirname(this.resource);
var overrideDirectory, overrideBaseDirectory, inOverrideMode = false;
if (options.has('overrideDir')) {
if (!options.has('baseDir')) {
throw ("overrideDir can not be used without configuring a base dir");
}
overrideDirectory = path.join(baseDirectory, options.get('overrideDir'));
overrideBaseDirectory = path.join(baseDirectory, options.get('baseDir'));
inOverrideMode = true;
}
var subdirs, subdirsbase, subdirsoverride;
if (!inOverrideMode) {
subdirs = fs.readdirSync(baseDirectory).filter(function (file) {
return fs.statSync(path.join(baseDirectory, file)).isDirectory();
});
} else {
subdirsbase = fs.readdirSync(overrideBaseDirectory).filter(function (file) {
return fs.statSync(path.join(overrideBaseDirectory, file)).isDirectory();
});
try {
var overriderDir = fs.readdirSync(overrideDirectory);
subdirsoverride = overriderDir.filter(function (file) {
return fs.statSync(path.join(overrideDirectory, file)).isDirectory();
});
} catch (e) {
//if the override dir does not exist we go back to normal mode but on the base path
inOverrideMode = false;
baseDirectory = overrideBaseDirectory;
subdirs = subdirsbase;
}
}
//alls sub directories match to languages
var resBundle = {},
dirname, files, basefiles, overridefiles;
var languageDefiningDirectories = inOverrideMode ? subdirsbase : subdirs;
for (var i = 0, len = languageDefiningDirectories.length; i < len; i++) {
//all files within the sub directory map to namespaces
dirname = languageDefiningDirectories[i];
resBundle[dirname] = {};
//get sub files
if (!inOverrideMode) {
files = fs.readdirSync(path.join(baseDirectory, dirname)).filter(function (file) {
var filePath = path.join(dirname, file);
return fs.statSync(path.join(baseDirectory, dirname, file)).isFile() && (!include || include.test(filePath)) && (!(exclude && exclude.test(filePath)));
});
} else {
basefiles = fs.readdirSync(path.join(overrideBaseDirectory, '/', dirname)).filter(function (file) {
var filePath = path.join(dirname, file);
return fs.statSync(path.join(overrideBaseDirectory, '/', dirname, file)).isFile() && (!include || include.test(filePath)) && (!(exclude && exclude.test(filePath)));
});
}
var filename, extname, basename, content, overrideContent, pathstring, overridePathstring, fileData, overrideData, overrideFileExists;
var filesToAdd = inOverrideMode ? basefiles : files;
var baseDefiningDirectory = inOverrideMode ? overrideBaseDirectory : baseDirectory;
for (var j = 0, len2 = filesToAdd.length; j < len2; j++) {
filename = filesToAdd[j];
pathstring = path.join(baseDefiningDirectory, dirname, filename);
extname = path.extname(pathstring);
basename = path.basename(pathstring, extname);
content = fs.readFileSync(pathstring);
fileData = JSON.parse(content);
if (inOverrideMode) {
overrideFileExists = true;
//here we apply the data from the override dir if existent
overridePathstring = path.join(overrideDirectory, '/', dirname, filename);
try {
fs.statSync(overridePathstring).isFile();
} catch (e) {
overrideFileExists = false;
}
if (overrideFileExists) {
overrideContent = fs.readFileSync(overridePathstring);
overrideData = JSON.parse(overrideContent);
fileData = _.merge(fileData, overrideData);
this.addDependency(overridePathstring);
}
}
resBundle[dirname][basename] = fileData;
this.addDependency(pathstring);
}
if (!inOverrideMode) {
this.addContextDependency(path.join(baseDirectory, dirname));
} else {
this.addContextDependency(path.join(overrideBaseDirectory, dirname));
this.addContextDependency(path.join(overrideDirectory, dirname));
}
}
return "module.exports = " + JSON.stringify(resBundle);
}