-
Notifications
You must be signed in to change notification settings - Fork 2
/
create_new.js
121 lines (105 loc) · 2.74 KB
/
create_new.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
var os = require('os')
, cloneFunction = require('fulcon')
, merge = require('deeply')
, configly = require('./configly.js')
;
// Public API
module.exports = createNew;
/**
* Creates new copy of configly
* immutable to singleton modifications
* which will help to keep it stable
* when used with in the libraries
*
* @param {object} [options] - custom options to set as new defaults on the new instance
* @returns {function} - immutable copy of configly
*/
function createNew(options)
{
var copy = cloneFunction(configly)
, instance = copy.bind(copy)
;
// enrich copy with helper methods
// mind baked-in context of the copies
applyProps.call(this, copy, options);
// get fresh list of filenames
// if needed
copy.files = copy.files || getFilenames.call(copy);
// expose public methods on the outside
// mind baked in context of the copies
copyProps.call(copy, instance);
return instance;
}
/**
* Applies properties from the source function onto target one
*
* @param {function} target - function to enrich
* @param {object} [options] - custom props to overload with
* @returns {function} enriched target
*/
function applyProps(target, options)
{
options = options || {};
Object.keys(this).forEach(function(key)
{
// do not merge `undefined` into existing value
target[key] = options.hasOwnProperty(key) ? merge(this[key], options[key]) : merge(this[key]);
// special treatment for parsers
// remove invalid parsers from the list
if (key == 'parsers')
{
Object.keys(target[key]).forEach(function(parser)
{
if (typeof target[key][parser] != 'function')
{
delete target[key][parser];
}
});
}
}.bind(this));
return target;
}
/**
* Copies public properties to the provided target
*
* @param {object} target - properties copy destination
* @returns {object} - updated target object
*/
function copyProps(target)
{
Object.keys(this).forEach(function(key)
{
target[key] = typeof this[key] == 'function' ? this[key].bind(this) : this[key];
}.bind(this));
return target;
}
/**
* Detects hostname based on the environment
*
* @returns {string} - hostname or empty string
*/
function getHostname()
{
return process.env['HOST'] || process.env['HOSTNAME'] || os.hostname() || '';
}
/**
* Creates list of filenames to search with
*
* @returns {array} - list of the filenames
*/
function getFilenames()
{
var hostname = getHostname()
, host = hostname.split('.')[0]
;
return [
'default',
'', // allow suffixes as a basename (e.g. `environment`)
host,
hostname,
'local',
this.defaults.customIncludeFiles,
this.defaults.customEnvVars,
'runtime'
];
}