├── .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 [](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 | 
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 | 
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 | 
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 | });
--------------------------------------------------------------------------------