-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
72 lines (61 loc) · 1.41 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
function flow() {
var funcs = arguments;
return function(key, path) {
var length = funcs.length;
var index;
for (index = 0; index < length; index++) {
key = funcs[index](key, path);
}
return key;
}
}
function prefix(str) {
return function(key) {
return str + key;
}
}
function upper(key) {
return key.toUpperCase();
}
function snake(key) {
return key.replace(/\W+/g, '_');
}
function joinPath(key, path) {
return path ? path + '.' + key : key;
}
function parseOption(option) {
switch (typeof option) {
case 'string': return flow(joinPath, prefix(option));
case 'function': return option;
case 'undefined': return joinPath;
default: throw new Error(
'mirror-keys: option parameter should be a string, function or undefined.'
);
}
}
function mirror(obj, path, reflect) {
var result = {};
var key;
var val;
for (key in obj) {
if (obj.hasOwnProperty(key)) {
val = obj[key];
result[key] = (
val == null
? reflect(key, path)
: typeof val === 'object' ? mirror(val, joinPath(key, path), reflect) : val
);
}
}
return result;
}
function mirrorKeys(obj, option) {
var create = parseOption(option);
return mirror(obj, '', create);
}
mirrorKeys.flow = flow;
mirrorKeys.prefix = prefix;
mirrorKeys.upper = upper;
mirrorKeys.snake = snake;
mirrorKeys.joinPath = joinPath;
module.exports = mirrorKeys;