Blame view

node_modules/eslint-module-utils/parse.js 1.57 KB
ce4c83ff   wxy   初始提交
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
  "use strict"
  exports.__esModule = true
  
  const moduleRequire = require('./module-require').default
  const extname = require('path').extname
  
  const log = require('debug')('eslint-plugin-import:parse')
  
  exports.default = function parse(path, content, context) {
  
    if (context == null) throw new Error('need context to parse properly')
  
    let parserOptions = context.parserOptions
    const parserPath = getParserPath(path, context)
  
    if (!parserPath) throw new Error('parserPath is required!')
  
    // hack: espree blows up with frozen options
    parserOptions = Object.assign({}, parserOptions)
    parserOptions.ecmaFeatures = Object.assign({}, parserOptions.ecmaFeatures)
  
    // always include and attach comments
    parserOptions.comment = true
    parserOptions.attachComment = true
  
    // attach node locations
    parserOptions.loc = true
  
    // provide the `filePath` like eslint itself does, in `parserOptions`
    // https://github.com/eslint/eslint/blob/3ec436ee/lib/linter.js#L637
    parserOptions.filePath = path
  
    // require the parser relative to the main module (i.e., ESLint)
    const parser = moduleRequire(parserPath)
  
    return parser.parse(content, parserOptions)
  }
  
  function getParserPath(path, context) {
    const parsers = context.settings['import/parsers']
    if (parsers != null) {
      const extension = extname(path)
      for (let parserPath in parsers) {
        if (parsers[parserPath].indexOf(extension) > -1) {
          // use this alternate parser
          log('using alt parser:', parserPath)
          return parserPath
        }
      }
    }
    // default to use ESLint parser
    return context.parserPath
  }