forked from derekjones562/5e-spelljammer.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.js
145 lines (133 loc) · 4.26 KB
/
util.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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
"use strict";
const fs = require("fs");
function dataRecurse (file, obj, primitiveHandlers, lastType, lastKey) {
const to = typeof obj;
if (obj == null) return;
switch (to) {
case undefined:
if (primitiveHandlers.undefined) {
primitiveHandlers.undefined instanceof Array
? primitiveHandlers.undefined.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.undefined(file, obj, lastType, lastKey);
}
return obj;
case "boolean":
if (primitiveHandlers.boolean) {
primitiveHandlers.boolean instanceof Array
? primitiveHandlers.boolean.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.boolean(file, obj, lastType, lastKey);
}
return obj;
case "number":
if (primitiveHandlers.number) {
primitiveHandlers.number instanceof Array
? primitiveHandlers.number.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.number(file, obj, lastType, lastKey);
}
return obj;
case "string":
if (primitiveHandlers.string) {
primitiveHandlers.string instanceof Array
? primitiveHandlers.string.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.string(file, obj, lastType, lastKey);
}
return obj;
case "object": {
if (obj instanceof Array) {
if (primitiveHandlers.array) {
primitiveHandlers.array instanceof Array
? primitiveHandlers.array.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.object(file, obj, lastType, lastKey);
}
obj.forEach(it => dataRecurse(file, it, primitiveHandlers, lastType, lastKey));
return obj;
} else {
if (primitiveHandlers.object) {
primitiveHandlers.object instanceof Array
? primitiveHandlers.object.forEach(ph => ph(file, obj, lastType, lastKey))
: primitiveHandlers.object(file, obj, lastType, lastKey);
}
// TODO this assignment could be used to mutate the object
// (currently does nothing; each returns the same object as was passed)
Object.keys(obj).forEach(k => {
const v = obj[k];
obj[k] = dataRecurse(file, v, primitiveHandlers, lastType, k);
});
return obj;
}
}
default:
console.warn("Unhandled type?!", to);
return obj;
}
}
function readJson (path) {
try {
return JSON.parse(fs.readFileSync(path, "utf8"));
} catch (e) {
e.message += ` (Path: ${path})`;
throw e;
}
}
function isDirectory (path) {
return fs.lstatSync(path).isDirectory();
}
const FILE_EXTENSION_WHITELIST = [
".json",
];
const FILE_PREFIX_BLACKLIST = [
"bookref-",
"roll20-",
"foundry-",
"gendata-",
];
/**
* Recursively list all files in a directory.
*
* @param [opts] Options object.
* @param [opts.blacklistFilePrefixes] Blacklisted filename prefixes (case sensitive).
* @param [opts.whitelistFileExts] Whitelisted filename extensions (case sensitive).
* @param [opts.dir] Directory to list.
* @param [opts.whitelistDirs] Directory whitelist.
*/
function listFiles (opts) {
opts = opts || {};
opts.dir = opts.dir || "./data";
opts.blacklistFilePrefixes = opts.blacklistFilePrefixes || FILE_PREFIX_BLACKLIST;
opts.whitelistFileExts = opts.whitelistFileExts || FILE_EXTENSION_WHITELIST;
opts.whitelistDirs = opts.whitelistDirs || null;
const dirContent = fs.readdirSync(opts.dir, "utf8")
.filter(file => {
const path = `${opts.dir}/${file}`;
if (isDirectory(path)) return opts.whitelistDirs ? opts.whitelistDirs.includes(path) : true;
return !opts.blacklistFilePrefixes.some(it => file.startsWith(it)) && opts.whitelistFileExts.some(it => file.endsWith(it))
})
.map(file => `${opts.dir}/${file}`);
return dirContent.reduce((acc, file) => {
if (isDirectory(file)) acc.push(...listFiles({...opts, dir: file}));
else acc.push(file);
return acc;
}, []);
}
class PatchLoadJson {
static patchLoadJson () {
PatchLoadJson._CACHED = PatchLoadJson._CACHED || DataUtil.loadJSON;
DataUtil.loadJSON = async (url) => {
const data = readJson(url);
await DataUtil.pDoMetaMerge(url, data);
return data;
}
}
static unpatchLoadJson () {
if (PatchLoadJson._CACHED) DataUtil.loadJSON = PatchLoadJson._CACHED;
}
}
PatchLoadJson._CACHED = null;
module.exports = {
dataRecurse,
readJson,
listFiles,
FILE_PREFIX_BLACKLIST,
patchLoadJson: PatchLoadJson.patchLoadJson,
unpatchLoadJson: PatchLoadJson.unpatchLoadJson,
};