Blame view

node_modules/cosmiconfig/dist/loadDefinedFile.js 2.28 KB
aaac7fed   liuqimichale   add
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
  //      
  'use strict';
  
  const yaml = require('js-yaml');
  const requireFromString = require('require-from-string');
  const readFile = require('./readFile');
  const parseJson = require('./parseJson');
  const path = require('path');
  
  module.exports = function loadDefinedFile(
    filepath        ,
    options   
                     
                                      
     
  )                                                     {
    function parseContent(content         )                      {
      if (!content) {
        throw new Error(`Config file is empty! Filepath - "${filepath}".`);
      }
  
      let parsedConfig;
  
      switch (options.format || inferFormat(filepath)) {
        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 inferFormat(filepath        )          {
    switch (path.extname(filepath)) {
      case '.js':
        return 'js';
      case '.json':
        return 'json';
      // istanbul ignore next
      case '.yml':
      case '.yaml':
        return 'yaml';
      default:
        return undefined;
    }
  }
  
  function tryAllParsing(content        , filepath        )          {
    return tryYaml(content, filepath, () => {
      return tryRequire(content, filepath, () => {
        return null;
      });
    });
  }
  
  function tryYaml(content        , filepath        , cb               ) {
    try {
      const result = yaml.safeLoad(content, {
        filename: filepath,
      });
      if (typeof result === 'string') {
        return cb();
      }
      return result;
    } catch (e) {
      return cb();
    }
  }
  
  function tryRequire(content        , filepath        , cb               ) {
    try {
      return requireFromString(content, filepath);
    } catch (e) {
      return cb();
    }
  }