|
| 1 | +/* eslint-disable */ |
| 2 | +'use strict'; |
| 3 | +// XXXXX: This file should not exist. Working around a core level bug |
| 4 | +// that prevents using fs at loaders. |
| 5 | +//var fs = require('fs'); // XXX |
| 6 | +var path = require('path'); |
| 7 | + |
| 8 | +var commentRx = /^\s*\/(?:\/|\*)[@#]\s+sourceMappingURL=data:(?:application|text)\/json;(?:charset[:=]\S+?;)?base64,(?:.*)$/mg; |
| 9 | +var mapFileCommentRx = |
| 10 | + //Example (Extra space between slashes added to solve Safari bug. Exclude space in production): |
| 11 | + // / /# sourceMappingURL=foo.js.map /*# sourceMappingURL=foo.js.map */ |
| 12 | + /(?:\/\/[@#][ \t]+sourceMappingURL=([^\s'"]+?)[ \t]*$)|(?:\/\*[@#][ \t]+sourceMappingURL=([^\*]+?)[ \t]*(?:\*\/){1}[ \t]*$)/mg |
| 13 | + |
| 14 | +function decodeBase64(base64) { |
| 15 | + return new Buffer(base64, 'base64').toString(); |
| 16 | +} |
| 17 | + |
| 18 | +function stripComment(sm) { |
| 19 | + return sm.split(',').pop(); |
| 20 | +} |
| 21 | + |
| 22 | +function readFromFileMap(sm, dir) { |
| 23 | + // NOTE: this will only work on the server since it attempts to read the map file |
| 24 | + |
| 25 | + mapFileCommentRx.lastIndex = 0; |
| 26 | + var r = mapFileCommentRx.exec(sm); |
| 27 | + |
| 28 | + // for some odd reason //# .. captures in 1 and /* .. */ in 2 |
| 29 | + var filename = r[1] || r[2]; |
| 30 | + var filepath = path.resolve(dir, filename); |
| 31 | + |
| 32 | + try { |
| 33 | + return fs.readFileSync(filepath, 'utf8'); |
| 34 | + } catch (e) { |
| 35 | + throw new Error('An error occurred while trying to read the map file at ' + filepath + '\n' + e); |
| 36 | + } |
| 37 | +} |
| 38 | + |
| 39 | +function Converter (sm, opts) { |
| 40 | + opts = opts || {}; |
| 41 | + |
| 42 | + if (opts.isFileComment) sm = readFromFileMap(sm, opts.commentFileDir); |
| 43 | + if (opts.hasComment) sm = stripComment(sm); |
| 44 | + if (opts.isEncoded) sm = decodeBase64(sm); |
| 45 | + if (opts.isJSON || opts.isEncoded) sm = JSON.parse(sm); |
| 46 | + |
| 47 | + this.sourcemap = sm; |
| 48 | +} |
| 49 | + |
| 50 | +Converter.prototype.toJSON = function (space) { |
| 51 | + return JSON.stringify(this.sourcemap, null, space); |
| 52 | +}; |
| 53 | + |
| 54 | +Converter.prototype.toBase64 = function () { |
| 55 | + var json = this.toJSON(); |
| 56 | + return new Buffer(json).toString('base64'); |
| 57 | +}; |
| 58 | + |
| 59 | +Converter.prototype.toComment = function (options) { |
| 60 | + var base64 = this.toBase64(); |
| 61 | + var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; |
| 62 | + return options && options.multiline ? '/*# ' + data + ' */' : '//# ' + data; |
| 63 | +}; |
| 64 | + |
| 65 | +// returns copy instead of original |
| 66 | +Converter.prototype.toObject = function () { |
| 67 | + return JSON.parse(this.toJSON()); |
| 68 | +}; |
| 69 | + |
| 70 | +Converter.prototype.addProperty = function (key, value) { |
| 71 | + if (this.sourcemap.hasOwnProperty(key)) throw new Error('property %s already exists on the sourcemap, use set property instead'); |
| 72 | + return this.setProperty(key, value); |
| 73 | +}; |
| 74 | + |
| 75 | +Converter.prototype.setProperty = function (key, value) { |
| 76 | + this.sourcemap[key] = value; |
| 77 | + return this; |
| 78 | +}; |
| 79 | + |
| 80 | +Converter.prototype.getProperty = function (key) { |
| 81 | + return this.sourcemap[key]; |
| 82 | +}; |
| 83 | + |
| 84 | +exports.fromObject = function (obj) { |
| 85 | + return new Converter(obj); |
| 86 | +}; |
| 87 | + |
| 88 | +exports.fromJSON = function (json) { |
| 89 | + return new Converter(json, { isJSON: true }); |
| 90 | +}; |
| 91 | + |
| 92 | +exports.fromBase64 = function (base64) { |
| 93 | + return new Converter(base64, { isEncoded: true }); |
| 94 | +}; |
| 95 | + |
| 96 | +exports.fromComment = function (comment) { |
| 97 | + comment = comment |
| 98 | + .replace(/^\/\*/g, '//') |
| 99 | + .replace(/\*\/$/g, ''); |
| 100 | + |
| 101 | + return new Converter(comment, { isEncoded: true, hasComment: true }); |
| 102 | +}; |
| 103 | + |
| 104 | +exports.fromMapFileComment = function (comment, dir) { |
| 105 | + return new Converter(comment, { commentFileDir: dir, isFileComment: true, isJSON: true }); |
| 106 | +}; |
| 107 | + |
| 108 | +// Finds last sourcemap comment in file or returns null if none was found |
| 109 | +exports.fromSource = function (content) { |
| 110 | + var m = content.match(commentRx); |
| 111 | + return m ? exports.fromComment(m.pop()) : null; |
| 112 | +}; |
| 113 | + |
| 114 | +// Finds last sourcemap comment in file or returns null if none was found |
| 115 | +exports.fromMapFileSource = function (content, dir) { |
| 116 | + var m = content.match(mapFileCommentRx); |
| 117 | + return m ? exports.fromMapFileComment(m.pop(), dir) : null; |
| 118 | +}; |
| 119 | + |
| 120 | +exports.removeComments = function (src) { |
| 121 | + return src.replace(commentRx, ''); |
| 122 | +}; |
| 123 | + |
| 124 | +exports.removeMapFileComments = function (src) { |
| 125 | + return src.replace(mapFileCommentRx, ''); |
| 126 | +}; |
| 127 | + |
| 128 | +exports.generateMapFileComment = function (file, options) { |
| 129 | + var data = 'sourceMappingURL=' + file; |
| 130 | + return options && options.multiline ? '/*# ' + data + ' */' : '//# ' + data; |
| 131 | +}; |
| 132 | + |
| 133 | +Object.defineProperty(exports, 'commentRegex', { |
| 134 | + get: function getCommentRegex () { |
| 135 | + return commentRx; |
| 136 | + } |
| 137 | +}); |
| 138 | + |
| 139 | +Object.defineProperty(exports, 'mapFileCommentRegex', { |
| 140 | + get: function getMapFileCommentRegex () { |
| 141 | + return mapFileCommentRx; |
| 142 | + } |
| 143 | +}); |
0 commit comments