-
-
Notifications
You must be signed in to change notification settings - Fork 135
/
loadDefinedFile.js
81 lines (72 loc) · 1.94 KB
/
loadDefinedFile.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
// @flow
'use strict';
const yaml = require('js-yaml');
const requireFromString = require('require-from-string');
const readFile = require('./readFile');
const parseJson = require('./parseJson');
module.exports = function loadDefinedFile(
filepath: string,
options: {
sync?: boolean,
format?: 'json' | 'yaml' | 'js',
}
): Promise<?cosmiconfig$Result> | ?cosmiconfig$Result {
function parseContent(content: ?string): ?cosmiconfig$Result {
if (!content) {
throw new Error(`Config file is empty! Filepath - "${filepath}".`);
}
let parsedConfig;
switch (options.format) {
case 'json':
parsedConfig = parseJson(content, filepath);
break;
case 'yaml':
parsedConfig = yaml.safeLoad(content, {
filename: filepath,
});
break;
case 'js':
parsedConfig = requireFromString(content, filepath);
break;
default:
parsedConfig = tryAllParsing(content, filepath);
}
if (!parsedConfig) {
throw new Error(`Failed to parse "${filepath}" as JSON, JS, or YAML.`);
}
return {
config: parsedConfig,
filepath,
};
}
return !options.sync
? readFile(filepath, { throwNotFound: true }).then(parseContent)
: parseContent(readFile.sync(filepath, { throwNotFound: true }));
};
function tryAllParsing(content: string, filepath: string): ?Object {
return tryYaml(content, filepath, () => {
return tryRequire(content, filepath, () => {
return null;
});
});
}
function tryYaml(content: string, filepath: string, cb: () => ?Object) {
try {
const result = yaml.safeLoad(content, {
filename: filepath,
});
if (typeof result === 'string') {
return cb();
}
return result;
} catch (e) {
return cb();
}
}
function tryRequire(content: string, filepath: string, cb: () => ?Object) {
try {
return requireFromString(content, filepath);
} catch (e) {
return cb();
}
}