├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── exp ├── build.js ├── index.html ├── one_pass_result.js ├── origin.coffee └── two_pass_result.js ├── index.js ├── lib └── multi-stage-sourcemap.js ├── package-lock.json ├── package.json └── test ├── mocha.opts └── multi-stage-sourcemap-test.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .gitignore support plugin (hsz.mobi) 2 | ### Node template 3 | # Logs 4 | logs 5 | *.log 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Dependency directory 25 | # Commenting this out is preferred by some people, see 26 | # https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | # Users Environment Variables 30 | .lock-wscript 31 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | node_js: stable 4 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.2.0 (2014-08-26) 2 | 3 | 4 | ## 0.1.0 (2014-07-02) 5 | 6 | 7 | #### Bug Fixes 8 | 9 | * **exp:** fix file path ([74257d46](https://github.com/azu/multi-stage-sourcemap/commit/74257d46cc524ff382c7ddb464084661b9986349)) 10 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # multi-stage-sourcemap [![Build Status](https://travis-ci.org/azu/multi-stage-sourcemap.svg?branch=master)](https://travis-ci.org/azu/multi-stage-sourcemap) 2 | 3 | This library provide re-mapping function for multi-level sourcemap. 4 | 5 | ## Installation 6 | 7 | ``` sh 8 | npm install multi-stage-sourcemap 9 | ``` 10 | 11 | ## Concept 12 | 13 | ### Basic SourceMap 14 | 15 | well-know basic sourcemap is no problem. 16 | 17 | ![basic-sourcemap.png](http://efcl.info/wp-content/uploads/2014/09/basic-sourcemap.png) 18 | 19 | ### Multi-level SourceMap 20 | 21 | Multi-level SourceMap has a problem. 22 | 23 | [Source Map Revision 3 Proposal](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# "Source Map Revision 3 Proposal - Google ドキュメント") doens't provide the way of mapping `Minified Code ` to `Original Code` in the following figure. 24 | 25 | ![multiple-sourcemap.png](http://efcl.info/wp-content/uploads/2014/09/multiple-sourcemap.png) 26 | 27 | Example: 28 | 29 | ``` 30 | A.js -> B.js -> C.js 31 | B.js.map -> C.js.map 32 | ``` 33 | 34 | We can't see from C.js to A.js. 35 | 36 | ### [multi-stage-sourcemap](https://github.com/azu/multi-stage-sourcemap "azu/multi-stage-sourcemap") <= THIS LIBRARY 37 | 38 | `multi-stage-sourcemap` can mapping `C.js` to `A.js` 39 | 40 | ![multiple-stage-sourcemap.png](http://efcl.info/wp-content/uploads/2014/09/multiple-stage-sourcemap.png) 41 | 42 | > The easy but lossy way is to ignore the intermediate steps in the process for the purposes of debugging, the source location information from the translation is either ignored (the intermediate translation is considered the “Original Source”) or the source location information is carried through (the intermediate translation hidden). -- [Source Map Revision 3 Proposal ](https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit# "Source Map Revision 3 Proposal - Google ドキュメント") 43 | 44 | `multi-stage-sourcemap` does that! 45 | 46 | ``` 47 | C.js -> ... -> A.js 48 | ``` 49 | 50 | Code: 51 | 52 | ``` js 53 | var transfer = require("multi-stage-sourcemap").transfer; 54 | var cToAMap = transfer({fromSourceMap: cMap, toSourceMap: bMap}); 55 | ``` 56 | 57 | ## Usage 58 | 59 | ### `transfer` 60 | 61 | Return the re-mapped `rawSourceMap` string. 62 | 63 | The only argument is an object with the following properties: 64 | 65 | - `fromSourceMap` : Object - rawSourceMap or String - JSON.stringify(rawSourceMap) 66 | - `toSourceMap` : Object - rawSourceMap or String - JSON.stringify(rawSourceMap) 67 | 68 | `rawSourceMap` is like below object. 69 | 70 | ``` js 71 | var rawSourceMap = { 72 | version: 3, 73 | file: 'min.js', 74 | names: ['bar', 'baz', 'n'], 75 | sources: ['one.js', 'two.js'], 76 | sourceRoot: 'http://exammuple.com/www/js/', 77 | mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA' 78 | }; 79 | ``` 80 | 81 | For details, please see [mozilla/source-map](https://github.com/mozilla/source-map/#sourcemapconsumer "mozilla/source-map"). 82 | 83 | ## Use Case 84 | 85 | - [AltJS][] -> JavaScript -> minify 86 | - [AltJS][] -> JavaScript -> [power-assert][] 87 | - [power-assert][] supports multi-level sourcemaps using this module. 88 | - [twada/battlefield-sourcemaps](https://github.com/twada/battlefield-sourcemaps "twada/battlefield-sourcemaps") 89 | - [power-assert 多段 SourceMap 対応の方針](https://gist.github.com/twada/103d34a3237cecd463a6 "power-assert 多段 SourceMap 対応の方針") 90 | 91 | etc... 92 | 93 | AltJS is languages that compile to JS. 94 | (It's contain ES6 with [Traceur](https://github.com/google/traceur-compiler "Traceur"). ) 95 | 96 | 97 | [AltJS]: https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS "List of languages that compile to JS · jashkenas/coffeescript Wiki" 98 | [power-assert]: https://github.com/twada/power-assert "twada/power-assert" 99 | 100 | ## Related library 101 | 102 | - [Rich-Harris/sorcery](https://github.com/Rich-Harris/sorcery "Rich-Harris/sorcery") 103 | 104 | ## Contributing 105 | 106 | 1. Fork it! 107 | 2. Create your feature branch: `git checkout -b my-new-feature` 108 | 3. Commit your changes: `git commit -am 'Add some feature'` 109 | 4. Push to the branch: `git push origin my-new-feature` 110 | 5. Submit a pull request :D 111 | 112 | ## License 113 | 114 | MIT 115 | -------------------------------------------------------------------------------- /exp/build.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var coffee = require("coffee-script"); 3 | var fs = require("fs"); 4 | var transfer = require("../lib/multi-stage-sourcemap"); 5 | var convert = require('convert-source-map'); 6 | var sourceMap = require("source-map"); 7 | var esprima = require("esprima"), 8 | escodegen = require("escodegen"), 9 | esmangle = require("esmangle"); 10 | // coffee -> js -> min.jsb 11 | var filepath = "./origin.coffee"; 12 | var code = fs.readFileSync(filepath, "utf-8"); 13 | var result_coffee = coffee.compile(code, { 14 | sourceMap: true 15 | }); 16 | var ast = esprima.parse(result_coffee.js, { 17 | loc: true, 18 | source: filepath 19 | }); 20 | // Get optimized AST 21 | var optimized = esmangle.optimize(ast, null); 22 | // gets mangled AST 23 | var result_esmangle = esmangle.mangle(optimized); 24 | var result_escodegen = escodegen.generate(result_esmangle, { 25 | sourceMap: true, // Settings source in esprima's options gives us 26 | sourceMapWithCode: true // Get both code and source map 27 | }); 28 | 29 | fs.writeFileSync("one_pass_result.js", result_escodegen.code + "\n" + convert.fromObject(result_escodegen.map).toComment(), "utf-8"); 30 | // multi level source map 31 | var re_map = JSON.parse(result_coffee.v3SourceMap); 32 | re_map.file = filepath; 33 | var newSource = transfer({ 34 | fromSourceMap: result_escodegen.map.toString(), 35 | toSourceMap: JSON.stringify(re_map) 36 | }); 37 | var comment = convert.fromObject(JSON.parse(newSource)).toComment(); 38 | fs.writeFileSync("two_pass_result.js", result_escodegen.code + "\n" + comment, "utf-8"); 39 | 40 | /* 41 | 42 | var coffee = require('coffee-script'), 43 | originalCompileFile = coffee._compileFile, 44 | minimatch = require('minimatch'), 45 | espowerSource = require('espower-source'); 46 | var sourceMap = require("source-map"); 47 | var Generator = sourceMap.SourceMapGenerator; 48 | var Consumer = sourceMap.SourceMapConsumer; 49 | 50 | var transfer = require("multi-stage-sourcemap").transfer; 51 | var convert = require('convert-source-map'); 52 | function espowerCoffee(options) { 53 | 'use strict'; 54 | 55 | var separator = (options.pattern.lastIndexOf('/', 0) === 0) ? '' : '/', 56 | pattern = options.cwd + separator + options.pattern; 57 | 58 | coffee._compileFile = function (filepath, sourceMap) { 59 | var answer = originalCompileFile(filepath, sourceMap); 60 | if (minimatch(filepath, pattern)) { 61 | if (sourceMap) { 62 | answer.js = espowerSource(answer.js, filepath, options.espowerOptions); 63 | var endSource = convert.fromSource(answer.js); 64 | var map = JSON.parse(answer.v3SourceMap); 65 | map.file = filepath; 66 | var newSource = transfer({ 67 | fromSourceMap: JSON.stringify(endSource.sourcemap), 68 | toSourceMap: JSON.stringify(map) 69 | }); 70 | var comment = convert.fromObject(JSON.parse(newSource)).toComment(); 71 | answer.js = convert.removeComments(answer.js) + comment + "\n"; 72 | } else { 73 | answer = espowerSource(answer, filepath, options.espowerOptions); 74 | } 75 | } 76 | return answer; 77 | }; 78 | 79 | coffee.register(); 80 | } 81 | 82 | module.exports = espowerCoffee; 83 | 84 | */ -------------------------------------------------------------------------------- /exp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | two 6 | 7 | 8 | 11 | 12 | 16 | 17 | 20 | 21 | -------------------------------------------------------------------------------- /exp/one_pass_result.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var a, c, d, e, f, g = {}.hasOwnProperty, b = function (a, b) { 3 | function d() { 4 | this.constructor = a; 5 | } 6 | for (var c in b) 7 | g.call(b, c) && (a[c] = b[c]); 8 | return d.prototype = b.prototype, a.prototype = new d(), a.__super__ = b.prototype, a; 9 | }; 10 | a = function () { 11 | function a(a) { 12 | this.name = a; 13 | } 14 | return a.prototype.move = function (a) { 15 | return console.log(this.name + (' moved ' + a + 'm.')); 16 | }, a; 17 | }(), d = function (c) { 18 | function a() { 19 | return a.__super__.constructor.apply(this, arguments); 20 | } 21 | return b(a, c), a.prototype.move = function () { 22 | return console.log('Slithering...'), a.__super__.move.call(this, 5); 23 | }, a; 24 | }(a), c = function (c) { 25 | function a() { 26 | return a.__super__.constructor.apply(this, arguments); 27 | } 28 | return b(a, c), a.prototype.move = function () { 29 | return console.log('Galloping...'), a.__super__.move.call(this, 45); 30 | }, a; 31 | }(a), e = new d('Sammy the Python'), f = new c('Tommy the Palomino'), e.move(), f.move(); 32 | }.call(this)); 33 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vb3JpZ2luLmNvZmZlZSJdLCJuYW1lcyI6WyJhIiwiYyIsImQiLCJlIiwiZiIsImciLCJoYXNPd25Qcm9wZXJ0eSIsImIiLCJjb25zdHJ1Y3RvciIsImNhbGwiLCJwcm90b3R5cGUiLCJfX3N1cGVyX18iLCJuYW1lIiwibW92ZSIsImNvbnNvbGUiLCJsb2ciLCJhcHBseSIsImFyZ3VtZW50cyJdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQyxZQUFXO0FBQUEsSUFDVixJQUFJQSxDQUFKLEVBQVlDLENBQVosRUFBbUJDLENBQW5CLEVBQTBCQyxDQUExQixFQUErQkMsQ0FBL0IsRUFDRUMsQ0FBQSxHQUFZLEdBQUdDLGNBRGpCLEVBRUVDLENBQUEsR0FBWSxVQUFTUCxDQUFULEVBQWdCTyxDQUFoQixFQUF3QjtBQUFBLFlBQXlGLFNBQVNMLENBQVQsR0FBZ0I7QUFBQSxnQkFBRSxLQUFLTSxXQUFMLEdBQW1CUixDQUFuQixDQUFGO0FBQUEsYUFBekc7QUFBQSxZQUFFLFNBQVNDLENBQVQsSUFBZ0JNLENBQWhCO0FBQUEsZ0JBQThCRixDQUFBLENBQVVJLElBQVYsQ0FBZUYsQ0FBZixFQUF1Qk4sQ0FBdkIsQ0FBSixJQUFpQyxDQUFBRCxDQUFBLENBQU1DLENBQU4sSUFBYU0sQ0FBQSxDQUFPTixDQUFQLENBQWIsQ0FBakMsQ0FBNUI7QUFBQSxZQUE0TyxPQUFyR0MsQ0FBQSxDQUFLUSxTQUFMLEdBQWlCSCxDQUFBLENBQU9HLFMsRUFBV1YsQ0FBQSxDQUFNVSxTQUFOLEdBQWtCLElBQUlSLENBQUosRSxFQUFZRixDQUFBLENBQU1XLFNBQU4sR0FBa0JKLENBQUEsQ0FBT0csUyxFQUFrQlYsQ0FBUCxDQUE1TztBQUFBLFNBRnRDLENBRFU7QUFBQSxJQUtWQSxDQUFBLEdBQVUsWUFBVztBQUFBLFFBQ25CLFNBQVNBLENBQVQsQ0FBZ0JBLENBQWhCLEVBQXNCO0FBQUEsWUFDcEIsS0FBS1ksSUFBTCxHQUFZWixDQUFaLENBRG9CO0FBQUEsU0FESDtBQUFBLFFBU25CLE9BSkFBLENBQUEsQ0FBT1UsU0FBUCxDQUFpQkcsSUFBakIsR0FBd0IsVUFBU2IsQ0FBVCxFQUFpQjtBQUFBLFlBQ3ZDLE9BQU9jLE9BQUEsQ0FBUUMsR0FBUixDQUFZLEtBQUtILElBQUwsR0FBYSxhQUFZWixDQUFaLEdBQXFCLElBQXJCLENBQXpCLENBQVAsQ0FEdUM7QUFBQSxTLEVBSWxDQSxDQUFQLENBVG1CO0FBQUEsS0FBWixFLEVBYVRFLENBQUEsR0FBUyxVQUFTRCxDQUFULEVBQWlCO0FBQUEsUUFHeEIsU0FBU0QsQ0FBVCxHQUFpQjtBQUFBLFlBQ2YsT0FBT0EsQ0FBQSxDQUFNVyxTQUFOLENBQWdCSCxXQUFoQixDQUE0QlEsS0FBNUIsQ0FBa0MsSUFBbEMsRUFBd0NDLFNBQXhDLENBQVAsQ0FEZTtBQUFBLFNBSE87QUFBQSxRQVl4QixPQVhBVixDQUFBLENBQVVQLENBQVYsRUFBaUJDLENBQWpCLEMsRUFNQUQsQ0FBQSxDQUFNVSxTQUFOLENBQWdCRyxJQUFoQixHQUF1QixZQUFXO0FBQUEsWUFFaEMsT0FEQUMsT0FBQSxDQUFRQyxHQUFSLENBQVksZUFBWixDLEVBQ09mLENBQUEsQ0FBTVcsU0FBTixDQUFnQkUsSUFBaEIsQ0FBcUJKLElBQXJCLENBQTBCLElBQTFCLEVBQWdDLENBQWhDLENBQVAsQ0FGZ0M7QUFBQSxTLEVBSzNCVCxDQUFQLENBWndCO0FBQUEsS0FBbEIsQ0FjTEEsQ0FkSyxDLEVBZ0JSQyxDQUFBLEdBQVMsVUFBU0EsQ0FBVCxFQUFpQjtBQUFBLFFBR3hCLFNBQVNELENBQVQsR0FBaUI7QUFBQSxZQUNmLE9BQU9BLENBQUEsQ0FBTVcsU0FBTixDQUFnQkgsV0FBaEIsQ0FBNEJRLEtBQTVCLENBQWtDLElBQWxDLEVBQXdDQyxTQUF4QyxDQUFQLENBRGU7QUFBQSxTQUhPO0FBQUEsUUFZeEIsT0FYQVYsQ0FBQSxDQUFVUCxDQUFWLEVBQWlCQyxDQUFqQixDLEVBTUFELENBQUEsQ0FBTVUsU0FBTixDQUFnQkcsSUFBaEIsR0FBdUIsWUFBVztBQUFBLFlBRWhDLE9BREFDLE9BQUEsQ0FBUUMsR0FBUixDQUFZLGNBQVosQyxFQUNPZixDQUFBLENBQU1XLFNBQU4sQ0FBZ0JFLElBQWhCLENBQXFCSixJQUFyQixDQUEwQixJQUExQixFQUFnQyxFQUFoQyxDQUFQLENBRmdDO0FBQUEsUyxFQUszQlQsQ0FBUCxDQVp3QjtBQUFBLEtBQWxCLENBY0xBLENBZEssQyxFQWdCUkcsQ0FBQSxHQUFNLElBQUlELENBQUosQ0FBVSxrQkFBVixDLEVBRU5FLENBQUEsR0FBTSxJQUFJSCxDQUFKLENBQVUsb0JBQVYsQyxFQUVORSxDQUFBLENBQUlVLElBQUosRSxFQUVBVCxDQUFBLENBQUlTLElBQUosR0F4RFU7QUFBQSxDQUFaLENBMERHSixJQTFESCxDQTBEUSxJQTFEUiJ9 -------------------------------------------------------------------------------- /exp/origin.coffee: -------------------------------------------------------------------------------- 1 | class Animal 2 | constructor: (@name) -> 3 | 4 | move: (meters) -> 5 | console.log @name + " moved #{meters}m." 6 | 7 | class Snake extends Animal 8 | move: -> 9 | console.log "Slithering..." 10 | super 5 11 | 12 | class Horse extends Animal 13 | move: -> 14 | console.log "Galloping..." 15 | super 45 16 | 17 | sam = new Snake "Sammy the Python" 18 | tom = new Horse "Tommy the Palomino" 19 | 20 | sam.move() 21 | tom.move() -------------------------------------------------------------------------------- /exp/two_pass_result.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var a, c, d, e, f, g = {}.hasOwnProperty, b = function (a, b) { 3 | function d() { 4 | this.constructor = a; 5 | } 6 | for (var c in b) 7 | g.call(b, c) && (a[c] = b[c]); 8 | return d.prototype = b.prototype, a.prototype = new d(), a.__super__ = b.prototype, a; 9 | }; 10 | a = function () { 11 | function a(a) { 12 | this.name = a; 13 | } 14 | return a.prototype.move = function (a) { 15 | return console.log(this.name + (' moved ' + a + 'm.')); 16 | }, a; 17 | }(), d = function (c) { 18 | function a() { 19 | return a.__super__.constructor.apply(this, arguments); 20 | } 21 | return b(a, c), a.prototype.move = function () { 22 | return console.log('Slithering...'), a.__super__.move.call(this, 5); 23 | }, a; 24 | }(a), c = function (c) { 25 | function a() { 26 | return a.__super__.constructor.apply(this, arguments); 27 | } 28 | return b(a, c), a.prototype.move = function () { 29 | return console.log('Galloping...'), a.__super__.move.call(this, 45); 30 | }, a; 31 | }(a), e = new d('Sammy the Python'), f = new c('Tommy the Palomino'), e.move(), f.move(); 32 | }.call(this)); 33 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIm9yaWdpbi5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQSxZQUFBO0FBQUEsSUFBQSxJQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsQ0FBQSxFQUFBLENBQUEsRUFBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLEdBQUEsY0FBQTs7Ozs7OztTQUFBLENBQUE7QUFBQSxJQUFNLENBQUEsR0FBQSxZQUFBO0FBQUEsUUFDUyxTQUFBLENBQUEsQ0FBRSxDQUFGLEVBQUE7QUFBQSxZQUFDLEtBQUMsSUFBRCxHQUFDLENBQUQsQ0FBRDtBQUFBLFNBRFQ7QUFBQSxlQUNKLENBQUEsQ0FBQSxTQUFBLENBRUEsSUFGQSxHQUVNLFVBQUMsQ0FBRCxFQUFBO0FBQUEsbUJBQ0osT0FBQSxDQUFRLEdBQVIsQ0FBWSxLQUFDLElBQUQsR0FBUyxhQUFRLENBQVIsR0FBZ0IsSUFBaEIsQ0FBckIsRUFESTtBQUFBLGFBSEY7QUFBQSxLQUFBLElBTUEsQ0FBQSxHQUFBLFVBQUEsQ0FBQSxFQUFBO0FBQUE7O1NBQUE7QUFBQSxlQUNKLENBQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxTQUFBLENBQUEsSUFBQSxHQUFNLFlBQUE7QUFBQSxtQkFDSixPQUFBLENBQVEsR0FBUixDQUFZLGVBQVosR0FDQSxDQUFBLENBQUEsU0FBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxFQUFNLENBQU4sRUFGSTtBQUFBLGFBREY7QUFBQSxLQUFBLENBQWMsQ0FBZCxHQUtBLENBQUEsR0FBQSxVQUFBLENBQUEsRUFBQTtBQUFBOztTQUFBO0FBQUEsZUFDSixDQUFBLENBQUEsQ0FBQSxFQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsU0FBQSxDQUFBLElBQUEsR0FBTSxZQUFBO0FBQUEsbUJBQ0osT0FBQSxDQUFRLEdBQVIsQ0FBWSxjQUFaLEdBQ0EsQ0FBQSxDQUFBLFNBQUEsQ0FBQSxJQUFBLENBQUEsSUFBQSxDQUFBLElBQUEsRUFBTSxFQUFOLEVBRkk7QUFBQSxhQURGO0FBQUEsS0FBQSxDQUFjLENBQWQsR0FLTixDQUFBLEdBQVUsSUFBQSxDQUFBLENBQU0sa0JBQU4sR0FDVixDQUFBLEdBQVUsSUFBQSxDQUFBLENBQU0sb0JBQU4sR0FFVixDQUFBLENBQUksSUFBSixJQUNBLENBQUEsQ0FBSSxJQUFKLEdBcEJBO0FBQUEsQ0FBQSxLQUFBLEtBQUEifQ== -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by azu on 2014/07/02. 3 | * LICENSE : MIT 4 | */ 5 | "use strict"; 6 | module.exports = { 7 | transfer: require("./lib/multi-stage-sourcemap") 8 | }; -------------------------------------------------------------------------------- /lib/multi-stage-sourcemap.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var sourceMap = require("source-map"); 3 | var Generator = sourceMap.SourceMapGenerator; 4 | var Consumer = sourceMap.SourceMapConsumer; 5 | /** 6 | * return re-mapped rawSourceMap string 7 | * @param {object} mappingObject 8 | * @param {string} mappingObject.fromSourceMap 9 | * @param {string} mappingObject.toSourceMap 10 | * @returns {string} 11 | */ 12 | function transfer(mappingObject) { 13 | var fromSourceMap = mappingObject.fromSourceMap; 14 | var toSourceMap = mappingObject.toSourceMap; 15 | var fromSMC = new Consumer(fromSourceMap); 16 | var toSMC = new Consumer(toSourceMap); 17 | var resultMap = new Generator(); 18 | fromSMC.eachMapping(function (mapping) { 19 | var generatedPosition = { 20 | line: mapping.generatedLine, 21 | column: mapping.generatedColumn 22 | }; 23 | var fromOriginalPosition = { 24 | line: mapping.originalLine, 25 | column: mapping.originalColumn 26 | }; 27 | // from's generated position -> to's original position 28 | var originalPosition = toSMC.originalPositionFor(fromOriginalPosition); 29 | if (originalPosition.source !== null) { 30 | var originalSource = originalPosition.source; 31 | resultMap.addMapping({ 32 | source: originalSource, 33 | name : originalPosition.name, 34 | generated: generatedPosition, 35 | original: originalPosition 36 | }); 37 | resultMap.setSourceContent( 38 | originalSource, 39 | toSMC.sourceContentFor(originalSource) 40 | ); 41 | } 42 | }); 43 | return resultMap.toString(); 44 | } 45 | 46 | module.exports = transfer; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "multi-stage-sourcemap", 3 | "version": "0.3.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "amdefine": { 8 | "version": "1.0.1", 9 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 10 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 11 | }, 12 | "coffee-script": { 13 | "version": "1.12.7", 14 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", 15 | "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", 16 | "dev": true 17 | }, 18 | "commander": { 19 | "version": "2.3.0", 20 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", 21 | "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", 22 | "dev": true 23 | }, 24 | "convert-source-map": { 25 | "version": "0.3.5", 26 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", 27 | "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", 28 | "dev": true 29 | }, 30 | "debug": { 31 | "version": "2.0.0", 32 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.0.0.tgz", 33 | "integrity": "sha1-ib2d9nMrUSVrxnBTQrugLtEhMe8=", 34 | "dev": true, 35 | "requires": { 36 | "ms": "0.6.2" 37 | } 38 | }, 39 | "deep-equal": { 40 | "version": "0.2.2", 41 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", 42 | "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=", 43 | "dev": true 44 | }, 45 | "deep-is": { 46 | "version": "0.1.3", 47 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 48 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 49 | "dev": true 50 | }, 51 | "diff": { 52 | "version": "1.0.8", 53 | "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz", 54 | "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=", 55 | "dev": true 56 | }, 57 | "eastasianwidth": { 58 | "version": "0.1.1", 59 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.1.1.tgz", 60 | "integrity": "sha1-RNZW3p2kFWlEZzNTZfsxR7hXK3w=", 61 | "dev": true 62 | }, 63 | "empower": { 64 | "version": "0.8.0", 65 | "resolved": "https://registry.npmjs.org/empower/-/empower-0.8.0.tgz", 66 | "integrity": "sha1-R9EIhEhzzw7YcIXGZ6O+Frc/XuQ=", 67 | "dev": true, 68 | "requires": { 69 | "escallmatch": "~0.3.0", 70 | "xtend": "~4.0.0" 71 | } 72 | }, 73 | "escallmatch": { 74 | "version": "0.3.1", 75 | "resolved": "https://registry.npmjs.org/escallmatch/-/escallmatch-0.3.1.tgz", 76 | "integrity": "sha1-/O4Tcu7mo1x8gMsZ8U9Bq/xkRqI=", 77 | "dev": true, 78 | "requires": { 79 | "deep-equal": "~0.2.1", 80 | "esprima": "~1.2.2", 81 | "espurify": "~0.1.3", 82 | "estraverse": "~1.5.1" 83 | }, 84 | "dependencies": { 85 | "estraverse": { 86 | "version": "1.5.1", 87 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 88 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", 89 | "dev": true 90 | } 91 | } 92 | }, 93 | "escape-string-regexp": { 94 | "version": "1.0.2", 95 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", 96 | "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", 97 | "dev": true 98 | }, 99 | "escodegen": { 100 | "version": "1.10.0", 101 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz", 102 | "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==", 103 | "dev": true, 104 | "requires": { 105 | "esprima": "^3.1.3", 106 | "estraverse": "^4.2.0", 107 | "esutils": "^2.0.2", 108 | "optionator": "^0.8.1", 109 | "source-map": "~0.6.1" 110 | }, 111 | "dependencies": { 112 | "esprima": { 113 | "version": "3.1.3", 114 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 115 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", 116 | "dev": true 117 | }, 118 | "source-map": { 119 | "version": "0.6.1", 120 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 121 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 122 | "dev": true, 123 | "optional": true 124 | } 125 | } 126 | }, 127 | "escope": { 128 | "version": "1.0.3", 129 | "resolved": "https://registry.npmjs.org/escope/-/escope-1.0.3.tgz", 130 | "integrity": "sha1-dZ3OhJbEJI/sLQyq9BCLzz8af10=", 131 | "dev": true, 132 | "requires": { 133 | "estraverse": "^2.0.0" 134 | }, 135 | "dependencies": { 136 | "estraverse": { 137 | "version": "2.0.0", 138 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-2.0.0.tgz", 139 | "integrity": "sha1-WuRpYyQ2ACBmdMyySgnhZnT83KE=", 140 | "dev": true 141 | } 142 | } 143 | }, 144 | "esmangle": { 145 | "version": "1.0.1", 146 | "resolved": "https://registry.npmjs.org/esmangle/-/esmangle-1.0.1.tgz", 147 | "integrity": "sha1-2bs3uPjq+/Tm1O1reqKVarvTxMI=", 148 | "dev": true, 149 | "requires": { 150 | "escodegen": "~1.3.2", 151 | "escope": "~1.0.1", 152 | "esprima": "~1.1.1", 153 | "esshorten": "~1.1.0", 154 | "estraverse": "~1.5.0", 155 | "esutils": "~ 1.0.0", 156 | "optionator": "~0.3.0", 157 | "source-map": "~0.1.33" 158 | }, 159 | "dependencies": { 160 | "escodegen": { 161 | "version": "1.3.3", 162 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", 163 | "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", 164 | "dev": true, 165 | "requires": { 166 | "esprima": "~1.1.1", 167 | "estraverse": "~1.5.0", 168 | "esutils": "~1.0.0", 169 | "source-map": "~0.1.33" 170 | } 171 | }, 172 | "esprima": { 173 | "version": "1.1.1", 174 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", 175 | "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=", 176 | "dev": true 177 | }, 178 | "estraverse": { 179 | "version": "1.5.1", 180 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 181 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", 182 | "dev": true 183 | }, 184 | "esutils": { 185 | "version": "1.0.0", 186 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", 187 | "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", 188 | "dev": true 189 | }, 190 | "fast-levenshtein": { 191 | "version": "1.0.7", 192 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz", 193 | "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk=", 194 | "dev": true 195 | }, 196 | "levn": { 197 | "version": "0.2.5", 198 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz", 199 | "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=", 200 | "dev": true, 201 | "requires": { 202 | "prelude-ls": "~1.1.0", 203 | "type-check": "~0.3.1" 204 | } 205 | }, 206 | "optionator": { 207 | "version": "0.3.0", 208 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.3.0.tgz", 209 | "integrity": "sha1-lxWotfXnWGz/BsgkngOc1zZNP1Q=", 210 | "dev": true, 211 | "requires": { 212 | "deep-is": "~0.1.2", 213 | "fast-levenshtein": "~1.0.0", 214 | "levn": "~0.2.4", 215 | "prelude-ls": "~1.1.0", 216 | "type-check": "~0.3.1", 217 | "wordwrap": "~0.0.2" 218 | } 219 | }, 220 | "wordwrap": { 221 | "version": "0.0.3", 222 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 223 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 224 | "dev": true 225 | } 226 | } 227 | }, 228 | "espower": { 229 | "version": "0.8.0", 230 | "resolved": "https://registry.npmjs.org/espower/-/espower-0.8.0.tgz", 231 | "integrity": "sha1-WWgateo1LsGpmMGHTzQPZ8lX2F8=", 232 | "dev": true, 233 | "requires": { 234 | "escallmatch": "~0.3.0", 235 | "escodegen": "~1.3.3", 236 | "espurify": "~0.1.3", 237 | "estraverse": "~1.5.1", 238 | "type-name": "~1.0.0", 239 | "xtend": "~4.0.0" 240 | }, 241 | "dependencies": { 242 | "escodegen": { 243 | "version": "1.3.3", 244 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", 245 | "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", 246 | "dev": true, 247 | "requires": { 248 | "esprima": "~1.1.1", 249 | "estraverse": "~1.5.0", 250 | "esutils": "~1.0.0", 251 | "source-map": "~0.1.33" 252 | } 253 | }, 254 | "esprima": { 255 | "version": "1.1.1", 256 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", 257 | "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=", 258 | "dev": true 259 | }, 260 | "estraverse": { 261 | "version": "1.5.1", 262 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 263 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", 264 | "dev": true 265 | }, 266 | "esutils": { 267 | "version": "1.0.0", 268 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", 269 | "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", 270 | "dev": true 271 | } 272 | } 273 | }, 274 | "espower-loader": { 275 | "version": "0.8.0", 276 | "resolved": "https://registry.npmjs.org/espower-loader/-/espower-loader-0.8.0.tgz", 277 | "integrity": "sha1-bd3BDNyvteCNkW2eW4s9SVVPlTI=", 278 | "dev": true, 279 | "requires": { 280 | "espower-source": "~0.8.0", 281 | "minimatch": "~1.0.0" 282 | } 283 | }, 284 | "espower-source": { 285 | "version": "0.8.0", 286 | "resolved": "https://registry.npmjs.org/espower-source/-/espower-source-0.8.0.tgz", 287 | "integrity": "sha1-GWFXeyixTxDhA4RDxoko9UHwbFw=", 288 | "dev": true, 289 | "requires": { 290 | "convert-source-map": "~0.4.0", 291 | "escodegen": "~1.3.3", 292 | "espower": "~0.8.0", 293 | "esprima": "~1.2.2", 294 | "xtend": "~4.0.0" 295 | }, 296 | "dependencies": { 297 | "convert-source-map": { 298 | "version": "0.4.1", 299 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.4.1.tgz", 300 | "integrity": "sha1-+RmgCZ/jH4D8Wh0OswMWGzlAcMc=", 301 | "dev": true 302 | }, 303 | "escodegen": { 304 | "version": "1.3.3", 305 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", 306 | "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", 307 | "dev": true, 308 | "requires": { 309 | "esprima": "~1.1.1", 310 | "estraverse": "~1.5.0", 311 | "esutils": "~1.0.0", 312 | "source-map": "~0.1.33" 313 | }, 314 | "dependencies": { 315 | "esprima": { 316 | "version": "1.1.1", 317 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", 318 | "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=", 319 | "dev": true 320 | } 321 | } 322 | }, 323 | "estraverse": { 324 | "version": "1.5.1", 325 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 326 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", 327 | "dev": true 328 | }, 329 | "esutils": { 330 | "version": "1.0.0", 331 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", 332 | "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", 333 | "dev": true 334 | } 335 | } 336 | }, 337 | "esprima": { 338 | "version": "1.2.5", 339 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.5.tgz", 340 | "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", 341 | "dev": true 342 | }, 343 | "espurify": { 344 | "version": "0.1.3", 345 | "resolved": "https://registry.npmjs.org/espurify/-/espurify-0.1.3.tgz", 346 | "integrity": "sha1-ZiZIijPG/uTahF29e4afFHu/Pwk=", 347 | "dev": true, 348 | "requires": { 349 | "traverse": "~0.6.6" 350 | } 351 | }, 352 | "esshorten": { 353 | "version": "1.1.1", 354 | "resolved": "https://registry.npmjs.org/esshorten/-/esshorten-1.1.1.tgz", 355 | "integrity": "sha1-F0+Wt8wmfkaHLYFOfbfCkL3/Yak=", 356 | "dev": true, 357 | "requires": { 358 | "escope": "~1.0.1", 359 | "estraverse": "~4.1.1", 360 | "esutils": "~2.0.2" 361 | }, 362 | "dependencies": { 363 | "estraverse": { 364 | "version": "4.1.1", 365 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", 366 | "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", 367 | "dev": true 368 | } 369 | } 370 | }, 371 | "estraverse": { 372 | "version": "4.2.0", 373 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 374 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 375 | "dev": true 376 | }, 377 | "esutils": { 378 | "version": "2.0.2", 379 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 380 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 381 | "dev": true 382 | }, 383 | "fast-levenshtein": { 384 | "version": "2.0.6", 385 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 386 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 387 | "dev": true 388 | }, 389 | "glob": { 390 | "version": "3.2.3", 391 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", 392 | "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", 393 | "dev": true, 394 | "requires": { 395 | "graceful-fs": "~2.0.0", 396 | "inherits": "2", 397 | "minimatch": "~0.2.11" 398 | }, 399 | "dependencies": { 400 | "minimatch": { 401 | "version": "0.2.14", 402 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 403 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 404 | "dev": true, 405 | "requires": { 406 | "lru-cache": "2", 407 | "sigmund": "~1.0.0" 408 | } 409 | } 410 | } 411 | }, 412 | "googlediff": { 413 | "version": "0.1.0", 414 | "resolved": "https://registry.npmjs.org/googlediff/-/googlediff-0.1.0.tgz", 415 | "integrity": "sha1-mazwXMBiI+tmwpAI2B+bLRjCRT0=", 416 | "dev": true 417 | }, 418 | "graceful-fs": { 419 | "version": "2.0.3", 420 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", 421 | "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", 422 | "dev": true 423 | }, 424 | "growl": { 425 | "version": "1.8.1", 426 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.8.1.tgz", 427 | "integrity": "sha1-Sy3sjZB+k9szZiTc7AGDUC+MlCg=", 428 | "dev": true 429 | }, 430 | "inherits": { 431 | "version": "2.0.3", 432 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 433 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 434 | "dev": true 435 | }, 436 | "intelli-espower-loader": { 437 | "version": "0.3.0", 438 | "resolved": "https://registry.npmjs.org/intelli-espower-loader/-/intelli-espower-loader-0.3.0.tgz", 439 | "integrity": "sha1-abGhQtPxiB1oYqDK/Bt+wKI2KcM=", 440 | "dev": true 441 | }, 442 | "jade": { 443 | "version": "0.26.3", 444 | "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", 445 | "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", 446 | "dev": true, 447 | "requires": { 448 | "commander": "0.6.1", 449 | "mkdirp": "0.3.0" 450 | }, 451 | "dependencies": { 452 | "commander": { 453 | "version": "0.6.1", 454 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", 455 | "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", 456 | "dev": true 457 | }, 458 | "mkdirp": { 459 | "version": "0.3.0", 460 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", 461 | "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", 462 | "dev": true 463 | } 464 | } 465 | }, 466 | "levn": { 467 | "version": "0.3.0", 468 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 469 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 470 | "dev": true, 471 | "requires": { 472 | "prelude-ls": "~1.1.2", 473 | "type-check": "~0.3.2" 474 | } 475 | }, 476 | "lru-cache": { 477 | "version": "2.7.3", 478 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 479 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 480 | "dev": true 481 | }, 482 | "minimatch": { 483 | "version": "1.0.0", 484 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", 485 | "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", 486 | "dev": true, 487 | "requires": { 488 | "lru-cache": "2", 489 | "sigmund": "~1.0.0" 490 | } 491 | }, 492 | "minimist": { 493 | "version": "0.0.8", 494 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 495 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 496 | "dev": true 497 | }, 498 | "mkdirp": { 499 | "version": "0.5.0", 500 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 501 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 502 | "dev": true, 503 | "requires": { 504 | "minimist": "0.0.8" 505 | } 506 | }, 507 | "mocha": { 508 | "version": "1.21.5", 509 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.21.5.tgz", 510 | "integrity": "sha1-fFiwkXTfl25DSiOx6NY5hz/FKek=", 511 | "dev": true, 512 | "requires": { 513 | "commander": "2.3.0", 514 | "debug": "2.0.0", 515 | "diff": "1.0.8", 516 | "escape-string-regexp": "1.0.2", 517 | "glob": "3.2.3", 518 | "growl": "1.8.1", 519 | "jade": "0.26.3", 520 | "mkdirp": "0.5.0" 521 | } 522 | }, 523 | "ms": { 524 | "version": "0.6.2", 525 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", 526 | "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", 527 | "dev": true 528 | }, 529 | "object-keys": { 530 | "version": "0.5.1", 531 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.5.1.tgz", 532 | "integrity": "sha1-DrIP+gznwBl3ZIaBtCxRXyl9LME=", 533 | "dev": true 534 | }, 535 | "optionator": { 536 | "version": "0.8.2", 537 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 538 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 539 | "dev": true, 540 | "requires": { 541 | "deep-is": "~0.1.3", 542 | "fast-levenshtein": "~2.0.4", 543 | "levn": "~0.3.0", 544 | "prelude-ls": "~1.1.2", 545 | "type-check": "~0.3.2", 546 | "wordwrap": "~1.0.0" 547 | } 548 | }, 549 | "power-assert": { 550 | "version": "0.8.0", 551 | "resolved": "https://registry.npmjs.org/power-assert/-/power-assert-0.8.0.tgz", 552 | "integrity": "sha1-N7WFGCuNBULmrTt8mWiSEyWAbkY=", 553 | "dev": true, 554 | "requires": { 555 | "empower": "~0.8.0", 556 | "power-assert-formatter": "~0.8.0" 557 | } 558 | }, 559 | "power-assert-formatter": { 560 | "version": "0.8.0", 561 | "resolved": "https://registry.npmjs.org/power-assert-formatter/-/power-assert-formatter-0.8.0.tgz", 562 | "integrity": "sha1-cIvZMswdpI5uI1Nx1JT/It/0zQ8=", 563 | "dev": true, 564 | "requires": { 565 | "eastasianwidth": "~0.1.0", 566 | "esprima": "~1.2.2", 567 | "estraverse": "~1.5.1", 568 | "googlediff": "~0.1.0", 569 | "object-keys": "~0.5.1", 570 | "stringifier": "~0.1.1", 571 | "type-name": "~1.0.0", 572 | "xtend": "~4.0.0" 573 | }, 574 | "dependencies": { 575 | "estraverse": { 576 | "version": "1.5.1", 577 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", 578 | "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", 579 | "dev": true 580 | } 581 | } 582 | }, 583 | "prelude-ls": { 584 | "version": "1.1.2", 585 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 586 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 587 | "dev": true 588 | }, 589 | "sigmund": { 590 | "version": "1.0.1", 591 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 592 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 593 | "dev": true 594 | }, 595 | "source-map": { 596 | "version": "0.1.43", 597 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", 598 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 599 | "requires": { 600 | "amdefine": ">=0.0.4" 601 | } 602 | }, 603 | "stringifier": { 604 | "version": "0.1.2", 605 | "resolved": "https://registry.npmjs.org/stringifier/-/stringifier-0.1.2.tgz", 606 | "integrity": "sha1-3oZq2rKBKpLj/k/PEV8WbsuZU0I=", 607 | "dev": true, 608 | "requires": { 609 | "traverse": "~0.6.6", 610 | "type-name": "~1.0.0", 611 | "xtend": "~4.0.0" 612 | } 613 | }, 614 | "traverse": { 615 | "version": "0.6.6", 616 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", 617 | "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", 618 | "dev": true 619 | }, 620 | "type-check": { 621 | "version": "0.3.2", 622 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 623 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 624 | "dev": true, 625 | "requires": { 626 | "prelude-ls": "~1.1.2" 627 | } 628 | }, 629 | "type-name": { 630 | "version": "1.0.1", 631 | "resolved": "https://registry.npmjs.org/type-name/-/type-name-1.0.1.tgz", 632 | "integrity": "sha1-Sa+OZmNoLHqlAdymgy2QwC688bI=", 633 | "dev": true 634 | }, 635 | "wordwrap": { 636 | "version": "1.0.0", 637 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 638 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 639 | "dev": true 640 | }, 641 | "xtend": { 642 | "version": "4.0.1", 643 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 644 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", 645 | "dev": true 646 | } 647 | } 648 | } 649 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "multi-stage-sourcemap", 3 | "description": "multi-level sourcemap", 4 | "version": "0.3.1", 5 | "homepage": "https://github.com/azu/multi-stage-sourcemap/", 6 | "keywords": [ 7 | "sourcemap", 8 | "source-map" 9 | ], 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/azu/multi-stage-sourcemap.git" 13 | }, 14 | "main": "index.js", 15 | "files": [ 16 | "index.js", 17 | "lib" 18 | ], 19 | "scripts": { 20 | "test": "mocha test/*.js" 21 | }, 22 | "directories": { 23 | "test": "test/" 24 | }, 25 | "author": "azu", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/azu/multi-stage-sourcemap/issues" 29 | }, 30 | "dependencies": { 31 | "source-map": "^0.1.34" 32 | }, 33 | "devDependencies": { 34 | "coffee-script": "^1.7.1", 35 | "convert-source-map": "^0.3.4", 36 | "escodegen": "^1.3.3", 37 | "esmangle": "^1.0.1", 38 | "espower-loader": "^0.8.0", 39 | "esprima": "^1.2.2", 40 | "intelli-espower-loader": "^0.3.0", 41 | "mocha": "^1.21.4", 42 | "power-assert": "^0.8.0" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --require intelli-espower-loader -------------------------------------------------------------------------------- /test/multi-stage-sourcemap-test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var assert = require("power-assert"); 3 | var sourceMap = require("source-map"); 4 | var Generator = sourceMap.SourceMapGenerator; 5 | var Consumer = sourceMap.SourceMapConsumer; 6 | var transfer = require("../lib/multi-stage-sourcemap"); 7 | describe("multi-stage-sourcemap", function () { 8 | var middleSource; 9 | var lastSource; 10 | beforeEach(function () { 11 | // origin -> middle 12 | middleSource = (function () { 13 | var gen = new Generator({ 14 | file: 'middle.js', 15 | sourceRoot: '/path/to/root' 16 | }); 17 | gen.addMapping({ 18 | source: 'original.js', 19 | original: { line: 1, column: 0 }, 20 | generated: { line: 2, column: 2 }, 21 | name: 'foo' 22 | }); 23 | gen.setSourceContent('original.js', 'alert("Hello World");'); 24 | return gen.toString(); 25 | })(); 26 | // middle -> last 27 | lastSource = (function () { 28 | var gen = new Generator({ 29 | file: 'last.js', 30 | sourceRoot: '/path/to/root' 31 | }); 32 | gen.addMapping({ 33 | source: 'middle.js', 34 | original: { line: 2, column: 2 }, 35 | generated: { line: 4, column: 4 }, 36 | name: 'bar' 37 | }); 38 | return gen.toString(); 39 | })(); 40 | 41 | }); 42 | it("should convert js", function () { 43 | // map result to origin 44 | var resultMap = transfer({fromSourceMap: lastSource, toSourceMap: middleSource}); 45 | var resultSMC = new Consumer(resultMap); 46 | var originalPosition = resultSMC.originalPositionFor({ 47 | line: 4, 48 | column: 4 49 | }); 50 | assert.equal(originalPosition.source, '/path/to/root/original.js'); 51 | assert.equal(originalPosition.line, 1); 52 | assert.equal(originalPosition.column, 0); 53 | assert.equal( 54 | resultSMC.sourceContentFor(originalPosition.source), 55 | 'alert(\"Hello World\");' 56 | ); 57 | }); 58 | }); --------------------------------------------------------------------------------