mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-31 18:37:00 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /**
 | |
|  * Module dependencies.
 | |
|  */
 | |
| 
 | |
| var SourceMap = require('source-map').SourceMapGenerator;
 | |
| var SourceMapConsumer = require('source-map').SourceMapConsumer;
 | |
| var sourceMapResolve = require('source-map-resolve');
 | |
| var fs = require('fs');
 | |
| var path = require('path');
 | |
| 
 | |
| /**
 | |
|  * Expose `mixin()`.
 | |
|  */
 | |
| 
 | |
| module.exports = mixin;
 | |
| 
 | |
| /**
 | |
|  * Ensure Windows-style paths are formatted properly
 | |
|  */
 | |
| 
 | |
| const makeFriendlyPath = function(aPath) {
 | |
|   return path.sep === "\\" ? aPath.replace(/\\/g, "/").replace(/^[a-z]:\/?/i, "/") : aPath;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 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 = makeFriendlyPath(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, makeFriendlyPath(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);
 | |
| };
 |