Blame view

node_modules/vue-loader/lib/parser.js 1.51 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
  const compiler = require('vue-template-compiler')
  const cache = require('lru-cache')(100)
  const hash = require('hash-sum')
  const SourceMapGenerator = require('source-map').SourceMapGenerator
  
  const splitRE = /\r?\n/g
  const emptyRE = /^(?:\/\/)?\s*$/
  
  module.exports = (content, filename, needMap, sourceRoot, needCSSMap) => {
    const cacheKey = hash((filename + content).replace(/\\/g, '/'))
    let output = cache.get(cacheKey)
    if (output) return output
    output = compiler.parseComponent(content, { pad: 'line' })
    if (needMap) {
      if (output.script && !output.script.src) {
        output.script.map = generateSourceMap(
          filename,
          content,
          output.script.content,
          sourceRoot
        )
      }
      if (needCSSMap && output.styles) {
        output.styles.forEach(style => {
          if (!style.src) {
            style.map = generateSourceMap(
              filename,
              content,
              style.content,
              sourceRoot
            )
          }
        })
      }
    }
    cache.set(cacheKey, output)
    return output
  }
  
  function generateSourceMap (filename, source, generated, sourceRoot) {
    const map = new SourceMapGenerator({ sourceRoot })
    map.setSourceContent(filename, source)
    generated.split(splitRE).forEach((line, index) => {
      if (!emptyRE.test(line)) {
        map.addMapping({
          source: filename,
          original: {
            line: index + 1,
            column: 0
          },
          generated: {
            line: index + 1,
            column: 0
          }
        })
      }
    })
    return map.toJSON()
  }