Blame view

node_modules/css/lib/stringify/source-map-support.js 2.74 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  
  /**
   * Module dependencies.
   */
  
  var SourceMap = require('source-map').SourceMapGenerator;
  var SourceMapConsumer = require('source-map').SourceMapConsumer;
  var sourceMapResolve = require('source-map-resolve');
  var urix = require('urix');
  var fs = require('fs');
  var path = require('path');
  
  /**
   * Expose `mixin()`.
   */
  
  module.exports = mixin;
  
  /**
   * Mixin source map support into `compiler`.
   *
   * @param {Compiler} compiler
   * @api public
   */
  
  function mixin(compiler) {
    compiler._comment = compiler.comment;
    compiler.map = new SourceMap();
    compiler.position = { line: 1, column: 1 };
    compiler.files = {};
    for (var k in exports) compiler[k] = exports[k];
  }
  
  /**
   * Update position.
   *
   * @param {String} str
   * @api private
   */
  
  exports.updatePosition = function(str) {
    var lines = str.match(/\n/g);
    if (lines) this.position.line += lines.length;
    var i = str.lastIndexOf('\n');
    this.position.column = ~i ? str.length - i : this.position.column + str.length;
  };
  
  /**
   * Emit `str`.
   *
   * @param {String} str
   * @param {Object} [pos]
   * @return {String}
   * @api private
   */
  
  exports.emit = function(str, pos) {
    if (pos) {
      var sourceFile = urix(pos.source || 'source.css');
  
      this.map.addMapping({
        source: sourceFile,
        generated: {
          line: this.position.line,
          column: Math.max(this.position.column - 1, 0)
        },
        original: {
          line: pos.start.line,
          column: pos.start.column - 1
        }
      });
  
      this.addFile(sourceFile, pos);
    }
  
    this.updatePosition(str);
  
    return str;
  };
  
  /**
   * Adds a file to the source map output if it has not already been added
   * @param {String} file
   * @param {Object} pos
   */
  
  exports.addFile = function(file, pos) {
    if (typeof pos.content !== 'string') return;
    if (Object.prototype.hasOwnProperty.call(this.files, file)) return;
  
    this.files[file] = pos.content;
  };
  
  /**
   * Applies any original source maps to the output and embeds the source file
   * contents in the source map.
   */
  
  exports.applySourceMaps = function() {
    Object.keys(this.files).forEach(function(file) {
      var content = this.files[file];
      this.map.setSourceContent(file, content);
  
      if (this.options.inputSourcemaps !== false) {
        var originalMap = sourceMapResolve.resolveSync(
          content, file, fs.readFileSync);
        if (originalMap) {
          var map = new SourceMapConsumer(originalMap.map);
          var relativeTo = originalMap.sourcesRelativeTo;
          this.map.applySourceMap(map, file, urix(path.dirname(relativeTo)));
        }
      }
    }, this);
  };
  
  /**
   * Process comments, drops sourceMap comments.
   * @param {Object} node
   */
  
  exports.comment = function(node) {
    if (/^# sourceMappingURL=/.test(node.comment))
      return this.emit('', node.position);
    else
      return this._comment(node);
  };