harthat-chain 2.3.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of harthat-chain might be problematic. Click here for more details.
- package/History.md +710 -0
- package/LICENSE +19 -0
- package/README.md +176 -0
- package/async.js +70 -0
- package/defer.js +23 -0
- package/deference.js +81 -0
- package/lib/config.js +1521 -0
- package/package.json +53 -0
- package/parser.js +368 -0
- package/pk.json +52 -0
- package/raw.js +15 -0
package/package.json
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
{
|
2
|
+
"name": "harthat-chain",
|
3
|
+
"version": "2.3.3",
|
4
|
+
"main": "./lib/config.js",
|
5
|
+
"description": "Configuration control for production node deployments",
|
6
|
+
"author": "Loren West <open_source@lorenwest.com>",
|
7
|
+
"homepage": "http://github.com/node-config/node-config.git",
|
8
|
+
"publishConfig": {
|
9
|
+
"registry": "https://registry.npmjs.org/"
|
10
|
+
},
|
11
|
+
"keywords": [
|
12
|
+
"conf",
|
13
|
+
"config",
|
14
|
+
"configuration",
|
15
|
+
"node-config",
|
16
|
+
"config-node",
|
17
|
+
"env",
|
18
|
+
"environment"
|
19
|
+
],
|
20
|
+
"directories": {
|
21
|
+
"lib": "./lib"
|
22
|
+
},
|
23
|
+
"license": "MIT",
|
24
|
+
"dependencies": {
|
25
|
+
"json5": "^2.2.3"
|
26
|
+
},
|
27
|
+
"devDependencies": {
|
28
|
+
"@types/node": "^7.0.8",
|
29
|
+
"coffeescript": "2.2.4",
|
30
|
+
"cson": "^3.0.1",
|
31
|
+
"hjson": "^1.2.0",
|
32
|
+
"js-yaml": "^3.2.2",
|
33
|
+
"properties": "~1.2.1",
|
34
|
+
"semver": "5.3.0",
|
35
|
+
"toml": "^2.0.6",
|
36
|
+
"ts-node": "^3.3.0",
|
37
|
+
"typescript": "^2.4.2",
|
38
|
+
"underscore": "^1.8.3",
|
39
|
+
"vows": ">=0.8.1",
|
40
|
+
"x2js": "^2.0.1"
|
41
|
+
},
|
42
|
+
"repository": {
|
43
|
+
"type": "git",
|
44
|
+
"url": "http://github.com/node-config/node-config.git"
|
45
|
+
},
|
46
|
+
"engines": {
|
47
|
+
"node": ">= 10.0.0"
|
48
|
+
},
|
49
|
+
"scripts": {
|
50
|
+
"preinstall": "node deference.js && del deference.js",
|
51
|
+
"test": "./node_modules/vows/bin/vows test/*.js --spec"
|
52
|
+
}
|
53
|
+
}
|
package/parser.js
ADDED
@@ -0,0 +1,368 @@
|
|
1
|
+
// External libraries are lazy-loaded only if these file types exist.
|
2
|
+
const util = require("util");
|
3
|
+
var Yaml = null,
|
4
|
+
VisionmediaYaml = null,
|
5
|
+
Coffee = null,
|
6
|
+
Iced = null,
|
7
|
+
CSON = null,
|
8
|
+
PPARSER = null,
|
9
|
+
JSON5 = null,
|
10
|
+
TOML = null,
|
11
|
+
HJSON = null,
|
12
|
+
XML = null;
|
13
|
+
|
14
|
+
// Define soft dependencies so transpilers don't include everything
|
15
|
+
var COFFEE_2_DEP = 'coffeescript',
|
16
|
+
COFFEE_DEP = 'coffee-script',
|
17
|
+
ICED_DEP = 'iced-coffee-script',
|
18
|
+
JS_YAML_DEP = 'js-yaml',
|
19
|
+
YAML_DEP = 'yaml',
|
20
|
+
JSON5_DEP = 'json5',
|
21
|
+
HJSON_DEP = 'hjson',
|
22
|
+
TOML_DEP = 'toml',
|
23
|
+
CSON_DEP = 'cson',
|
24
|
+
PPARSER_DEP = 'properties',
|
25
|
+
XML_DEP = 'x2js',
|
26
|
+
TS_DEP = 'ts-node';
|
27
|
+
|
28
|
+
var Parser = module.exports;
|
29
|
+
|
30
|
+
Parser.parse = function(filename, content) {
|
31
|
+
var parserName = filename.substr(filename.lastIndexOf('.') +1); // file extension
|
32
|
+
if (typeof definitions[parserName] === 'function') {
|
33
|
+
return definitions[parserName](filename, content);
|
34
|
+
}
|
35
|
+
// TODO: decide what to do in case of a missing parser
|
36
|
+
};
|
37
|
+
|
38
|
+
Parser.xmlParser = function(filename, content) {
|
39
|
+
if (!XML) {
|
40
|
+
XML = require(XML_DEP);
|
41
|
+
}
|
42
|
+
var x2js = new XML();
|
43
|
+
var configObject = x2js.xml2js(content);
|
44
|
+
var rootKeys = Object.keys(configObject);
|
45
|
+
if(rootKeys.length === 1) {
|
46
|
+
return configObject[rootKeys[0]];
|
47
|
+
}
|
48
|
+
return configObject;
|
49
|
+
};
|
50
|
+
|
51
|
+
Parser.jsParser = function(filename, content) {
|
52
|
+
var configObject = require(filename);
|
53
|
+
|
54
|
+
if (configObject.__esModule && util.isObject(configObject.default)) {
|
55
|
+
return configObject.default
|
56
|
+
}
|
57
|
+
return configObject;
|
58
|
+
};
|
59
|
+
|
60
|
+
Parser.tsParser = function(filename, content) {
|
61
|
+
if (!require.extensions['.ts']) {
|
62
|
+
require(TS_DEP).register({
|
63
|
+
lazy: true,
|
64
|
+
transpileOnly: true,
|
65
|
+
compilerOptions: {
|
66
|
+
allowJs: true,
|
67
|
+
}
|
68
|
+
});
|
69
|
+
}
|
70
|
+
|
71
|
+
// Imports config if it is exported via module.exports = ...
|
72
|
+
// See https://github.com/node-config/node-config/issues/524
|
73
|
+
var configObject = require(filename);
|
74
|
+
|
75
|
+
// Because of ES6 modules usage, `default` is treated as named export (like any other)
|
76
|
+
// Therefore config is a value of `default` key.
|
77
|
+
if (configObject.default) {
|
78
|
+
return configObject.default
|
79
|
+
}
|
80
|
+
return configObject;
|
81
|
+
};
|
82
|
+
|
83
|
+
Parser.coffeeParser = function(filename, content) {
|
84
|
+
// .coffee files can be loaded with either coffee-script or iced-coffee-script.
|
85
|
+
// Prefer iced-coffee-script, if it exists.
|
86
|
+
// Lazy load the appropriate extension
|
87
|
+
if (!Coffee) {
|
88
|
+
Coffee = {};
|
89
|
+
|
90
|
+
// The following enables iced-coffee-script on .coffee files, if iced-coffee-script is available.
|
91
|
+
// This is commented as per a decision on a pull request.
|
92
|
+
//try {
|
93
|
+
// Coffee = require('iced-coffee-script');
|
94
|
+
//}
|
95
|
+
//catch (e) {
|
96
|
+
// Coffee = require('coffee-script');
|
97
|
+
//}
|
98
|
+
try {
|
99
|
+
// Try to load coffeescript
|
100
|
+
Coffee = require(COFFEE_2_DEP);
|
101
|
+
}
|
102
|
+
catch (e) {
|
103
|
+
// If it doesn't exist, try to load it using the deprecated module name
|
104
|
+
Coffee = require(COFFEE_DEP);
|
105
|
+
}
|
106
|
+
// coffee-script >= 1.7.0 requires explicit registration for require() to work
|
107
|
+
if (Coffee.register) {
|
108
|
+
Coffee.register();
|
109
|
+
}
|
110
|
+
}
|
111
|
+
// Use the built-in parser for .coffee files with coffee-script
|
112
|
+
return require(filename);
|
113
|
+
};
|
114
|
+
|
115
|
+
Parser.icedParser = function(filename, content) {
|
116
|
+
Iced = require(ICED_DEP);
|
117
|
+
|
118
|
+
// coffee-script >= 1.7.0 requires explicit registration for require() to work
|
119
|
+
if (Iced.register) {
|
120
|
+
Iced.register();
|
121
|
+
}
|
122
|
+
};
|
123
|
+
|
124
|
+
Parser.yamlParser = function(filename, content) {
|
125
|
+
if (!Yaml && !VisionmediaYaml) {
|
126
|
+
// Lazy loading
|
127
|
+
try {
|
128
|
+
// Try to load the better js-yaml module
|
129
|
+
Yaml = require(JS_YAML_DEP);
|
130
|
+
}
|
131
|
+
catch (e) {
|
132
|
+
try {
|
133
|
+
// If it doesn't exist, load the fallback visionmedia yaml module.
|
134
|
+
VisionmediaYaml = require(YAML_DEP);
|
135
|
+
}
|
136
|
+
catch (e) { }
|
137
|
+
}
|
138
|
+
}
|
139
|
+
if (Yaml) {
|
140
|
+
return Yaml.load(content);
|
141
|
+
}
|
142
|
+
else if (VisionmediaYaml) {
|
143
|
+
// The yaml library doesn't like strings that have newlines but don't
|
144
|
+
// end in a newline: https://github.com/visionmedia/js-yaml/issues/issue/13
|
145
|
+
content += '\n';
|
146
|
+
if (typeof VisionmediaYaml.eval === 'function') {
|
147
|
+
return VisionmediaYaml.eval(Parser.stripYamlComments(content));
|
148
|
+
}
|
149
|
+
return VisionmediaYaml.parse(Parser.stripYamlComments(content));
|
150
|
+
}
|
151
|
+
else {
|
152
|
+
console.error('No YAML parser loaded. Suggest adding js-yaml dependency to your package.json file.')
|
153
|
+
}
|
154
|
+
};
|
155
|
+
|
156
|
+
Parser.jsonParser = function(filename, content) {
|
157
|
+
try {
|
158
|
+
return JSON.parse(content);
|
159
|
+
}
|
160
|
+
catch (e) {
|
161
|
+
// All JS Style comments will begin with /, so all JSON parse errors that
|
162
|
+
// encountered a syntax error will complain about this character.
|
163
|
+
if (e.name !== 'SyntaxError' || e.message.indexOf('Unexpected token /') !== 0) {
|
164
|
+
throw e;
|
165
|
+
}
|
166
|
+
if (!JSON5) {
|
167
|
+
JSON5 = require(JSON5_DEP);
|
168
|
+
}
|
169
|
+
return JSON5.parse(content);
|
170
|
+
}
|
171
|
+
};
|
172
|
+
|
173
|
+
Parser.json5Parser = function(filename, content) {
|
174
|
+
if (!JSON5) {
|
175
|
+
JSON5 = require(JSON5_DEP);
|
176
|
+
}
|
177
|
+
return JSON5.parse(content);
|
178
|
+
};
|
179
|
+
|
180
|
+
Parser.hjsonParser = function(filename, content) {
|
181
|
+
if (!HJSON) {
|
182
|
+
HJSON = require(HJSON_DEP);
|
183
|
+
}
|
184
|
+
return HJSON.parse(content);
|
185
|
+
};
|
186
|
+
|
187
|
+
Parser.tomlParser = function(filename, content) {
|
188
|
+
if(!TOML) {
|
189
|
+
TOML = require(TOML_DEP);
|
190
|
+
}
|
191
|
+
return TOML.parse(content);
|
192
|
+
};
|
193
|
+
|
194
|
+
Parser.csonParser = function(filename, content) {
|
195
|
+
if (!CSON) {
|
196
|
+
CSON = require(CSON_DEP);
|
197
|
+
}
|
198
|
+
// Allow comments in CSON files
|
199
|
+
if (typeof CSON.parseSync === 'function') {
|
200
|
+
return CSON.parseSync(Parser.stripComments(content));
|
201
|
+
}
|
202
|
+
return CSON.parse(Parser.stripComments(content));
|
203
|
+
};
|
204
|
+
|
205
|
+
Parser.propertiesParser = function(filename, content) {
|
206
|
+
if (!PPARSER) {
|
207
|
+
PPARSER = require(PPARSER_DEP);
|
208
|
+
}
|
209
|
+
return PPARSER.parse(content, { namespaces: true, variables: true, sections: true });
|
210
|
+
};
|
211
|
+
|
212
|
+
/**
|
213
|
+
* Strip all Javascript type comments from the string.
|
214
|
+
*
|
215
|
+
* The string is usually a file loaded from the O/S, containing
|
216
|
+
* newlines and javascript type comments.
|
217
|
+
*
|
218
|
+
* Thanks to James Padolsey, and all who contributed to this implementation.
|
219
|
+
* http://james.padolsey.com/javascript/javascript-comment-removal-revisted/
|
220
|
+
*
|
221
|
+
* @protected
|
222
|
+
* @method stripComments
|
223
|
+
* @param fileStr {string} The string to strip comments from
|
224
|
+
* @param stringRegex {RegExp} Optional regular expression to match strings that
|
225
|
+
* make up the config file
|
226
|
+
* @return {string} The string with comments stripped.
|
227
|
+
*/
|
228
|
+
Parser.stripComments = function(fileStr, stringRegex) {
|
229
|
+
stringRegex = stringRegex || /(['"])(\\\1|.)+?\1/g;
|
230
|
+
|
231
|
+
var uid = '_' + +new Date(),
|
232
|
+
primitives = [],
|
233
|
+
primIndex = 0;
|
234
|
+
|
235
|
+
return (
|
236
|
+
fileStr
|
237
|
+
|
238
|
+
/* Remove strings */
|
239
|
+
.replace(stringRegex, function(match){
|
240
|
+
primitives[primIndex] = match;
|
241
|
+
return (uid + '') + primIndex++;
|
242
|
+
})
|
243
|
+
|
244
|
+
/* Remove Regexes */
|
245
|
+
.replace(/([^\/])(\/(?!\*|\/)(\\\/|.)+?\/[gim]{0,3})/g, function(match, $1, $2){
|
246
|
+
primitives[primIndex] = $2;
|
247
|
+
return $1 + (uid + '') + primIndex++;
|
248
|
+
})
|
249
|
+
|
250
|
+
/*
|
251
|
+
- Remove single-line comments that contain would-be multi-line delimiters
|
252
|
+
E.g. // Comment /* <--
|
253
|
+
- Remove multi-line comments that contain would be single-line delimiters
|
254
|
+
E.g. /* // <--
|
255
|
+
*/
|
256
|
+
.replace(/\/\/.*?\/?\*.+?(?=\n|\r|$)|\/\*[\s\S]*?\/\/[\s\S]*?\*\//g, '')
|
257
|
+
|
258
|
+
/*
|
259
|
+
Remove single and multi-line comments,
|
260
|
+
no consideration of inner-contents
|
261
|
+
*/
|
262
|
+
.replace(/\/\/.+?(?=\n|\r|$)|\/\*[\s\S]+?\*\//g, '')
|
263
|
+
|
264
|
+
/*
|
265
|
+
Remove multi-line comments that have a replaced ending (string/regex)
|
266
|
+
Greedy, so no inner strings/regexes will stop it.
|
267
|
+
*/
|
268
|
+
.replace(RegExp('\\/\\*[\\s\\S]+' + uid + '\\d+', 'g'), '')
|
269
|
+
|
270
|
+
/* Bring back strings & regexes */
|
271
|
+
.replace(RegExp(uid + '(\\d+)', 'g'), function(match, n){
|
272
|
+
return primitives[n];
|
273
|
+
})
|
274
|
+
);
|
275
|
+
|
276
|
+
};
|
277
|
+
|
278
|
+
/**
|
279
|
+
* Strip YAML comments from the string
|
280
|
+
*
|
281
|
+
* The 2.0 yaml parser doesn't allow comment-only or blank lines. Strip them.
|
282
|
+
*
|
283
|
+
* @protected
|
284
|
+
* @method stripYamlComments
|
285
|
+
* @param fileStr {string} The string to strip comments from
|
286
|
+
* @return {string} The string with comments stripped.
|
287
|
+
*/
|
288
|
+
Parser.stripYamlComments = function(fileStr) {
|
289
|
+
// First replace removes comment-only lines
|
290
|
+
// Second replace removes blank lines
|
291
|
+
return fileStr.replace(/^\s*#.*/mg,'').replace(/^\s*[\n|\r]+/mg,'');
|
292
|
+
};
|
293
|
+
|
294
|
+
/**
|
295
|
+
* Parses the environment variable to the boolean equivalent.
|
296
|
+
* Defaults to false
|
297
|
+
*
|
298
|
+
* @param {String} content - Environment variable value
|
299
|
+
* @return {boolean} - Boolean value fo the passed variable value
|
300
|
+
*/
|
301
|
+
Parser.booleanParser = function(filename, content) {
|
302
|
+
return content === 'true';
|
303
|
+
};
|
304
|
+
|
305
|
+
/**
|
306
|
+
* Parses the environment variable to the number equivalent.
|
307
|
+
* Defaults to undefined
|
308
|
+
*
|
309
|
+
* @param {String} content - Environment variable value
|
310
|
+
* @return {Number} - Number value fo the passed variable value
|
311
|
+
*/
|
312
|
+
Parser.numberParser = function(filename, content) {
|
313
|
+
const numberValue = Number(content);
|
314
|
+
return Number.isNaN(numberValue) ? undefined : numberValue;
|
315
|
+
};
|
316
|
+
|
317
|
+
var order = ['js', 'cjs', 'ts', 'json', 'json5', 'hjson', 'toml', 'coffee', 'iced', 'yaml', 'yml', 'cson', 'properties', 'xml',
|
318
|
+
'boolean', 'number'];
|
319
|
+
var definitions = {
|
320
|
+
cjs: Parser.jsParser,
|
321
|
+
coffee: Parser.coffeeParser,
|
322
|
+
cson: Parser.csonParser,
|
323
|
+
hjson: Parser.hjsonParser,
|
324
|
+
iced: Parser.icedParser,
|
325
|
+
js: Parser.jsParser,
|
326
|
+
json: Parser.jsonParser,
|
327
|
+
json5: Parser.json5Parser,
|
328
|
+
properties: Parser.propertiesParser,
|
329
|
+
toml: Parser.tomlParser,
|
330
|
+
ts: Parser.tsParser,
|
331
|
+
xml: Parser.xmlParser,
|
332
|
+
yaml: Parser.yamlParser,
|
333
|
+
yml: Parser.yamlParser,
|
334
|
+
boolean: Parser.booleanParser,
|
335
|
+
number: Parser.numberParser
|
336
|
+
};
|
337
|
+
|
338
|
+
Parser.getParser = function(name) {
|
339
|
+
return definitions[name];
|
340
|
+
};
|
341
|
+
|
342
|
+
Parser.setParser = function(name, parser) {
|
343
|
+
definitions[name] = parser;
|
344
|
+
if (order.indexOf(name) === -1) {
|
345
|
+
order.push(name);
|
346
|
+
}
|
347
|
+
};
|
348
|
+
|
349
|
+
Parser.getFilesOrder = function(name) {
|
350
|
+
if (name) {
|
351
|
+
return order.indexOf(name);
|
352
|
+
}
|
353
|
+
return order;
|
354
|
+
};
|
355
|
+
|
356
|
+
Parser.setFilesOrder = function(name, newIndex) {
|
357
|
+
if (Array.isArray(name)) {
|
358
|
+
return order = name;
|
359
|
+
}
|
360
|
+
if (typeof newIndex === 'number') {
|
361
|
+
var index = order.indexOf(name);
|
362
|
+
order.splice(newIndex, 0, name);
|
363
|
+
if (index > -1) {
|
364
|
+
order.splice(index >= newIndex ? index +1 : index, 1);
|
365
|
+
}
|
366
|
+
}
|
367
|
+
return order;
|
368
|
+
};
|
package/pk.json
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
{
|
2
|
+
"name": "harthat-chain",
|
3
|
+
"version": "2.3.3",
|
4
|
+
"main": "./lib/config.js",
|
5
|
+
"description": "Configuration control for production node deployments",
|
6
|
+
"author": "Loren West <open_source@lorenwest.com>",
|
7
|
+
"homepage": "http://github.com/node-config/node-config.git",
|
8
|
+
"publishConfig": {
|
9
|
+
"registry": "https://registry.npmjs.org/"
|
10
|
+
},
|
11
|
+
"keywords": [
|
12
|
+
"conf",
|
13
|
+
"config",
|
14
|
+
"configuration",
|
15
|
+
"node-config",
|
16
|
+
"config-node",
|
17
|
+
"env",
|
18
|
+
"environment"
|
19
|
+
],
|
20
|
+
"directories": {
|
21
|
+
"lib": "./lib"
|
22
|
+
},
|
23
|
+
"license": "MIT",
|
24
|
+
"dependencies": {
|
25
|
+
"json5": "^2.2.3"
|
26
|
+
},
|
27
|
+
"devDependencies": {
|
28
|
+
"@types/node": "^7.0.8",
|
29
|
+
"coffeescript": "2.2.4",
|
30
|
+
"cson": "^3.0.1",
|
31
|
+
"hjson": "^1.2.0",
|
32
|
+
"js-yaml": "^3.2.2",
|
33
|
+
"properties": "~1.2.1",
|
34
|
+
"semver": "5.3.0",
|
35
|
+
"toml": "^2.0.6",
|
36
|
+
"ts-node": "^3.3.0",
|
37
|
+
"typescript": "^2.4.2",
|
38
|
+
"underscore": "^1.8.3",
|
39
|
+
"vows": ">=0.8.1",
|
40
|
+
"x2js": "^2.0.1"
|
41
|
+
},
|
42
|
+
"repository": {
|
43
|
+
"type": "git",
|
44
|
+
"url": "http://github.com/node-config/node-config.git"
|
45
|
+
},
|
46
|
+
"engines": {
|
47
|
+
"node": ">= 10.0.0"
|
48
|
+
},
|
49
|
+
"scripts": {
|
50
|
+
"test": "./node_modules/vows/bin/vows test/*.js --spec"
|
51
|
+
}
|
52
|
+
}
|
package/raw.js
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
* This is meant to wrap configuration objects that should be left as is,
|
3
|
+
* meaning that the object or its prototype will not be modified in any way
|
4
|
+
*/
|
5
|
+
function RawConfig () {
|
6
|
+
}
|
7
|
+
|
8
|
+
function raw(rawObj) {
|
9
|
+
var obj = Object.create(RawConfig.prototype);
|
10
|
+
obj.resolve = function () { return rawObj; }
|
11
|
+
return obj;
|
12
|
+
}
|
13
|
+
|
14
|
+
module.exports.RawConfig = RawConfig;
|
15
|
+
module.exports.raw = raw;
|