react app

This commit is contained in:
Mario Romano
2016-04-06 17:52:19 +01:00
parent f7e6ef55a2
commit 29df96a085
4425 changed files with 446323 additions and 0 deletions

1
react-app/node_modules/source-map-support/.npmignore generated vendored Normal file
View File

@@ -0,0 +1 @@
browserify-test/

21
react-app/node_modules/source-map-support/LICENSE.md generated vendored Normal file
View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Evan Wallace
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

165
react-app/node_modules/source-map-support/README.md generated vendored Normal file
View File

@@ -0,0 +1,165 @@
# Source Map Support
This module provides source map support for stack traces in node via the [V8 stack trace API](http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi). It uses the [source-map](https://github.com/mozilla/source-map) module to replace the paths and line numbers of source-mapped files with their original paths and line numbers. The output mimics node's stack trace format with the goal of making every compile-to-JS language more of a first-class citizen. Source maps are completely general (not specific to any one language) so you can use source maps with multiple compile-to-JS languages in the same node process.
## Installation and Usage
#### Node support
npm install source-map-support
Source maps can be generated using libraries such as [source-map-index-generator](https://github.com/twolfson/source-map-index-generator). Once you have a valid source map, insert the following two lines at the top of your compiled code:
//# sourceMappingURL=path/to/source.map
require('source-map-support').install();
The path should either be absolute or relative to the compiled file.
#### Browser support
This library also works in Chrome. While the DevTools console already supports source maps, the V8 engine doesn't and `Error.prototype.stack` will be incorrect without this library. Everything will just work if you deploy your source files using [browserify](http://browserify.org/). Just make sure to pass the `--debug` flag to the browserify command so your source maps are included in the bundled code.
This library also works if you use another build process or just include the source files directly. In this case, include the file `browser-source-map-support.js` in your page and call `sourceMapSupport.install()`. It contains the whole library already bundled for the browser using browserify.
<script src="browser-source-map-support.js"></script>
<script>sourceMapSupport.install();</script>
This library also works if you use AMD (Asynchronous Module Definition), which is used in tools like [RequireJS](http://requirejs.org/). Just list `browser-source-map-support` as a dependency:
<script>
define(['browser-source-map-support'], function(sourceMapSupport) {
sourceMapSupport.install();
});
</script>
## Options
This module installs two things: a change to the `stack` property on `Error` objects and a handler for uncaught exceptions that mimics node's default exception handler (the handler can be seen in the demos below). You may want to disable the handler if you have your own uncaught exception handler. This can be done by passing an argument to the installer:
require('source-map-support').install({
handleUncaughtExceptions: false
});
This module loads source maps from the filesystem by default. You can provide alternate loading behavior through a callback as shown below. For example, [Meteor](https://github.com/meteor) keeps all source maps cached in memory to avoid disk access.
require('source-map-support').install({
retrieveSourceMap: function(source) {
if (source === 'compiled.js') {
return {
url: 'original.js',
map: fs.readFileSync('compiled.js.map', 'utf8')
};
}
return null;
}
});
## Demos
#### Basic Demo
original.js:
throw new Error('test'); // This is the original code
compiled.js:
//# sourceMappingURL=compiled.js.map
require('source-map-support').install();
throw new Error('test'); // This is the compiled code
compiled.js.map:
{
"version": 3,
"file": "compiled.js",
"sources": ["original.js"],
"names": [],
"mappings": ";;;AAAA,MAAM,IAAI"
}
Run compiled.js using node (notice how the stack trace uses original.js instead of compiled.js):
$ node compiled.js
original.js:1
throw new Error('test'); // This is the original code
^
Error: test
at Object.<anonymous> (original.js:1:7)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3
#### TypeScript Demo
demo.ts:
declare function require(name: string);
require('source-map-support').install();
class Foo {
constructor() { this.bar(); }
bar() { throw new Error('this is a demo'); }
}
new Foo();
Compile and run the file using the TypeScript compiler from the terminal:
$ npm install source-map-support typescript
$ node_modules/typescript/bin/tsc -sourcemap demo.ts
$ node demo.js
demo.ts:5
bar() { throw new Error('this is a demo'); }
^
Error: this is a demo
at Foo.bar (demo.ts:5:17)
at new Foo (demo.ts:4:24)
at Object.<anonymous> (demo.ts:7:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:901:3
#### CoffeeScript Demo
demo.coffee:
require('source-map-support').install()
foo = ->
bar = -> throw new Error 'this is a demo'
bar()
foo()
Compile and run the file using the CoffeeScript compiler from the terminal:
$ npm install source-map-support coffee-script
$ node_modules/coffee-script/bin/coffee --map --compile demo.coffee
$ node demo.js
demo.coffee:3
bar = -> throw new Error 'this is a demo'
^
Error: this is a demo
at bar (demo.coffee:3:22)
at foo (demo.coffee:4:3)
at Object.<anonymous> (demo.coffee:5:1)
at Object.<anonymous> (demo.coffee:1:1)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
## License
This code is available under the [MIT license](http://opensource.org/licenses/MIT).

View File

@@ -0,0 +1,89 @@
/*
* Support for source maps in V8 stack traces
* https://github.com/evanw/node-source-map-support
*/
(this.define||function(K,O){this.sourceMapSupport=O()})("browser-source-map-support",function(K){(function h(r,m,e){function p(g,d){if(!m[g]){if(!r[g]){var k="function"==typeof require&&require;if(!d&&k)return k(g,!0);if(v)return v(g,!0);throw Error("Cannot find module '"+g+"'");}k=m[g]={exports:{}};r[g][0].call(k.exports,function(d){var c=r[g][1][d];return p(c?c:d)},k,k.exports,h,r,m,e)}return m[g].exports}for(var v="function"==typeof require&&require,A=0;A<e.length;A++)p(e[A]);return p})({1:[function(h,
r,m){K=h("./source-map-support")},{"./source-map-support":18}],2:[function(h,r,m){},{}],3:[function(h,r,m){function e(f,n,x){if(!(this instanceof e))return new e(f,n,x);var a=typeof f;if("base64"===n&&"string"===a)for(f=f.trim?f.trim():f.replace(/^\s+|\s+$/g,"");0!==f.length%4;)f+="=";var b;if("number"===a)b=w(f);else if("string"===a)b=e.byteLength(f,n);else if("object"===a)b=w(f.length);else throw Error("First argument needs to be a number, array or string.");var c;e._useTypedArrays?c=e._augment(new Uint8Array(b)):
(c=this,c.length=b,c._isBuffer=!0);if(e._useTypedArrays&&"number"===typeof f.byteLength)c._set(f);else{var d=f;if(y(d)||e.isBuffer(d)||d&&"object"===typeof d&&"number"===typeof d.length)for(n=0;n<b;n++)e.isBuffer(f)?c[n]=f.readUInt8(n):c[n]=f[n];else if("string"===a)c.write(f,0,n);else if("number"===a&&!e._useTypedArrays&&!x)for(n=0;n<b;n++)c[n]=0}return c}function p(f,n,x){var a="";for(x=Math.min(f.length,x);n<x;n++)a+=String.fromCharCode(f[n]);return a}function v(f,n,x,a){a||(q("boolean"===typeof x,
"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1<f.length,"Trying to read beyond buffer length"));a=f.length;if(!(n>=a))return x?(x=f[n],n+1<a&&(x|=f[n+1]<<8)):(x=f[n]<<8,n+1<a&&(x|=f[n+1])),x}function A(f,n,a,c){c||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3<f.length,"Trying to read beyond buffer length"));c=f.length;if(!(n>=c)){var b;a?(n+2<c&&(b=f[n+2]<<16),n+1<c&&(b|=f[n+1]<<8),b|=f[n],n+3<c&&(b+=f[n+3]<<24>>>0)):
(n+1<c&&(b=f[n+1]<<16),n+2<c&&(b|=f[n+2]<<8),n+3<c&&(b|=f[n+3]),b+=f[n]<<24>>>0);return b}}function g(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1<f.length,"Trying to read beyond buffer length"));if(!(n>=f.length))return f=v(f,n,a,!0),f&32768?-1*(65535-f+1):f}function d(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3<f.length,"Trying to read beyond buffer length"));if(!(n>=
f.length))return f=A(f,n,a,!0),f&2147483648?-1*(4294967295-f+1):f}function k(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+3<f.length,"Trying to read beyond buffer length"));return I.read(f,n,a,23,4)}function l(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+7<f.length,"Trying to read beyond buffer length"));return I.read(f,n,a,52,8)}function c(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==
a&&null!==a,"missing offset"),q(a+1<f.length,"trying to write beyond buffer length"),L(n,65535));var d=f.length;if(!(a>=d))for(c=0,d=Math.min(d-a,2);c<d;c++)f[a+c]=(n&255<<8*(b?c:1-c))>>>8*(b?c:1-c)}function a(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3<f.length,"trying to write beyond buffer length"),L(n,4294967295));var d=f.length;if(!(a>=d))for(c=0,d=Math.min(d-a,4);c<d;c++)f[a+c]=n>>>
8*(b?c:3-c)&255}function b(f,n,a,b,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+1<f.length,"Trying to write beyond buffer length"),M(n,32767,-32768));a>=f.length||(0<=n?c(f,n,a,b,d):c(f,65535+n+1,a,b,d))}function z(f,n,b,c,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof c,"missing or invalid endian"),q(void 0!==b&&null!==b,"missing offset"),q(b+3<f.length,"Trying to write beyond buffer length"),
M(n,2147483647,-2147483648));b>=f.length||(0<=n?a(f,n,b,c,d):a(f,4294967295+n+1,b,c,d))}function D(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3<f.length,"Trying to write beyond buffer length"),N(n,3.4028234663852886E38,-3.4028234663852886E38));a>=f.length||I.write(f,n,a,b,23,4)}function B(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),
q(void 0!==a&&null!==a,"missing offset"),q(a+7<f.length,"Trying to write beyond buffer length"),N(n,1.7976931348623157E308,-1.7976931348623157E308));a>=f.length||I.write(f,n,a,b,52,8)}function E(f,a,b){if("number"!==typeof f)return b;f=~~f;if(f>=a)return a;if(0<=f)return f;f+=a;return 0<=f?f:0}function w(f){f=~~Math.ceil(+f);return 0>f?0:f}function y(f){return(Array.isArray||function(f){return"[object Array]"===Object.prototype.toString.call(f)})(f)}function H(f){return 16>f?"0"+f.toString(16):f.toString(16)}
function t(f){for(var a=[],b=0;b<f.length;b++){var c=f.charCodeAt(b);if(127>=c)a.push(f.charCodeAt(b));else{var d=b;55296<=c&&57343>=c&&b++;c=encodeURIComponent(f.slice(d,b+1)).substr(1).split("%");for(d=0;d<c.length;d++)a.push(parseInt(c[d],16))}}return a}function F(f){for(var a=[],b=0;b<f.length;b++)a.push(f.charCodeAt(b)&255);return a}function C(f,a,b,c){for(var d=0;d<c&&!(d+b>=a.length||d>=f.length);d++)a[d+b]=f[d];return d}function G(f){try{return decodeURIComponent(f)}catch(a){return String.fromCharCode(65533)}}
function L(f,a){q("number"===typeof f,"cannot write a non-number as a number");q(0<=f,"specified a negative value for writing an unsigned value");q(f<=a,"value is larger than maximum value for type");q(Math.floor(f)===f,"value has a fractional component")}function M(f,a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value");q(Math.floor(f)===f,"value has a fractional component")}function N(f,
a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value")}function q(f,a){if(!f)throw Error(a||"Failed assertion");}var J=h("base64-js"),I=h("ieee754");m.Buffer=e;m.SlowBuffer=e;m.INSPECT_MAX_BYTES=50;e.poolSize=8192;e._useTypedArrays=function(){try{var f=new ArrayBuffer(0),a=new Uint8Array(f);a.foo=function(){return 42};return 42===a.foo()&&"function"===typeof a.subarray}catch(b){return!1}}();
e.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};e.isBuffer=function(f){return!(null===f||void 0===f||!f._isBuffer)};e.byteLength=function(f,a){var b;f+="";switch(a||"utf8"){case "hex":b=f.length/2;break;case "utf8":case "utf-8":b=t(f).length;break;case "ascii":case "binary":case "raw":b=f.length;break;case "base64":b=J.toByteArray(f).length;
break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;default:throw Error("Unknown encoding");}return b};e.concat=function(f,a){q(y(f),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array.");if(0===f.length)return new e(0);if(1===f.length)return f[0];var b;if("number"!==typeof a)for(b=a=0;b<f.length;b++)a+=f[b].length;var c=new e(a),d=0;for(b=0;b<f.length;b++){var k=f[b];k.copy(c,d);d+=k.length}return c};e.prototype.write=function(f,a,b,c){if(isFinite(a))isFinite(b)||
(c=b,b=void 0);else{var d=c;c=a;a=b;b=d}a=Number(a)||0;d=this.length-a;b?(b=Number(b),b>d&&(b=d)):b=d;c=String(c||"utf8").toLowerCase();switch(c){case "hex":a=Number(a)||0;c=this.length-a;b?(b=Number(b),b>c&&(b=c)):b=c;c=f.length;q(0===c%2,"Invalid hex string");b>c/2&&(b=c/2);for(c=0;c<b;c++)d=parseInt(f.substr(2*c,2),16),q(!isNaN(d),"Invalid hex string"),this[a+c]=d;e._charsWritten=2*c;f=c;break;case "utf8":case "utf-8":f=e._charsWritten=C(t(f),this,a,b);break;case "ascii":f=e._charsWritten=C(F(f),
this,a,b);break;case "binary":f=e._charsWritten=C(F(f),this,a,b);break;case "base64":f=e._charsWritten=C(J.toByteArray(f),this,a,b);break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":for(var k,d=[],l=0;l<f.length;l++)k=f.charCodeAt(l),c=k>>8,k%=256,d.push(k),d.push(c);f=e._charsWritten=C(d,this,a,b);break;default:throw Error("Unknown encoding");}return f};e.prototype.toString=function(f,a,b){f=String(f||"utf8").toLowerCase();a=Number(a)||0;b=void 0!==b?Number(b):b=this.length;if(b===a)return"";
switch(f){case "hex":f=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;for(a="";f<b;f++)a+=H(this[f]);b=a;break;case "utf8":case "utf-8":var c=a;a=f="";for(b=Math.min(this.length,b);c<b;c++)127>=this[c]?(f+=G(a)+String.fromCharCode(this[c]),a=""):a+="%"+this[c].toString(16);b=f+G(a);break;case "ascii":b=p(this,a,b);break;case "binary":b=p(this,a,b);break;case "base64":f=a;b=0===f&&b===this.length?J.fromByteArray(this):J.fromByteArray(this.slice(f,b));break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=
this.slice(a,b);f="";for(a=0;a<b.length;a+=2)f+=String.fromCharCode(b[a]+256*b[a+1]);b=f;break;default:throw Error("Unknown encoding");}return b};e.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};e.prototype.copy=function(a,b,c,d){c||(c=0);d||0===d||(d=this.length);b||(b=0);if(d!==c&&0!==a.length&&0!==this.length)if(q(d>=c,"sourceEnd < sourceStart"),q(0<=b&&b<a.length,"targetStart out of bounds"),q(0<=c&&c<this.length,"sourceStart out of bounds"),
q(0<=d&&d<=this.length,"sourceEnd out of bounds"),d>this.length&&(d=this.length),a.length-b<d-c&&(d=a.length-b+c),d-=c,100>d||!e._useTypedArrays)for(var k=0;k<d;k++)a[k+b]=this[k+c];else a._set(this.subarray(c,c+d),b)};e.prototype.slice=function(a,b){var c=this.length;a=E(a,c,0);b=E(b,c,c);if(e._useTypedArrays)return e._augment(this.subarray(a,b));for(var c=b-a,d=new e(c,void 0,!0),k=0;k<c;k++)d[k]=this[k+a];return d};e.prototype.get=function(a){console.log(".get() is deprecated. Access using array indexes instead.");
return this.readUInt8(a)};e.prototype.set=function(a,b){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(a,b)};e.prototype.readUInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a<this.length,"Trying to read beyond buffer length"));if(!(a>=this.length))return this[a]};e.prototype.readUInt16LE=function(a,b){return v(this,a,!0,b)};e.prototype.readUInt16BE=function(a,b){return v(this,a,!1,b)};e.prototype.readUInt32LE=function(a,b){return A(this,
a,!0,b)};e.prototype.readUInt32BE=function(a,b){return A(this,a,!1,b)};e.prototype.readInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a<this.length,"Trying to read beyond buffer length"));if(!(a>=this.length))return this[a]&128?-1*(255-this[a]+1):this[a]};e.prototype.readInt16LE=function(a,b){return g(this,a,!0,b)};e.prototype.readInt16BE=function(a,b){return g(this,a,!1,b)};e.prototype.readInt32LE=function(a,b){return d(this,a,!0,b)};e.prototype.readInt32BE=function(a,b){return d(this,
a,!1,b)};e.prototype.readFloatLE=function(a,b){return k(this,a,!0,b)};e.prototype.readFloatBE=function(a,b){return k(this,a,!1,b)};e.prototype.readDoubleLE=function(a,b){return l(this,a,!0,b)};e.prototype.readDoubleBE=function(a,b){return l(this,a,!1,b)};e.prototype.writeUInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b<this.length,"trying to write beyond buffer length"),L(a,255));b>=this.length||(this[b]=a)};e.prototype.writeUInt16LE=function(a,
b,d){c(this,a,b,!0,d)};e.prototype.writeUInt16BE=function(a,b,d){c(this,a,b,!1,d)};e.prototype.writeUInt32LE=function(b,c,d){a(this,b,c,!0,d)};e.prototype.writeUInt32BE=function(b,c,d){a(this,b,c,!1,d)};e.prototype.writeInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b<this.length,"Trying to write beyond buffer length"),M(a,127,-128));b>=this.length||(0<=a?this.writeUInt8(a,b,c):this.writeUInt8(255+a+1,b,c))};e.prototype.writeInt16LE=function(a,
c,d){b(this,a,c,!0,d)};e.prototype.writeInt16BE=function(a,c,d){b(this,a,c,!1,d)};e.prototype.writeInt32LE=function(a,b,c){z(this,a,b,!0,c)};e.prototype.writeInt32BE=function(a,b,c){z(this,a,b,!1,c)};e.prototype.writeFloatLE=function(a,b,c){D(this,a,b,!0,c)};e.prototype.writeFloatBE=function(a,b,c){D(this,a,b,!1,c)};e.prototype.writeDoubleLE=function(a,b,c){B(this,a,b,!0,c)};e.prototype.writeDoubleBE=function(a,b,c){B(this,a,b,!1,c)};e.prototype.fill=function(a,b,c){a||(a=0);b||(b=0);c||(c=this.length);
"string"===typeof a&&(a=a.charCodeAt(0));q("number"===typeof a&&!isNaN(a),"value is not a number");q(c>=b,"end < start");if(c!==b&&0!==this.length)for(q(0<=b&&b<this.length,"start out of bounds"),q(0<=c&&c<=this.length,"end out of bounds");b<c;b++)this[b]=a};e.prototype.inspect=function(){for(var a=[],b=this.length,c=0;c<b;c++)if(a[c]=H(this[c]),c===m.INSPECT_MAX_BYTES){a[c+1]="...";break}return"<Buffer "+a.join(" ")+">"};e.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(e._useTypedArrays)return(new e(this)).buffer;
for(var a=new Uint8Array(this.length),b=0,c=a.length;b<c;b+=1)a[b]=this[b];return a.buffer}throw Error("Buffer.toArrayBuffer not supported in this browser");};var u=e.prototype;e._augment=function(a){a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=u.get;a.set=u.set;a.write=u.write;a.toString=u.toString;a.toLocaleString=u.toString;a.toJSON=u.toJSON;a.copy=u.copy;a.slice=u.slice;a.readUInt8=u.readUInt8;a.readUInt16LE=u.readUInt16LE;a.readUInt16BE=u.readUInt16BE;a.readUInt32LE=u.readUInt32LE;a.readUInt32BE=
u.readUInt32BE;a.readInt8=u.readInt8;a.readInt16LE=u.readInt16LE;a.readInt16BE=u.readInt16BE;a.readInt32LE=u.readInt32LE;a.readInt32BE=u.readInt32BE;a.readFloatLE=u.readFloatLE;a.readFloatBE=u.readFloatBE;a.readDoubleLE=u.readDoubleLE;a.readDoubleBE=u.readDoubleBE;a.writeUInt8=u.writeUInt8;a.writeUInt16LE=u.writeUInt16LE;a.writeUInt16BE=u.writeUInt16BE;a.writeUInt32LE=u.writeUInt32LE;a.writeUInt32BE=u.writeUInt32BE;a.writeInt8=u.writeInt8;a.writeInt16LE=u.writeInt16LE;a.writeInt16BE=u.writeInt16BE;
a.writeInt32LE=u.writeInt32LE;a.writeInt32BE=u.writeInt32BE;a.writeFloatLE=u.writeFloatLE;a.writeFloatBE=u.writeFloatBE;a.writeDoubleLE=u.writeDoubleLE;a.writeDoubleBE=u.writeDoubleBE;a.fill=u.fill;a.inspect=u.inspect;a.toArrayBuffer=u.toArrayBuffer;return a}},{"base64-js":4,ieee754:5}],4:[function(h,r,m){(function(e){function p(e){e=e.charCodeAt(0);if(43===e)return 62;if(47===e)return 63;if(48>e)return-1;if(58>e)return e-48+52;if(91>e)return e-65;if(123>e)return e-97+26}var v="undefined"!==typeof Uint8Array?
Uint8Array:Array;e.toByteArray=function(e){function g(c){a[b++]=c}var d,k,l,c,a;if(0<e.length%4)throw Error("Invalid string. Length must be a multiple of 4");d=e.length;c="="===e.charAt(d-2)?2:"="===e.charAt(d-1)?1:0;a=new v(3*e.length/4-c);k=0<c?e.length-4:e.length;var b=0;for(d=0;d<k;d+=4)l=p(e.charAt(d))<<18|p(e.charAt(d+1))<<12|p(e.charAt(d+2))<<6|p(e.charAt(d+3)),g((l&16711680)>>16),g((l&65280)>>8),g(l&255);2===c?(l=p(e.charAt(d))<<2|p(e.charAt(d+1))>>4,g(l&255)):1===c&&(l=p(e.charAt(d))<<10|
p(e.charAt(d+1))<<4|p(e.charAt(d+2))>>2,g(l>>8&255),g(l&255));return a};e.fromByteArray=function(e){var g,d=e.length%3,k="",l,c;g=0;for(c=e.length-d;g<c;g+=3)l=(e[g]<<16)+(e[g+1]<<8)+e[g+2],l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l&
63),k+=l;switch(d){case 1:l=e[e.length-1];k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>2);k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<4&63);k+="==";break;case 2:l=(e[e.length-2]<<8)+e[e.length-1],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>10),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>4&63),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<
2&63),k+="="}return k}})("undefined"===typeof m?this.base64js={}:m)},{}],5:[function(h,r,m){m.read=function(e,p,v,h,g){var d;d=8*g-h-1;var k=(1<<d)-1,l=k>>1,c=-7;g=v?g-1:0;var a=v?-1:1,b=e[p+g];g+=a;v=b&(1<<-c)-1;b>>=-c;for(c+=d;0<c;v=256*v+e[p+g],g+=a,c-=8);d=v&(1<<-c)-1;v>>=-c;for(c+=h;0<c;d=256*d+e[p+g],g+=a,c-=8);if(0===v)v=1-l;else{if(v===k)return d?NaN:Infinity*(b?-1:1);d+=Math.pow(2,h);v-=l}return(b?-1:1)*d*Math.pow(2,v-h)};m.write=function(e,p,v,h,g,d){var k,l=8*d-g-1,c=(1<<l)-1,a=c>>1,b=
23===g?Math.pow(2,-24)-Math.pow(2,-77):0;d=h?0:d-1;var z=h?1:-1,D=0>p||0===p&&0>1/p?1:0;p=Math.abs(p);isNaN(p)||Infinity===p?(p=isNaN(p)?1:0,h=c):(h=Math.floor(Math.log(p)/Math.LN2),1>p*(k=Math.pow(2,-h))&&(h--,k*=2),p=1<=h+a?p+b/k:p+b*Math.pow(2,1-a),2<=p*k&&(h++,k/=2),h+a>=c?(p=0,h=c):1<=h+a?(p=(p*k-1)*Math.pow(2,g),h+=a):(p=p*Math.pow(2,a-1)*Math.pow(2,g),h=0));for(;8<=g;e[v+d]=p&255,d+=z,p/=256,g-=8);h=h<<g|p;for(l+=g;0<l;e[v+d]=h&255,d+=z,h/=256,l-=8);e[v+d-z]|=128*D}},{}],6:[function(h,r,m){function e(){}
h=r.exports={};h.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(e){return window.setImmediate(e)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var e=[];window.addEventListener("message",function(h){var m=h.source;m!==window&&null!==m||"process-tick"!==h.data||(h.stopPropagation(),0<e.length&&e.shift()())},!0);return function(h){e.push(h);window.postMessage("process-tick","*")}}return function(e){setTimeout(e,0)}}();h.title="browser";
h.browser=!0;h.env={};h.argv=[];h.on=e;h.once=e;h.off=e;h.emit=e;h.binding=function(e){throw Error("process.binding is not supported");};h.cwd=function(){return"/"};h.chdir=function(e){throw Error("process.chdir is not supported");}},{}],7:[function(h,r,m){(function(e){function h(d,k){for(var e=0,c=d.length-1;0<=c;c--){var a=d[c];"."===a?d.splice(c,1):".."===a?(d.splice(c,1),e++):e&&(d.splice(c,1),e--)}if(k)for(;e--;e)d.unshift("..");return d}function v(d,k){if(d.filter)return d.filter(k);for(var e=
[],c=0;c<d.length;c++)k(d[c],c,d)&&e.push(d[c]);return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;m.resolve=function(){for(var d="",k=!1,l=arguments.length-1;-1<=l&&!k;l--){var c=0<=l?arguments[l]:e.cwd();if("string"!==typeof c)throw new TypeError("Arguments to path.resolve must be strings");c&&(d=c+"/"+d,k="/"===c.charAt(0))}d=h(v(d.split("/"),function(a){return!!a}),!k).join("/");return(k?"/":"")+d||"."};m.normalize=function(d){var e=m.isAbsolute(d),l="/"===g(d,-1);
(d=h(v(d.split("/"),function(c){return!!c}),!e).join("/"))||e||(d=".");d&&l&&(d+="/");return(e?"/":"")+d};m.isAbsolute=function(d){return"/"===d.charAt(0)};m.join=function(){var d=Array.prototype.slice.call(arguments,0);return m.normalize(v(d,function(d,e){if("string"!==typeof d)throw new TypeError("Arguments to path.join must be strings");return d}).join("/"))};m.relative=function(d,e){function l(a){for(var b=0;b<a.length&&""===a[b];b++);for(var c=a.length-1;0<=c&&""===a[c];c--);return b>c?[]:a.slice(b,
c-b+1)}d=m.resolve(d).substr(1);e=m.resolve(e).substr(1);for(var c=l(d.split("/")),a=l(e.split("/")),b=Math.min(c.length,a.length),g=b,h=0;h<b;h++)if(c[h]!==a[h]){g=h;break}b=[];for(h=g;h<c.length;h++)b.push("..");b=b.concat(a.slice(g));return b.join("/")};m.sep="/";m.delimiter=":";m.dirname=function(d){var e=r.exec(d).slice(1);d=e[0];e=e[1];if(!d&&!e)return".";e&&(e=e.substr(0,e.length-1));return d+e};m.basename=function(d,e){var l=r.exec(d).slice(1)[2];e&&l.substr(-1*e.length)===e&&(l=l.substr(0,
l.length-e.length));return l};m.extname=function(d){return r.exec(d).slice(1)[3]};var g="b"==="ab".substr(-1)?function(d,e,l){return d.substr(e,l)}:function(d,e,l){0>e&&(e=d.length+e);return d.substr(e,l)}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6}],8:[function(h,r,m){m.SourceMapGenerator=h("./source-map/source-map-generator").SourceMapGenerator;
m.SourceMapConsumer=h("./source-map/source-map-consumer").SourceMapConsumer;m.SourceNode=h("./source-map/source-node").SourceNode},{"./source-map/source-map-consumer":13,"./source-map/source-map-generator":14,"./source-map/source-node":15}],9:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(){this._array=[];this._set={}}var d=e("./util");g.fromArray=function(d,e){for(var c=new g,a=0,b=d.length;a<b;a++)c.add(d[a],e);return c};g.prototype.add=function(e,
l){var c=this.has(e),a=this._array.length;c&&!l||this._array.push(e);c||(this._set[d.toSetString(e)]=a)};g.prototype.has=function(e){return Object.prototype.hasOwnProperty.call(this._set,d.toSetString(e))};g.prototype.indexOf=function(e){if(this.has(e))return this._set[d.toSetString(e)];throw Error('"'+e+'" is not in the set.');};g.prototype.at=function(d){if(0<=d&&d<this._array.length)return this._array[d];throw Error("No element indexed by "+d);};g.prototype.toArray=function(){return this._array.slice()};
h.ArraySet=g})},{"./util":16,amdefine:17}],10:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g=e("./base64");h.encode=function(d){var e="",l=0>d?(-d<<1)+1:(d<<1)+0;do d=l&31,l>>>=5,0<l&&(d|=32),e+=g.encode(d);while(0<l);return e};h.decode=function(d){var e=0,l=d.length,c=0,a=0,b,h;do{if(e>=l)throw Error("Expected more digits in base 64 VLQ value.");h=g.decode(d.charAt(e++));b=!!(h&32);h&=31;c+=h<<a;a+=5}while(b);l=c>>1;return{value:1===(c&1)?-l:l,rest:d.slice(e)}}})},
{"./base64":11,amdefine:17}],11:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g={},d={};"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").forEach(function(e,l){g[e]=l;d[l]=e});h.encode=function(e){if(e in d)return d[e];throw new TypeError("Must be between 0 and 63: "+e);};h.decode=function(d){if(d in g)return g[d];throw new TypeError("Not a valid base 64 digit: "+d);}})},{amdefine:17}],12:[function(h,r,m){if("function"!==typeof e)var e=
h("amdefine")(r,h);e(function(e,h,m){function g(d,e,l,c,a){var b=Math.floor((e-d)/2)+d,h=a(l,c[b],!0);return 0===h?c[b]:0<h?1<e-b?g(b,e,l,c,a):c[b]:1<b-d?g(d,b,l,c,a):0>d?null:c[d]}h.search=function(d,e,l){return 0<e.length?g(-1,e.length,d,e,l):null}})},{amdefine:17}],13:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(a){var b=a;"string"===typeof a&&(b=JSON.parse(a.replace(/^\)\]\}'/,"")));a=d.getArg(b,"version");var c=d.getArg(b,"sources"),e=d.getArg(b,
"names",[]),g=d.getArg(b,"sourceRoot",null),h=d.getArg(b,"sourcesContent",null),k=d.getArg(b,"mappings"),b=d.getArg(b,"file",null);if(a!=this._version)throw Error("Unsupported version: "+a);this._names=l.fromArray(e,!0);this._sources=l.fromArray(c,!0);this.sourceRoot=g;this.sourcesContent=h;this._mappings=k;this.file=b}var d=e("./util"),k=e("./binary-search"),l=e("./array-set").ArraySet,c=e("./base64-vlq");g.fromSourceMap=function(a){var b=Object.create(g.prototype);b._names=l.fromArray(a._names.toArray(),
!0);b._sources=l.fromArray(a._sources.toArray(),!0);b.sourceRoot=a._sourceRoot;b.sourcesContent=a._generateSourcesContent(b._sources.toArray(),b.sourceRoot);b.file=a._file;b.__generatedMappings=a._mappings.slice().sort(d.compareByGeneratedPositions);b.__originalMappings=a._mappings.slice().sort(d.compareByOriginalPositions);return b};g.prototype._version=3;Object.defineProperty(g.prototype,"sources",{get:function(){return this._sources.toArray().map(function(a){return this.sourceRoot?d.join(this.sourceRoot,
a):a},this)}});g.prototype.__generatedMappings=null;Object.defineProperty(g.prototype,"_generatedMappings",{get:function(){this.__generatedMappings||(this.__generatedMappings=[],this.__originalMappings=[],this._parseMappings(this._mappings,this.sourceRoot));return this.__generatedMappings}});g.prototype.__originalMappings=null;Object.defineProperty(g.prototype,"_originalMappings",{get:function(){this.__originalMappings||(this.__generatedMappings=[],this.__originalMappings=[],this._parseMappings(this._mappings,
this.sourceRoot));return this.__originalMappings}});g.prototype._parseMappings=function(a,b){for(var e=1,g=0,l=0,h=0,k=0,y=0,m=/^[,;]/,t=a,p;0<t.length;)if(";"===t.charAt(0))e++,t=t.slice(1),g=0;else if(","===t.charAt(0))t=t.slice(1);else{p={};p.generatedLine=e;t=c.decode(t);p.generatedColumn=g+t.value;g=p.generatedColumn;t=t.rest;if(0<t.length&&!m.test(t.charAt(0))){t=c.decode(t);p.source=this._sources.at(k+t.value);k+=t.value;t=t.rest;if(0===t.length||m.test(t.charAt(0)))throw Error("Found a source, but no line and column");
t=c.decode(t);p.originalLine=l+t.value;l=p.originalLine;p.originalLine+=1;t=t.rest;if(0===t.length||m.test(t.charAt(0)))throw Error("Found a source and line, but no column");t=c.decode(t);p.originalColumn=h+t.value;h=p.originalColumn;t=t.rest;0<t.length&&!m.test(t.charAt(0))&&(t=c.decode(t),p.name=this._names.at(y+t.value),y+=t.value,t=t.rest)}this.__generatedMappings.push(p);"number"===typeof p.originalLine&&this.__originalMappings.push(p)}this.__generatedMappings.sort(d.compareByGeneratedPositions);
this.__originalMappings.sort(d.compareByOriginalPositions)};g.prototype._findMapping=function(a,b,c,d,e){if(0>=a[c])throw new TypeError("Line must be greater than or equal to 1, got "+a[c]);if(0>a[d])throw new TypeError("Column must be greater than or equal to 0, got "+a[d]);return k.search(a,b,e)};g.prototype.originalPositionFor=function(a){a={generatedLine:d.getArg(a,"line"),generatedColumn:d.getArg(a,"column")};if(a=this._findMapping(a,this._generatedMappings,"generatedLine","generatedColumn",
d.compareByGeneratedPositions)){var b=d.getArg(a,"source",null);b&&this.sourceRoot&&(b=d.join(this.sourceRoot,b));return{source:b,line:d.getArg(a,"originalLine",null),column:d.getArg(a,"originalColumn",null),name:d.getArg(a,"name",null)}}return{source:null,line:null,column:null,name:null}};g.prototype.sourceContentFor=function(a){if(!this.sourcesContent)return null;this.sourceRoot&&(a=d.relative(this.sourceRoot,a));if(this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];var b;
if(this.sourceRoot&&(b=d.urlParse(this.sourceRoot))){var c=a.replace(/^file:\/\//,"");if("file"==b.scheme&&this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];if((!b.path||"/"==b.path)&&this._sources.has("/"+a))return this.sourcesContent[this._sources.indexOf("/"+a)]}throw Error('"'+a+'" is not in the SourceMap.');};g.prototype.generatedPositionFor=function(a){a={source:d.getArg(a,"source"),originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};this.sourceRoot&&
(a.source=d.relative(this.sourceRoot,a.source));return(a=this._findMapping(a,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions))?{line:d.getArg(a,"generatedLine",null),column:d.getArg(a,"generatedColumn",null)}:{line:null,column:null}};g.GENERATED_ORDER=1;g.ORIGINAL_ORDER=2;g.prototype.eachMapping=function(a,b,c){b=b||null;switch(c||g.GENERATED_ORDER){case g.GENERATED_ORDER:c=this._generatedMappings;break;case g.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration.");
}var e=this.sourceRoot;c.map(function(a){var b=a.source;b&&e&&(b=d.join(e,b));return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,originalLine:a.originalLine,originalColumn:a.originalColumn,name:a.name}}).forEach(a,b)};h.SourceMapConsumer=g})},{"./array-set":9,"./base64-vlq":10,"./binary-search":12,"./util":16,amdefine:17}],14:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(c){this._file=k.getArg(c,"file");this._sourceRoot=
k.getArg(c,"sourceRoot",null);this._sources=new l;this._names=new l;this._mappings=[];this._sourcesContents=null}var d=e("./base64-vlq"),k=e("./util"),l=e("./array-set").ArraySet;g.prototype._version=3;g.fromSourceMap=function(c){var a=c.sourceRoot,b=new g({file:c.file,sourceRoot:a});c.eachMapping(function(c){var d={generated:{line:c.generatedLine,column:c.generatedColumn}};c.source&&(d.source=c.source,a&&(d.source=k.relative(a,d.source)),d.original={line:c.originalLine,column:c.originalColumn},c.name&&
(d.name=c.name));b.addMapping(d)});c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.addMapping=function(c){var a=k.getArg(c,"generated"),b=k.getArg(c,"original",null),d=k.getArg(c,"source",null);c=k.getArg(c,"name",null);this._validateMapping(a,b,d,c);d&&!this._sources.has(d)&&this._sources.add(d);c&&!this._names.has(c)&&this._names.add(c);this._mappings.push({generatedLine:a.line,generatedColumn:a.column,originalLine:null!=b&&b.line,originalColumn:null!=
b&&b.column,source:d,name:c})};g.prototype.setSourceContent=function(c,a){var b=c;this._sourceRoot&&(b=k.relative(this._sourceRoot,b));null!==a?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[k.toSetString(b)]=a):(delete this._sourcesContents[k.toSetString(b)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};g.prototype.applySourceMap=function(c,a){a||(a=c.file);var b=this._sourceRoot;b&&(a=k.relative(b,a));var d=new l,e=new l;this._mappings.forEach(function(g){if(g.source===
a&&g.originalLine){var l=c.originalPositionFor({line:g.originalLine,column:g.originalColumn});null!==l.source&&(g.source=b?k.relative(b,l.source):l.source,g.originalLine=l.line,g.originalColumn=l.column,null!==l.name&&null!==g.name&&(g.name=l.name))}(l=g.source)&&!d.has(l)&&d.add(l);(g=g.name)&&!e.has(g)&&e.add(g)},this);this._sources=d;this._names=e;c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&(b&&(a=k.relative(b,a)),this.setSourceContent(a,d))},this)};g.prototype._validateMapping=
function(c,a,b,d){if(!(c&&"line"in c&&"column"in c&&0<c.line&&0<=c.column&&!a&&!b&&!d||c&&"line"in c&&"column"in c&&a&&"line"in a&&"column"in a&&0<c.line&&0<=c.column&&0<a.line&&0<=a.column&&b))throw Error("Invalid mapping: "+JSON.stringify({generated:c,source:b,original:a,name:d}));};g.prototype._serializeMappings=function(){var c=0,a=1,b=0,e=0,g=0,l=0,h="",w;this._mappings.sort(k.compareByGeneratedPositions);for(var y=0,p=this._mappings.length;y<p;y++){w=this._mappings[y];if(w.generatedLine!==a)for(c=
0;w.generatedLine!==a;)h+=";",a++;else if(0<y){if(!k.compareByGeneratedPositions(w,this._mappings[y-1]))continue;h+=","}h+=d.encode(w.generatedColumn-c);c=w.generatedColumn;w.source&&(h+=d.encode(this._sources.indexOf(w.source)-l),l=this._sources.indexOf(w.source),h+=d.encode(w.originalLine-1-e),e=w.originalLine-1,h+=d.encode(w.originalColumn-b),b=w.originalColumn,w.name&&(h+=d.encode(this._names.indexOf(w.name)-g),g=this._names.indexOf(w.name)))}return h};g.prototype._generateSourcesContent=function(c,
a){return c.map(function(b){if(!this._sourcesContents)return null;a&&(b=k.relative(a,b));b=k.toSetString(b);return Object.prototype.hasOwnProperty.call(this._sourcesContents,b)?this._sourcesContents[b]:null},this)};g.prototype.toJSON=function(){var c={version:this._version,file:this._file,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};this._sourceRoot&&(c.sourceRoot=this._sourceRoot);this._sourcesContents&&(c.sourcesContent=this._generateSourcesContent(c.sources,
c.sourceRoot));return c};g.prototype.toString=function(){return JSON.stringify(this)};h.SourceMapGenerator=g})},{"./array-set":9,"./base64-vlq":10,"./util":16,amdefine:17}],15:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(d,c,a,b,e){this.children=[];this.sourceContents={};this.line=void 0===d?null:d;this.column=void 0===c?null:c;this.source=void 0===a?null:a;this.name=void 0===e?null:e;null!=b&&this.add(b)}var d=e("./source-map-generator").SourceMapGenerator,
k=e("./util");g.fromStringWithSourceMap=function(d,c){function a(a,c){null===a||void 0===a.source?b.add(c):b.add(new g(a.originalLine,a.originalColumn,a.source,c,a.name))}var b=new g,e=d.split("\n"),h=1,k=0,p=null;c.eachMapping(function(c){if(null===p){for(;h<c.generatedLine;)b.add(e.shift()+"\n"),h++;if(k<c.generatedColumn){var d=e[0];b.add(d.substr(0,c.generatedColumn));e[0]=d.substr(c.generatedColumn);k=c.generatedColumn}}else{if(h<c.generatedLine){var g="";do g+=e.shift()+"\n",h++,k=0;while(h<
c.generatedLine);k<c.generatedColumn&&(d=e[0],g+=d.substr(0,c.generatedColumn),e[0]=d.substr(c.generatedColumn),k=c.generatedColumn)}else d=e[0],g=d.substr(0,c.generatedColumn-k),e[0]=d.substr(c.generatedColumn-k),k=c.generatedColumn;a(p,g)}p=c},this);a(p,e.join("\n"));c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.add=function(d){if(Array.isArray(d))d.forEach(function(c){this.add(c)},this);else if(d instanceof g||"string"===typeof d)d&&
this.children.push(d);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+d);return this};g.prototype.prepend=function(d){if(Array.isArray(d))for(var c=d.length-1;0<=c;c--)this.prepend(d[c]);else if(d instanceof g||"string"===typeof d)this.children.unshift(d);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+d);return this};g.prototype.walk=function(d){for(var c,a=0,b=this.children.length;a<b;a++)c=
this.children[a],c instanceof g?c.walk(d):""!==c&&d(c,{source:this.source,line:this.line,column:this.column,name:this.name})};g.prototype.join=function(d){var c,a,b=this.children.length;if(0<b){c=[];for(a=0;a<b-1;a++)c.push(this.children[a]),c.push(d);c.push(this.children[a]);this.children=c}return this};g.prototype.replaceRight=function(d,c){var a=this.children[this.children.length-1];a instanceof g?a.replaceRight(d,c):"string"===typeof a?this.children[this.children.length-1]=a.replace(d,c):this.children.push("".replace(d,
c));return this};g.prototype.setSourceContent=function(d,c){this.sourceContents[k.toSetString(d)]=c};g.prototype.walkSourceContents=function(d){for(var c=0,a=this.children.length;c<a;c++)this.children[c]instanceof g&&this.children[c].walkSourceContents(d);for(var b=Object.keys(this.sourceContents),c=0,a=b.length;c<a;c++)d(k.fromSetString(b[c]),this.sourceContents[b[c]])};g.prototype.toString=function(){var d="";this.walk(function(c){d+=c});return d};g.prototype.toStringWithSourceMap=function(e){var c=
"",a=1,b=0,g=new d(e),h=!1,k=null,p=null,w=null,m=null;this.walk(function(d,e){c+=d;null!==e.source&&null!==e.line&&null!==e.column?(k===e.source&&p===e.line&&w===e.column&&m===e.name||g.addMapping({source:e.source,original:{line:e.line,column:e.column},generated:{line:a,column:b},name:e.name}),k=e.source,p=e.line,w=e.column,m=e.name,h=!0):h&&(g.addMapping({generated:{line:a,column:b}}),k=null,h=!1);d.split("").forEach(function(c){"\n"===c?(a++,b=0):b++})});this.walkSourceContents(function(a,b){g.setSourceContent(a,
b)});return{code:c,map:g}};h.SourceNode=g})},{"./source-map-generator":14,"./util":16,amdefine:17}],16:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(a){return(a=a.match(l))?{scheme:a[1],auth:a[3],host:a[4],port:a[6],path:a[7]}:null}function d(a){var b=a.scheme+"://";a.auth&&(b+=a.auth+"@");a.host&&(b+=a.host);a.port&&(b+=":"+a.port);a.path&&(b+=a.path);return b}function k(a,b){var c=a||"",d=b||"";return(c>d)-(c<d)}h.getArg=function(a,b,c){if(b in a)return a[b];
if(3===arguments.length)return c;throw Error('"'+b+'" is a required argument.');};var l=/([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/,c=/^data:.+\,.+/;h.urlParse=g;h.urlGenerate=d;h.join=function(a,b){var e;return b.match(l)||b.match(c)?b:"/"===b.charAt(0)&&(e=g(a))?(e.path=b,d(e)):a.replace(/\/$/,"")+"/"+b};h.toSetString=function(a){return"$"+a};h.fromSetString=function(a){return a.substr(1)};h.relative=function(a,b){a=a.replace(/\/$/,"");var c=g(a);return"/"==b.charAt(0)&&c&&"/"==c.path?
b.slice(1):0===b.indexOf(a+"/")?b.substr(a.length+1):b};h.compareByOriginalPositions=function(a,b,c){var d;return(d=k(a.source,b.source))||(d=a.originalLine-b.originalLine)||(d=a.originalColumn-b.originalColumn)||c||(d=k(a.name,b.name))?d:(d=a.generatedLine-b.generatedLine)?d:a.generatedColumn-b.generatedColumn};h.compareByGeneratedPositions=function(a,b,c){var d;return(d=a.generatedLine-b.generatedLine)||(d=a.generatedColumn-b.generatedColumn)||c||(d=k(a.source,b.source))||(d=a.originalLine-b.originalLine)?
d:(d=a.originalColumn-b.originalColumn)?d:k(a.name,b.name)}})},{amdefine:17}],17:[function(h,r,m){(function(e,p){r.exports=function(m,r){function g(a,b){var c;if(a&&"."===a.charAt(0)&&b){c=b.split("/");c=c.slice(0,c.length-1);var d=c=c.concat(a.split("/")),e,g;for(e=0;d[e];e+=1)if(g=d[e],"."===g)d.splice(e,1),--e;else if(".."===g)if(1!==e||".."!==d[2]&&".."!==d[0])0<e&&(d.splice(e-1,2),e-=2);else break;a=c.join("/")}return a}function d(a){return function(b){return g(b,a)}}function k(a){function c(d){b[a]=
d}c.fromText=function(a,b){throw Error("amdefine does not implement load.fromText");};return c}function l(a,c,d){var e,g,h;if(a)g=b[a]={},h={id:a,uri:p,exports:g},e=B(r,g,h,a);else{if(z)throw Error("amdefine with no module ID cannot be called more than once per file.");z=!0;g=m.exports;h=m;e=B(r,g,h,m.id)}c&&(c=c.map(function(a){return e(a)}));c="function"===typeof d?d.apply(h.exports,c):d;void 0!==c&&(h.exports=c,a&&(b[a]=h.exports))}function c(b,c,d){Array.isArray(b)?(d=c,c=b,b=void 0):"string"!==
typeof b&&(d=b,b=c=void 0);c&&!Array.isArray(c)&&(d=c,c=void 0);c||(c=["require","exports","module"]);b?a[b]=[b,c,d]:l(b,c,d)}var a={},b={},z=!1,D=h("path"),B,E;B=function(a,b,c,d){function h(g,k){if("string"===typeof g)return E(a,b,c,g,d);g=g.map(function(e){return E(a,b,c,e,d)});e.nextTick(function(){k.apply(null,g)})}h.toUrl=function(a){return 0===a.indexOf(".")?g(a,D.dirname(c.filename)):a};return h};r=r||function(){return m.require.apply(m,arguments)};E=function(c,e,h,m,p){var r=m.indexOf("!"),
G=m;if(-1===r){m=g(m,p);if("require"===m)return B(c,e,h,p);if("exports"===m)return e;if("module"===m)return h;if(b.hasOwnProperty(m))return b[m];if(a[m])return l.apply(null,a[m]),b[m];if(c)return c(G);throw Error("No module with ID: "+m);}G=m.substring(0,r);m=m.substring(r+1,m.length);r=E(c,e,h,G,p);m=r.normalize?r.normalize(m,d(p)):g(m,p);b[m]||r.load(m,B(c,e,h,p),k(m),{});return b[m]};c.require=function(c){if(b[c])return b[c];if(a[c])return l.apply(null,a[c]),b[c]};c.amd={};return c}}).call(this,
h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),"/node_modules/source-map/node_modules/amdefine/amdefine.js")},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,path:7}],18:[function(h,r,m){(function(e,p){function r(){return"undefined"!==typeof window&&"function"===typeof XMLHttpRequest}function A(a){if(a in F)return F[a];try{if(r()){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);var c=4===b.readyState?
b.responseText:null}else c=y.readFileSync(a,"utf8")}catch(d){c=null}return F[a]=c}function g(a,b){if(!a)return b;var c=w.dirname(a),d=/^\w+:\/\/[^\/]*/.exec(c),d=d?d[0]:"";return d+w.resolve(c.slice(d.length),b)}function d(a){var b;a:{if(r()&&(b=new XMLHttpRequest,b.open("GET",a,!1),b.send(null),b=b.getResponseHeader("SourceMap")||b.getResponseHeader("X-SourceMap")))break a;b=A(a);b=(b=/\/\/[#@]\s*sourceMappingURL=(.*)\s*$/m.exec(b))?b[1]:null}if(!b)return null;"data:application/json;base64,"==b.slice(0,
29).toLowerCase()?(a=(new p(b.slice(29),"base64")).toString(),b=null):(b=g(a,b),a=A(b,"utf8"));return a?{url:b,map:a}:null}function k(a){var b=C[a.source];if(!b){var c=d(a.source);c?(b=C[a.source]={url:c.url,map:new E(c.map)},b.map.sourcesContent&&b.map.sources.forEach(function(a,c){var d=b.map.sourcesContent[c];if(d){var e=g(b.url,a);F[e]=d}})):b=C[a.source]={url:null,map:null}}return b&&b.map&&(c=b.map.originalPositionFor(a),null!==c.source)?(c.source=g(b.url,c.source),c):a}function l(a){var b=
/^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(a);return b?(a=k({source:b[2],line:b[3],column:b[4]-1}),"eval at "+b[1]+" ("+a.source+":"+a.line+":"+(a.column+1)+")"):(b=/^eval at ([^(]+) \((.+)\)$/.exec(a))?"eval at "+b[1]+" ("+l(b[2])+")":a}function c(){var a,b="";this.isNative()?b="native":(a=this.getScriptNameOrSourceURL(),!a&&this.isEval()&&(b=this.getEvalOrigin(),b+=", "),b=a?b+a:b+"<anonymous>",a=this.getLineNumber(),null!=a&&(b+=":"+a,(a=this.getColumnNumber())&&(b+=":"+a)));a="";var c=this.getFunctionName(),
d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?a+="new "+(c||"<anonymous>"):c?a+=c:(a+=b,d=!1);else{var e=this.getTypeName(),g=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(a+=e+"."),a+=c,g&&c.indexOf("."+g)!=c.length-g.length-1&&(a+=" [as "+g+"]")):a+=e+"."+(g||"<anonymous>")}d&&(a+=" ("+b+")");return a}function a(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=c;return b}function b(b){var c=
b.getFileName()||b.getScriptNameOrSourceURL();if(c){var d=k({source:c,line:b.getLineNumber(),column:b.getColumnNumber()-1});b=a(b);b.getFileName=function(){return d.source};b.getLineNumber=function(){return d.line};b.getColumnNumber=function(){return d.column+1};b.getScriptNameOrSourceURL=function(){return d.source};return b}var e=b.isEval()&&b.getEvalOrigin();e&&(e=l(e),b=a(b),b.getEvalOrigin=function(){return e});return b}function z(a,c){t&&(F={},C={});return a+c.map(function(a){return"\n at "+
b(a)}).join("")}function D(a){var b=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2],b=+b[3],d=F[a];!d&&y.existsSync(a)&&(d=y.readFileSync(a,"utf8"));if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return"\n"+a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function B(a){if(a&&a.stack){var b=D(a);null!==b&&console.log(b);console.log(a.stack)}else console.log("Uncaught exception:",a);e.exit(1)}var E=h("source-map").SourceMapConsumer,w=h("path"),y=h("fs"),H=!1,t=!1,F={},C=
{};m.wrapCallSite=b;m.getErrorSource=D;m.mapSourcePosition=k;m.retrieveSourceMap=d;m.install=function(a){if(!H){H=!0;Error.prepareStackTrace=z;a=a||{};var b="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;t="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1;a.retrieveFile&&(A=a.retrieveFile);a.retrieveSourceMap&&(d=a.retrieveSourceMap);if(b&&!r())e.on("uncaughtException",B)}}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),
h("buffer").Buffer)},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,buffer:3,fs:2,path:7,"source-map":8}]},{},[1]);return K});

View File

@@ -0,0 +1,6 @@
<p>
Make sure to run build.js.
This test should say either "Test failed" or "Test passed":
</p>
<script src="require.js"></script>
<script>require(['script']);</script>

View File

@@ -0,0 +1,36 @@
/*
RequireJS 2.1.9 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.
Available via the MIT or new BSD license.
see: http://github.com/jrburke/requirejs for details
*/
var requirejs,require,define;
(function(Z){function H(b){return"[object Function]"===L.call(b)}function I(b){return"[object Array]"===L.call(b)}function y(b,c){if(b){var e;for(e=0;e<b.length&&(!b[e]||!c(b[e],e,b));e+=1);}}function M(b,c){if(b){var e;for(e=b.length-1;-1<e&&(!b[e]||!c(b[e],e,b));e-=1);}}function t(b,c){return ga.call(b,c)}function l(b,c){return t(b,c)&&b[c]}function F(b,c){for(var e in b)if(t(b,e)&&c(b[e],e))break}function Q(b,c,e,h){c&&F(c,function(c,j){if(e||!t(b,j))h&&"string"!==typeof c?(b[j]||(b[j]={}),Q(b[j],
c,e,h)):b[j]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function aa(b){throw b;}function ba(b){if(!b)return b;var c=Z;y(b.split("."),function(b){c=c[b]});return c}function A(b,c,e,h){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=h;e&&(c.originalError=e);return c}function ha(b){function c(a,f,b){var d,m,c,g,e,h,j,i=f&&f.split("/");d=i;var n=k.map,p=n&&n["*"];if(a&&"."===a.charAt(0))if(f){d=l(k.pkgs,f)?i=[f]:i.slice(0,i.length-
1);f=a=d.concat(a.split("/"));for(d=0;f[d];d+=1)if(m=f[d],"."===m)f.splice(d,1),d-=1;else if(".."===m)if(1===d&&(".."===f[2]||".."===f[0]))break;else 0<d&&(f.splice(d-1,2),d-=2);d=l(k.pkgs,f=a[0]);a=a.join("/");d&&a===f+"/"+d.main&&(a=f)}else 0===a.indexOf("./")&&(a=a.substring(2));if(b&&n&&(i||p)){f=a.split("/");for(d=f.length;0<d;d-=1){c=f.slice(0,d).join("/");if(i)for(m=i.length;0<m;m-=1)if(b=l(n,i.slice(0,m).join("/")))if(b=l(b,c)){g=b;e=d;break}if(g)break;!h&&(p&&l(p,c))&&(h=l(p,c),j=d)}!g&&
h&&(g=h,e=j);g&&(f.splice(0,e,g),a=f.join("/"))}return a}function e(a){z&&y(document.getElementsByTagName("script"),function(f){if(f.getAttribute("data-requiremodule")===a&&f.getAttribute("data-requirecontext")===i.contextName)return f.parentNode.removeChild(f),!0})}function h(a){var f=l(k.paths,a);if(f&&I(f)&&1<f.length)return f.shift(),i.require.undef(a),i.require([a]),!0}function $(a){var f,b=a?a.indexOf("!"):-1;-1<b&&(f=a.substring(0,b),a=a.substring(b+1,a.length));return[f,a]}function n(a,f,
b,d){var m,B,g=null,e=f?f.name:null,h=a,j=!0,k="";a||(j=!1,a="_@r"+(L+=1));a=$(a);g=a[0];a=a[1];g&&(g=c(g,e,d),B=l(r,g));a&&(g?k=B&&B.normalize?B.normalize(a,function(a){return c(a,e,d)}):c(a,e,d):(k=c(a,e,d),a=$(k),g=a[0],k=a[1],b=!0,m=i.nameToUrl(k)));b=g&&!B&&!b?"_unnormalized"+(M+=1):"";return{prefix:g,name:k,parentMap:f,unnormalized:!!b,url:m,originalName:h,isDefine:j,id:(g?g+"!"+k:k)+b}}function q(a){var f=a.id,b=l(p,f);b||(b=p[f]=new i.Module(a));return b}function s(a,f,b){var d=a.id,m=l(p,
d);if(t(r,d)&&(!m||m.defineEmitComplete))"defined"===f&&b(r[d]);else if(m=q(a),m.error&&"error"===f)b(m.error);else m.on(f,b)}function v(a,f){var b=a.requireModules,d=!1;if(f)f(a);else if(y(b,function(f){if(f=l(p,f))f.error=a,f.events.error&&(d=!0,f.emit("error",a))}),!d)j.onError(a)}function w(){R.length&&(ia.apply(G,[G.length-1,0].concat(R)),R=[])}function x(a){delete p[a];delete T[a]}function E(a,f,b){var d=a.map.id;a.error?a.emit("error",a.error):(f[d]=!0,y(a.depMaps,function(d,c){var g=d.id,
e=l(p,g);e&&(!a.depMatched[c]&&!b[g])&&(l(f,g)?(a.defineDep(c,r[g]),a.check()):E(e,f,b))}),b[d]=!0)}function C(){var a,f,b,d,m=(b=1E3*k.waitSeconds)&&i.startTime+b<(new Date).getTime(),c=[],g=[],j=!1,l=!0;if(!U){U=!0;F(T,function(b){a=b.map;f=a.id;if(b.enabled&&(a.isDefine||g.push(b),!b.error))if(!b.inited&&m)h(f)?j=d=!0:(c.push(f),e(f));else if(!b.inited&&(b.fetched&&a.isDefine)&&(j=!0,!a.prefix))return l=!1});if(m&&c.length)return b=A("timeout","Load timeout for modules: "+c,null,c),b.contextName=
i.contextName,v(b);l&&y(g,function(a){E(a,{},{})});if((!m||d)&&j)if((z||da)&&!V)V=setTimeout(function(){V=0;C()},50);U=!1}}function D(a){t(r,a[0])||q(n(a[0],null,!0)).init(a[1],a[2])}function J(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!W?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||W)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function K(){var a;for(w();G.length;){a=
G.shift();if(null===a[0])return v(A("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));D(a)}}var U,X,i,N,V,k={waitSeconds:7,baseUrl:"./",paths:{},pkgs:{},shim:{},config:{}},p={},T={},Y={},G=[],r={},S={},L=1,M=1;N={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){var b=
l(k.pkgs,a.map.id);return(b?l(k.config,a.map.id+"/"+b.main):l(k.config,a.map.id))||{}},exports:r[a.map.id]}}};X=function(a){this.events=l(Y,a.id)||{};this.map=a;this.shim=l(k.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};X.prototype={init:function(a,b,c,d){d=d||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;
this.ignore=d.ignore;d.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var d=this.exports,m=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(H(m)){if(this.events.error&&this.map.isDefine||j.onError!==aa)try{d=i.execCb(c,m,b,d)}catch(e){a=e}else d=i.execCb(c,m,b,d);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==
this.exports?d=b.exports:void 0===d&&this.usingExports&&(d=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",v(this.error=a)}else d=m;this.exports=d;if(this.map.isDefine&&!this.ignore&&(r[c]=d,j.onResourceLoad))j.onResourceLoad(i,this.map,this.depMaps);x(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=
!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,e=n(a.prefix);this.depMaps.push(e);s(e,"defined",u(this,function(d){var m,e;e=this.map.name;var g=this.map.parentMap?this.map.parentMap.name:null,h=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(d.normalize&&(e=d.normalize(e,function(a){return c(a,g,!0)})||""),d=n(a.prefix+"!"+e,this.map.parentMap),s(d,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),
e=l(p,d.id)){this.depMaps.push(d);if(this.events.error)e.on("error",u(this,function(a){this.emit("error",a)}));e.enable()}}else m=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),m.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];F(p,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&x(a.map.id)});v(a)}),m.fromText=u(this,function(d,c){var e=a.name,g=n(e),B=O;c&&(d=c);B&&(O=!1);q(g);t(k.config,b)&&(k.config[e]=k.config[b]);try{j.exec(d)}catch(ca){return v(A("fromtexteval",
"fromText eval for "+b+" failed: "+ca,ca,[b]))}B&&(O=!0);this.depMaps.push(g);i.completeLoad(e);h([e],m)}),d.load(a.name,h,m,k)}));i.enable(e,this);this.pluginMaps[e.id]=e},enable:function(){T[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,u(this,function(a,b){var c,d;if("string"===typeof a){a=n(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=l(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",u(this,function(a){this.defineDep(b,
a);this.check()}));this.errback&&s(a,"error",u(this,this.errback))}c=a.id;d=p[c];!t(N,c)&&(d&&!d.enabled)&&i.enable(a,this)}));F(this.pluginMaps,u(this,function(a){var b=l(p,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:k,contextName:b,registry:p,defined:r,urlFetched:S,defQueue:G,Module:X,makeModuleMap:n,
nextTick:j.nextTick,onError:v,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=k.pkgs,c=k.shim,d={paths:!0,config:!0,map:!0};F(a,function(a,b){d[b]?"map"===b?(k.map||(k.map={}),Q(k[b],a,!0,!0)):Q(k[b],a,!0):k[b]=a});a.shim&&(F(a.shim,function(a,b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);c[b]=a}),k.shim=c);a.packages&&(y(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,
location:a.location||a.name,main:(a.main||"main").replace(ja,"").replace(ea,"")}}),k.pkgs=b);F(p,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=n(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Z,arguments));return b||a.exports&&ba(a.exports)}},makeRequire:function(a,f){function h(d,c,e){var g,k;f.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if("string"===typeof d){if(H(c))return v(A("requireargs",
"Invalid require call"),e);if(a&&t(N,d))return N[d](p[a.id]);if(j.get)return j.get(i,d,a,h);g=n(d,a,!1,!0);g=g.id;return!t(r,g)?v(A("notloaded",'Module name "'+g+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[g]}K();i.nextTick(function(){K();k=q(n(null,a));k.skipMap=f.skipMap;k.init(d,c,e,{enabled:!0});C()});return h}f=f||{};Q(h,{isBrowser:z,toUrl:function(b){var f,e=b.lastIndexOf("."),g=b.split("/")[0];if(-1!==e&&(!("."===g||".."===g)||1<e))f=b.substring(e,b.length),b=
b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),f,!0)},defined:function(b){return t(r,n(b,a,!1,!0).id)},specified:function(b){b=n(b,a,!1,!0).id;return t(r,b)||t(p,b)}});a||(h.undef=function(b){w();var c=n(b,a,!0),f=l(p,b);e(b);delete r[b];delete S[c.url];delete Y[b];f&&(f.events.defined&&(Y[b]=f.events),x(b))});return h},enable:function(a){l(p,a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=l(k.shim,a)||{},e=d.exports;for(w();G.length;){c=G.shift();if(null===c[0]){c[0]=a;if(b)break;b=
!0}else c[0]===a&&(b=!0);D(c)}c=l(p,a);if(!b&&!t(r,a)&&c&&!c.inited){if(k.enforceDefine&&(!e||!ba(e)))return h(a)?void 0:v(A("nodefine","No define call for "+a,null,[a]));D([a,d.deps||[],d.exportsFn])}C()},nameToUrl:function(a,b,c){var d,e,h,g,i,n;if(j.jsExtRegExp.test(a))g=a+(b||"");else{d=k.paths;e=k.pkgs;g=a.split("/");for(i=g.length;0<i;i-=1)if(n=g.slice(0,i).join("/"),h=l(e,n),n=l(d,n)){I(n)&&(n=n[0]);g.splice(0,i,n);break}else if(h){a=a===h.name?h.location+"/"+h.main:h.location;g.splice(0,i,
a);break}g=g.join("/");g+=b||(/^data\:|\?/.test(g)||c?"":".js");g=("/"===g.charAt(0)||g.match(/^[\w\+\.\-]+:/)?"":k.baseUrl)+g}return k.urlArgs?g+((-1===g.indexOf("?")?"?":"&")+k.urlArgs):g},load:function(a,b){j.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ka.test((a.currentTarget||a.srcElement).readyState))P=null,a=J(a),i.completeLoad(a.id)},onScriptError:function(a){var b=J(a);if(!h(b.id))return v(A("scripterror","Script error for: "+b.id,
a,[b.id]))}};i.require=i.makeRequire();return i}var j,w,x,C,J,D,P,K,q,fa,la=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ma=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,ea=/\.js$/,ja=/^\.\//;w=Object.prototype;var L=w.toString,ga=w.hasOwnProperty,ia=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),da=!z&&"undefined"!==typeof importScripts,ka=z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,W="undefined"!==typeof opera&&
"[object Opera]"===opera.toString(),E={},s={},R=[],O=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(H(requirejs))return;s=requirejs;requirejs=void 0}"undefined"!==typeof require&&!H(require)&&(s=require,require=void 0);j=requirejs=function(b,c,e,h){var q,n="_";!I(b)&&"string"!==typeof b&&(q=b,I(c)?(b=c,c=e,e=h):b=[]);q&&q.context&&(n=q.context);(h=l(E,n))||(h=E[n]=j.s.newContext(n));q&&h.configure(q);return h.require(b,c,e)};j.config=function(b){return j(b)};j.nextTick="undefined"!==
typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=j);j.version="2.1.9";j.jsExtRegExp=/^\/|:|\?|\.js$/;j.isBrowser=z;w=j.s={contexts:E,newContext:ha};j({});y(["toUrl","undef","defined","specified"],function(b){j[b]=function(){var c=E._;return c.require[b].apply(c,arguments)}});if(z&&(x=w.head=document.getElementsByTagName("head")[0],C=document.getElementsByTagName("base")[0]))x=w.head=C.parentNode;j.onError=aa;j.createNode=function(b){var c=b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml",
"html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};j.load=function(b,c,e){var h=b&&b.config||{};if(z)return h=j.createNode(h,c,e),h.setAttribute("data-requirecontext",b.contextName),h.setAttribute("data-requiremodule",c),h.attachEvent&&!(h.attachEvent.toString&&0>h.attachEvent.toString().indexOf("[native code"))&&!W?(O=!0,h.attachEvent("onreadystatechange",b.onScriptLoad)):(h.addEventListener("load",b.onScriptLoad,!1),h.addEventListener("error",
b.onScriptError,!1)),h.src=e,K=h,C?x.insertBefore(h,C):x.appendChild(h),K=null,h;if(da)try{importScripts(e),b.completeLoad(c)}catch(l){b.onError(A("importscripts","importScripts failed for "+c+" at "+e,l,[c]))}};z&&!s.skipDataMain&&M(document.getElementsByTagName("script"),function(b){x||(x=b.parentNode);if(J=b.getAttribute("data-main"))return q=J,s.baseUrl||(D=q.split("/"),q=D.pop(),fa=D.length?D.join("/")+"/":"./",s.baseUrl=fa),q=q.replace(ea,""),j.jsExtRegExp.test(q)&&(q=J),s.deps=s.deps?s.deps.concat(q):
[q],!0});define=function(b,c,e){var h,j;"string"!==typeof b&&(e=c,c=b,b=null);I(c)||(e=c,c=null);!c&&H(e)&&(c=[],e.length&&(e.toString().replace(la,"").replace(ma,function(b,e){c.push(e)}),c=(1===e.length?["require"]:["require","exports","module"]).concat(c)));if(O){if(!(h=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),h=P;h&&(b||(b=h.getAttribute("data-requiremodule")),j=E[h.getAttribute("data-requirecontext")])}(j?
j.defQueue:R).push([b,c,e])};define.amd={jQuery:!0};j.exec=function(b){return eval(b)};j(s)}})(this);

View File

@@ -0,0 +1,13 @@
define ['browser-source-map-support'], (sourceMapSupport) ->
sourceMapSupport.install()
foo = -> throw new Error 'foo'
try
foo()
catch e
if /\bscript\.coffee\b/.test e.stack
document.body.appendChild document.createTextNode 'Test passed'
else
document.body.appendChild document.createTextNode 'Test failed'
console.log e.stack

View File

@@ -0,0 +1,24 @@
// Generated by CoffeeScript 1.7.1
(function() {
define(['browser-source-map-support'], function(sourceMapSupport) {
var e, foo;
sourceMapSupport.install();
foo = function() {
throw new Error('foo');
};
try {
return foo();
} catch (_error) {
e = _error;
if (/\bscript\.coffee\b/.test(e.stack)) {
return document.body.appendChild(document.createTextNode('Test passed'));
} else {
document.body.appendChild(document.createTextNode('Test failed'));
return console.log(e.stack);
}
}
});
}).call(this);
//# sourceMappingURL=script.map

View File

@@ -0,0 +1,10 @@
{
"version": 3,
"file": "script.js",
"sourceRoot": "..",
"sources": [
"amd-test/script.coffee"
],
"names": [],
"mappings": ";AAAA;AAAA,EAAA,MAAA,CAAO,CAAC,4BAAD,CAAP,EAAuC,SAAC,gBAAD,GAAA;AACrC,QAAA,MAAA;AAAA,IAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;AAAA,IAEA,GAAA,GAAM,SAAA,GAAA;AAAG,YAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;IAAA,CAFN,CAAA;AAIA;aACE,GAAA,CAAA,EADF;KAAA,cAAA;AAGE,MADI,UACJ,CAAA;AAAA,MAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;eACE,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,EADF;OAAA,MAAA;AAGE,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;eACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,EAJF;OAHF;KALqC;EAAA,CAAvC,CAAA,CAAA;AAAA"
}

View File

@@ -0,0 +1,89 @@
/*
* Support for source maps in V8 stack traces
* https://github.com/evanw/node-source-map-support
*/
(this.define||function(K,O){this.sourceMapSupport=O()})("browser-source-map-support",function(K){(function h(r,m,e){function p(g,d){if(!m[g]){if(!r[g]){var k="function"==typeof require&&require;if(!d&&k)return k(g,!0);if(v)return v(g,!0);throw Error("Cannot find module '"+g+"'");}k=m[g]={exports:{}};r[g][0].call(k.exports,function(d){var c=r[g][1][d];return p(c?c:d)},k,k.exports,h,r,m,e)}return m[g].exports}for(var v="function"==typeof require&&require,A=0;A<e.length;A++)p(e[A]);return p})({1:[function(h,
r,m){K=h("./source-map-support")},{"./source-map-support":18}],2:[function(h,r,m){},{}],3:[function(h,r,m){function e(f,n,x){if(!(this instanceof e))return new e(f,n,x);var a=typeof f;if("base64"===n&&"string"===a)for(f=f.trim?f.trim():f.replace(/^\s+|\s+$/g,"");0!==f.length%4;)f+="=";var b;if("number"===a)b=w(f);else if("string"===a)b=e.byteLength(f,n);else if("object"===a)b=w(f.length);else throw Error("First argument needs to be a number, array or string.");var c;e._useTypedArrays?c=e._augment(new Uint8Array(b)):
(c=this,c.length=b,c._isBuffer=!0);if(e._useTypedArrays&&"number"===typeof f.byteLength)c._set(f);else{var d=f;if(y(d)||e.isBuffer(d)||d&&"object"===typeof d&&"number"===typeof d.length)for(n=0;n<b;n++)e.isBuffer(f)?c[n]=f.readUInt8(n):c[n]=f[n];else if("string"===a)c.write(f,0,n);else if("number"===a&&!e._useTypedArrays&&!x)for(n=0;n<b;n++)c[n]=0}return c}function p(f,n,x){var a="";for(x=Math.min(f.length,x);n<x;n++)a+=String.fromCharCode(f[n]);return a}function v(f,n,x,a){a||(q("boolean"===typeof x,
"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1<f.length,"Trying to read beyond buffer length"));a=f.length;if(!(n>=a))return x?(x=f[n],n+1<a&&(x|=f[n+1]<<8)):(x=f[n]<<8,n+1<a&&(x|=f[n+1])),x}function A(f,n,a,c){c||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3<f.length,"Trying to read beyond buffer length"));c=f.length;if(!(n>=c)){var b;a?(n+2<c&&(b=f[n+2]<<16),n+1<c&&(b|=f[n+1]<<8),b|=f[n],n+3<c&&(b+=f[n+3]<<24>>>0)):
(n+1<c&&(b=f[n+1]<<16),n+2<c&&(b|=f[n+2]<<8),n+3<c&&(b|=f[n+3]),b+=f[n]<<24>>>0);return b}}function g(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+1<f.length,"Trying to read beyond buffer length"));if(!(n>=f.length))return f=v(f,n,a,!0),f&32768?-1*(65535-f+1):f}function d(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(void 0!==n&&null!==n,"missing offset"),q(n+3<f.length,"Trying to read beyond buffer length"));if(!(n>=
f.length))return f=A(f,n,a,!0),f&2147483648?-1*(4294967295-f+1):f}function k(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+3<f.length,"Trying to read beyond buffer length"));return I.read(f,n,a,23,4)}function l(f,n,a,b){b||(q("boolean"===typeof a,"missing or invalid endian"),q(n+7<f.length,"Trying to read beyond buffer length"));return I.read(f,n,a,52,8)}function c(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==
a&&null!==a,"missing offset"),q(a+1<f.length,"trying to write beyond buffer length"),L(n,65535));var d=f.length;if(!(a>=d))for(c=0,d=Math.min(d-a,2);c<d;c++)f[a+c]=(n&255<<8*(b?c:1-c))>>>8*(b?c:1-c)}function a(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3<f.length,"trying to write beyond buffer length"),L(n,4294967295));var d=f.length;if(!(a>=d))for(c=0,d=Math.min(d-a,4);c<d;c++)f[a+c]=n>>>
8*(b?c:3-c)&255}function b(f,n,a,b,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+1<f.length,"Trying to write beyond buffer length"),M(n,32767,-32768));a>=f.length||(0<=n?c(f,n,a,b,d):c(f,65535+n+1,a,b,d))}function z(f,n,b,c,d){d||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof c,"missing or invalid endian"),q(void 0!==b&&null!==b,"missing offset"),q(b+3<f.length,"Trying to write beyond buffer length"),
M(n,2147483647,-2147483648));b>=f.length||(0<=n?a(f,n,b,c,d):a(f,4294967295+n+1,b,c,d))}function D(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),q(void 0!==a&&null!==a,"missing offset"),q(a+3<f.length,"Trying to write beyond buffer length"),N(n,3.4028234663852886E38,-3.4028234663852886E38));a>=f.length||I.write(f,n,a,b,23,4)}function B(f,n,a,b,c){c||(q(void 0!==n&&null!==n,"missing value"),q("boolean"===typeof b,"missing or invalid endian"),
q(void 0!==a&&null!==a,"missing offset"),q(a+7<f.length,"Trying to write beyond buffer length"),N(n,1.7976931348623157E308,-1.7976931348623157E308));a>=f.length||I.write(f,n,a,b,52,8)}function E(f,a,b){if("number"!==typeof f)return b;f=~~f;if(f>=a)return a;if(0<=f)return f;f+=a;return 0<=f?f:0}function w(f){f=~~Math.ceil(+f);return 0>f?0:f}function y(f){return(Array.isArray||function(f){return"[object Array]"===Object.prototype.toString.call(f)})(f)}function H(f){return 16>f?"0"+f.toString(16):f.toString(16)}
function t(f){for(var a=[],b=0;b<f.length;b++){var c=f.charCodeAt(b);if(127>=c)a.push(f.charCodeAt(b));else{var d=b;55296<=c&&57343>=c&&b++;c=encodeURIComponent(f.slice(d,b+1)).substr(1).split("%");for(d=0;d<c.length;d++)a.push(parseInt(c[d],16))}}return a}function F(f){for(var a=[],b=0;b<f.length;b++)a.push(f.charCodeAt(b)&255);return a}function C(f,a,b,c){for(var d=0;d<c&&!(d+b>=a.length||d>=f.length);d++)a[d+b]=f[d];return d}function G(f){try{return decodeURIComponent(f)}catch(a){return String.fromCharCode(65533)}}
function L(f,a){q("number"===typeof f,"cannot write a non-number as a number");q(0<=f,"specified a negative value for writing an unsigned value");q(f<=a,"value is larger than maximum value for type");q(Math.floor(f)===f,"value has a fractional component")}function M(f,a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value");q(Math.floor(f)===f,"value has a fractional component")}function N(f,
a,b){q("number"===typeof f,"cannot write a non-number as a number");q(f<=a,"value larger than maximum allowed value");q(f>=b,"value smaller than minimum allowed value")}function q(f,a){if(!f)throw Error(a||"Failed assertion");}var J=h("base64-js"),I=h("ieee754");m.Buffer=e;m.SlowBuffer=e;m.INSPECT_MAX_BYTES=50;e.poolSize=8192;e._useTypedArrays=function(){try{var f=new ArrayBuffer(0),a=new Uint8Array(f);a.foo=function(){return 42};return 42===a.foo()&&"function"===typeof a.subarray}catch(b){return!1}}();
e.isEncoding=function(f){switch(String(f).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0;default:return!1}};e.isBuffer=function(f){return!(null===f||void 0===f||!f._isBuffer)};e.byteLength=function(f,a){var b;f+="";switch(a||"utf8"){case "hex":b=f.length/2;break;case "utf8":case "utf-8":b=t(f).length;break;case "ascii":case "binary":case "raw":b=f.length;break;case "base64":b=J.toByteArray(f).length;
break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=2*f.length;break;default:throw Error("Unknown encoding");}return b};e.concat=function(f,a){q(y(f),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array.");if(0===f.length)return new e(0);if(1===f.length)return f[0];var b;if("number"!==typeof a)for(b=a=0;b<f.length;b++)a+=f[b].length;var c=new e(a),d=0;for(b=0;b<f.length;b++){var k=f[b];k.copy(c,d);d+=k.length}return c};e.prototype.write=function(f,a,b,c){if(isFinite(a))isFinite(b)||
(c=b,b=void 0);else{var d=c;c=a;a=b;b=d}a=Number(a)||0;d=this.length-a;b?(b=Number(b),b>d&&(b=d)):b=d;c=String(c||"utf8").toLowerCase();switch(c){case "hex":a=Number(a)||0;c=this.length-a;b?(b=Number(b),b>c&&(b=c)):b=c;c=f.length;q(0===c%2,"Invalid hex string");b>c/2&&(b=c/2);for(c=0;c<b;c++)d=parseInt(f.substr(2*c,2),16),q(!isNaN(d),"Invalid hex string"),this[a+c]=d;e._charsWritten=2*c;f=c;break;case "utf8":case "utf-8":f=e._charsWritten=C(t(f),this,a,b);break;case "ascii":f=e._charsWritten=C(F(f),
this,a,b);break;case "binary":f=e._charsWritten=C(F(f),this,a,b);break;case "base64":f=e._charsWritten=C(J.toByteArray(f),this,a,b);break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":for(var k,d=[],l=0;l<f.length;l++)k=f.charCodeAt(l),c=k>>8,k%=256,d.push(k),d.push(c);f=e._charsWritten=C(d,this,a,b);break;default:throw Error("Unknown encoding");}return f};e.prototype.toString=function(f,a,b){f=String(f||"utf8").toLowerCase();a=Number(a)||0;b=void 0!==b?Number(b):b=this.length;if(b===a)return"";
switch(f){case "hex":f=a;a=this.length;if(!f||0>f)f=0;if(!b||0>b||b>a)b=a;for(a="";f<b;f++)a+=H(this[f]);b=a;break;case "utf8":case "utf-8":var c=a;a=f="";for(b=Math.min(this.length,b);c<b;c++)127>=this[c]?(f+=G(a)+String.fromCharCode(this[c]),a=""):a+="%"+this[c].toString(16);b=f+G(a);break;case "ascii":b=p(this,a,b);break;case "binary":b=p(this,a,b);break;case "base64":f=a;b=0===f&&b===this.length?J.fromByteArray(this):J.fromByteArray(this.slice(f,b));break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":b=
this.slice(a,b);f="";for(a=0;a<b.length;a+=2)f+=String.fromCharCode(b[a]+256*b[a+1]);b=f;break;default:throw Error("Unknown encoding");}return b};e.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};e.prototype.copy=function(a,b,c,d){c||(c=0);d||0===d||(d=this.length);b||(b=0);if(d!==c&&0!==a.length&&0!==this.length)if(q(d>=c,"sourceEnd < sourceStart"),q(0<=b&&b<a.length,"targetStart out of bounds"),q(0<=c&&c<this.length,"sourceStart out of bounds"),
q(0<=d&&d<=this.length,"sourceEnd out of bounds"),d>this.length&&(d=this.length),a.length-b<d-c&&(d=a.length-b+c),d-=c,100>d||!e._useTypedArrays)for(var k=0;k<d;k++)a[k+b]=this[k+c];else a._set(this.subarray(c,c+d),b)};e.prototype.slice=function(a,b){var c=this.length;a=E(a,c,0);b=E(b,c,c);if(e._useTypedArrays)return e._augment(this.subarray(a,b));for(var c=b-a,d=new e(c,void 0,!0),k=0;k<c;k++)d[k]=this[k+a];return d};e.prototype.get=function(a){console.log(".get() is deprecated. Access using array indexes instead.");
return this.readUInt8(a)};e.prototype.set=function(a,b){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(a,b)};e.prototype.readUInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a<this.length,"Trying to read beyond buffer length"));if(!(a>=this.length))return this[a]};e.prototype.readUInt16LE=function(a,b){return v(this,a,!0,b)};e.prototype.readUInt16BE=function(a,b){return v(this,a,!1,b)};e.prototype.readUInt32LE=function(a,b){return A(this,
a,!0,b)};e.prototype.readUInt32BE=function(a,b){return A(this,a,!1,b)};e.prototype.readInt8=function(a,b){b||(q(void 0!==a&&null!==a,"missing offset"),q(a<this.length,"Trying to read beyond buffer length"));if(!(a>=this.length))return this[a]&128?-1*(255-this[a]+1):this[a]};e.prototype.readInt16LE=function(a,b){return g(this,a,!0,b)};e.prototype.readInt16BE=function(a,b){return g(this,a,!1,b)};e.prototype.readInt32LE=function(a,b){return d(this,a,!0,b)};e.prototype.readInt32BE=function(a,b){return d(this,
a,!1,b)};e.prototype.readFloatLE=function(a,b){return k(this,a,!0,b)};e.prototype.readFloatBE=function(a,b){return k(this,a,!1,b)};e.prototype.readDoubleLE=function(a,b){return l(this,a,!0,b)};e.prototype.readDoubleBE=function(a,b){return l(this,a,!1,b)};e.prototype.writeUInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b<this.length,"trying to write beyond buffer length"),L(a,255));b>=this.length||(this[b]=a)};e.prototype.writeUInt16LE=function(a,
b,d){c(this,a,b,!0,d)};e.prototype.writeUInt16BE=function(a,b,d){c(this,a,b,!1,d)};e.prototype.writeUInt32LE=function(b,c,d){a(this,b,c,!0,d)};e.prototype.writeUInt32BE=function(b,c,d){a(this,b,c,!1,d)};e.prototype.writeInt8=function(a,b,c){c||(q(void 0!==a&&null!==a,"missing value"),q(void 0!==b&&null!==b,"missing offset"),q(b<this.length,"Trying to write beyond buffer length"),M(a,127,-128));b>=this.length||(0<=a?this.writeUInt8(a,b,c):this.writeUInt8(255+a+1,b,c))};e.prototype.writeInt16LE=function(a,
c,d){b(this,a,c,!0,d)};e.prototype.writeInt16BE=function(a,c,d){b(this,a,c,!1,d)};e.prototype.writeInt32LE=function(a,b,c){z(this,a,b,!0,c)};e.prototype.writeInt32BE=function(a,b,c){z(this,a,b,!1,c)};e.prototype.writeFloatLE=function(a,b,c){D(this,a,b,!0,c)};e.prototype.writeFloatBE=function(a,b,c){D(this,a,b,!1,c)};e.prototype.writeDoubleLE=function(a,b,c){B(this,a,b,!0,c)};e.prototype.writeDoubleBE=function(a,b,c){B(this,a,b,!1,c)};e.prototype.fill=function(a,b,c){a||(a=0);b||(b=0);c||(c=this.length);
"string"===typeof a&&(a=a.charCodeAt(0));q("number"===typeof a&&!isNaN(a),"value is not a number");q(c>=b,"end < start");if(c!==b&&0!==this.length)for(q(0<=b&&b<this.length,"start out of bounds"),q(0<=c&&c<=this.length,"end out of bounds");b<c;b++)this[b]=a};e.prototype.inspect=function(){for(var a=[],b=this.length,c=0;c<b;c++)if(a[c]=H(this[c]),c===m.INSPECT_MAX_BYTES){a[c+1]="...";break}return"<Buffer "+a.join(" ")+">"};e.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(e._useTypedArrays)return(new e(this)).buffer;
for(var a=new Uint8Array(this.length),b=0,c=a.length;b<c;b+=1)a[b]=this[b];return a.buffer}throw Error("Buffer.toArrayBuffer not supported in this browser");};var u=e.prototype;e._augment=function(a){a._isBuffer=!0;a._get=a.get;a._set=a.set;a.get=u.get;a.set=u.set;a.write=u.write;a.toString=u.toString;a.toLocaleString=u.toString;a.toJSON=u.toJSON;a.copy=u.copy;a.slice=u.slice;a.readUInt8=u.readUInt8;a.readUInt16LE=u.readUInt16LE;a.readUInt16BE=u.readUInt16BE;a.readUInt32LE=u.readUInt32LE;a.readUInt32BE=
u.readUInt32BE;a.readInt8=u.readInt8;a.readInt16LE=u.readInt16LE;a.readInt16BE=u.readInt16BE;a.readInt32LE=u.readInt32LE;a.readInt32BE=u.readInt32BE;a.readFloatLE=u.readFloatLE;a.readFloatBE=u.readFloatBE;a.readDoubleLE=u.readDoubleLE;a.readDoubleBE=u.readDoubleBE;a.writeUInt8=u.writeUInt8;a.writeUInt16LE=u.writeUInt16LE;a.writeUInt16BE=u.writeUInt16BE;a.writeUInt32LE=u.writeUInt32LE;a.writeUInt32BE=u.writeUInt32BE;a.writeInt8=u.writeInt8;a.writeInt16LE=u.writeInt16LE;a.writeInt16BE=u.writeInt16BE;
a.writeInt32LE=u.writeInt32LE;a.writeInt32BE=u.writeInt32BE;a.writeFloatLE=u.writeFloatLE;a.writeFloatBE=u.writeFloatBE;a.writeDoubleLE=u.writeDoubleLE;a.writeDoubleBE=u.writeDoubleBE;a.fill=u.fill;a.inspect=u.inspect;a.toArrayBuffer=u.toArrayBuffer;return a}},{"base64-js":4,ieee754:5}],4:[function(h,r,m){(function(e){function p(e){e=e.charCodeAt(0);if(43===e)return 62;if(47===e)return 63;if(48>e)return-1;if(58>e)return e-48+52;if(91>e)return e-65;if(123>e)return e-97+26}var v="undefined"!==typeof Uint8Array?
Uint8Array:Array;e.toByteArray=function(e){function g(c){a[b++]=c}var d,k,l,c,a;if(0<e.length%4)throw Error("Invalid string. Length must be a multiple of 4");d=e.length;c="="===e.charAt(d-2)?2:"="===e.charAt(d-1)?1:0;a=new v(3*e.length/4-c);k=0<c?e.length-4:e.length;var b=0;for(d=0;d<k;d+=4)l=p(e.charAt(d))<<18|p(e.charAt(d+1))<<12|p(e.charAt(d+2))<<6|p(e.charAt(d+3)),g((l&16711680)>>16),g((l&65280)>>8),g(l&255);2===c?(l=p(e.charAt(d))<<2|p(e.charAt(d+1))>>4,g(l&255)):1===c&&(l=p(e.charAt(d))<<10|
p(e.charAt(d+1))<<4|p(e.charAt(d+2))>>2,g(l>>8&255),g(l&255));return a};e.fromByteArray=function(e){var g,d=e.length%3,k="",l,c;g=0;for(c=e.length-d;g<c;g+=3)l=(e[g]<<16)+(e[g+1]<<8)+e[g+2],l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l&
63),k+=l;switch(d){case 1:l=e[e.length-1];k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>2);k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<4&63);k+="==";break;case 2:l=(e[e.length-2]<<8)+e[e.length-1],k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>10),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l>>4&63),k+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(l<<
2&63),k+="="}return k}})("undefined"===typeof m?this.base64js={}:m)},{}],5:[function(h,r,m){m.read=function(e,p,v,h,g){var d;d=8*g-h-1;var k=(1<<d)-1,l=k>>1,c=-7;g=v?g-1:0;var a=v?-1:1,b=e[p+g];g+=a;v=b&(1<<-c)-1;b>>=-c;for(c+=d;0<c;v=256*v+e[p+g],g+=a,c-=8);d=v&(1<<-c)-1;v>>=-c;for(c+=h;0<c;d=256*d+e[p+g],g+=a,c-=8);if(0===v)v=1-l;else{if(v===k)return d?NaN:Infinity*(b?-1:1);d+=Math.pow(2,h);v-=l}return(b?-1:1)*d*Math.pow(2,v-h)};m.write=function(e,p,v,h,g,d){var k,l=8*d-g-1,c=(1<<l)-1,a=c>>1,b=
23===g?Math.pow(2,-24)-Math.pow(2,-77):0;d=h?0:d-1;var z=h?1:-1,D=0>p||0===p&&0>1/p?1:0;p=Math.abs(p);isNaN(p)||Infinity===p?(p=isNaN(p)?1:0,h=c):(h=Math.floor(Math.log(p)/Math.LN2),1>p*(k=Math.pow(2,-h))&&(h--,k*=2),p=1<=h+a?p+b/k:p+b*Math.pow(2,1-a),2<=p*k&&(h++,k/=2),h+a>=c?(p=0,h=c):1<=h+a?(p=(p*k-1)*Math.pow(2,g),h+=a):(p=p*Math.pow(2,a-1)*Math.pow(2,g),h=0));for(;8<=g;e[v+d]=p&255,d+=z,p/=256,g-=8);h=h<<g|p;for(l+=g;0<l;e[v+d]=h&255,d+=z,h/=256,l-=8);e[v+d-z]|=128*D}},{}],6:[function(h,r,m){function e(){}
h=r.exports={};h.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(e){return window.setImmediate(e)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var e=[];window.addEventListener("message",function(h){var m=h.source;m!==window&&null!==m||"process-tick"!==h.data||(h.stopPropagation(),0<e.length&&e.shift()())},!0);return function(h){e.push(h);window.postMessage("process-tick","*")}}return function(e){setTimeout(e,0)}}();h.title="browser";
h.browser=!0;h.env={};h.argv=[];h.on=e;h.once=e;h.off=e;h.emit=e;h.binding=function(e){throw Error("process.binding is not supported");};h.cwd=function(){return"/"};h.chdir=function(e){throw Error("process.chdir is not supported");}},{}],7:[function(h,r,m){(function(e){function h(d,k){for(var e=0,c=d.length-1;0<=c;c--){var a=d[c];"."===a?d.splice(c,1):".."===a?(d.splice(c,1),e++):e&&(d.splice(c,1),e--)}if(k)for(;e--;e)d.unshift("..");return d}function v(d,k){if(d.filter)return d.filter(k);for(var e=
[],c=0;c<d.length;c++)k(d[c],c,d)&&e.push(d[c]);return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;m.resolve=function(){for(var d="",k=!1,l=arguments.length-1;-1<=l&&!k;l--){var c=0<=l?arguments[l]:e.cwd();if("string"!==typeof c)throw new TypeError("Arguments to path.resolve must be strings");c&&(d=c+"/"+d,k="/"===c.charAt(0))}d=h(v(d.split("/"),function(a){return!!a}),!k).join("/");return(k?"/":"")+d||"."};m.normalize=function(d){var e=m.isAbsolute(d),l="/"===g(d,-1);
(d=h(v(d.split("/"),function(c){return!!c}),!e).join("/"))||e||(d=".");d&&l&&(d+="/");return(e?"/":"")+d};m.isAbsolute=function(d){return"/"===d.charAt(0)};m.join=function(){var d=Array.prototype.slice.call(arguments,0);return m.normalize(v(d,function(d,e){if("string"!==typeof d)throw new TypeError("Arguments to path.join must be strings");return d}).join("/"))};m.relative=function(d,e){function l(a){for(var b=0;b<a.length&&""===a[b];b++);for(var c=a.length-1;0<=c&&""===a[c];c--);return b>c?[]:a.slice(b,
c-b+1)}d=m.resolve(d).substr(1);e=m.resolve(e).substr(1);for(var c=l(d.split("/")),a=l(e.split("/")),b=Math.min(c.length,a.length),g=b,h=0;h<b;h++)if(c[h]!==a[h]){g=h;break}b=[];for(h=g;h<c.length;h++)b.push("..");b=b.concat(a.slice(g));return b.join("/")};m.sep="/";m.delimiter=":";m.dirname=function(d){var e=r.exec(d).slice(1);d=e[0];e=e[1];if(!d&&!e)return".";e&&(e=e.substr(0,e.length-1));return d+e};m.basename=function(d,e){var l=r.exec(d).slice(1)[2];e&&l.substr(-1*e.length)===e&&(l=l.substr(0,
l.length-e.length));return l};m.extname=function(d){return r.exec(d).slice(1)[3]};var g="b"==="ab".substr(-1)?function(d,e,l){return d.substr(e,l)}:function(d,e,l){0>e&&(e=d.length+e);return d.substr(e,l)}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"))},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6}],8:[function(h,r,m){m.SourceMapGenerator=h("./source-map/source-map-generator").SourceMapGenerator;
m.SourceMapConsumer=h("./source-map/source-map-consumer").SourceMapConsumer;m.SourceNode=h("./source-map/source-node").SourceNode},{"./source-map/source-map-consumer":13,"./source-map/source-map-generator":14,"./source-map/source-node":15}],9:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(){this._array=[];this._set={}}var d=e("./util");g.fromArray=function(d,e){for(var c=new g,a=0,b=d.length;a<b;a++)c.add(d[a],e);return c};g.prototype.add=function(e,
l){var c=this.has(e),a=this._array.length;c&&!l||this._array.push(e);c||(this._set[d.toSetString(e)]=a)};g.prototype.has=function(e){return Object.prototype.hasOwnProperty.call(this._set,d.toSetString(e))};g.prototype.indexOf=function(e){if(this.has(e))return this._set[d.toSetString(e)];throw Error('"'+e+'" is not in the set.');};g.prototype.at=function(d){if(0<=d&&d<this._array.length)return this._array[d];throw Error("No element indexed by "+d);};g.prototype.toArray=function(){return this._array.slice()};
h.ArraySet=g})},{"./util":16,amdefine:17}],10:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g=e("./base64");h.encode=function(d){var e="",l=0>d?(-d<<1)+1:(d<<1)+0;do d=l&31,l>>>=5,0<l&&(d|=32),e+=g.encode(d);while(0<l);return e};h.decode=function(d){var e=0,l=d.length,c=0,a=0,b,h;do{if(e>=l)throw Error("Expected more digits in base 64 VLQ value.");h=g.decode(d.charAt(e++));b=!!(h&32);h&=31;c+=h<<a;a+=5}while(b);l=c>>1;return{value:1===(c&1)?-l:l,rest:d.slice(e)}}})},
{"./base64":11,amdefine:17}],11:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){var g={},d={};"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").forEach(function(e,l){g[e]=l;d[l]=e});h.encode=function(e){if(e in d)return d[e];throw new TypeError("Must be between 0 and 63: "+e);};h.decode=function(d){if(d in g)return g[d];throw new TypeError("Not a valid base 64 digit: "+d);}})},{amdefine:17}],12:[function(h,r,m){if("function"!==typeof e)var e=
h("amdefine")(r,h);e(function(e,h,m){function g(d,e,l,c,a){var b=Math.floor((e-d)/2)+d,h=a(l,c[b],!0);return 0===h?c[b]:0<h?1<e-b?g(b,e,l,c,a):c[b]:1<b-d?g(d,b,l,c,a):0>d?null:c[d]}h.search=function(d,e,l){return 0<e.length?g(-1,e.length,d,e,l):null}})},{amdefine:17}],13:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(a){var b=a;"string"===typeof a&&(b=JSON.parse(a.replace(/^\)\]\}'/,"")));a=d.getArg(b,"version");var c=d.getArg(b,"sources"),e=d.getArg(b,
"names",[]),g=d.getArg(b,"sourceRoot",null),h=d.getArg(b,"sourcesContent",null),k=d.getArg(b,"mappings"),b=d.getArg(b,"file",null);if(a!=this._version)throw Error("Unsupported version: "+a);this._names=l.fromArray(e,!0);this._sources=l.fromArray(c,!0);this.sourceRoot=g;this.sourcesContent=h;this._mappings=k;this.file=b}var d=e("./util"),k=e("./binary-search"),l=e("./array-set").ArraySet,c=e("./base64-vlq");g.fromSourceMap=function(a){var b=Object.create(g.prototype);b._names=l.fromArray(a._names.toArray(),
!0);b._sources=l.fromArray(a._sources.toArray(),!0);b.sourceRoot=a._sourceRoot;b.sourcesContent=a._generateSourcesContent(b._sources.toArray(),b.sourceRoot);b.file=a._file;b.__generatedMappings=a._mappings.slice().sort(d.compareByGeneratedPositions);b.__originalMappings=a._mappings.slice().sort(d.compareByOriginalPositions);return b};g.prototype._version=3;Object.defineProperty(g.prototype,"sources",{get:function(){return this._sources.toArray().map(function(a){return this.sourceRoot?d.join(this.sourceRoot,
a):a},this)}});g.prototype.__generatedMappings=null;Object.defineProperty(g.prototype,"_generatedMappings",{get:function(){this.__generatedMappings||(this.__generatedMappings=[],this.__originalMappings=[],this._parseMappings(this._mappings,this.sourceRoot));return this.__generatedMappings}});g.prototype.__originalMappings=null;Object.defineProperty(g.prototype,"_originalMappings",{get:function(){this.__originalMappings||(this.__generatedMappings=[],this.__originalMappings=[],this._parseMappings(this._mappings,
this.sourceRoot));return this.__originalMappings}});g.prototype._parseMappings=function(a,b){for(var e=1,g=0,l=0,h=0,k=0,y=0,m=/^[,;]/,t=a,p;0<t.length;)if(";"===t.charAt(0))e++,t=t.slice(1),g=0;else if(","===t.charAt(0))t=t.slice(1);else{p={};p.generatedLine=e;t=c.decode(t);p.generatedColumn=g+t.value;g=p.generatedColumn;t=t.rest;if(0<t.length&&!m.test(t.charAt(0))){t=c.decode(t);p.source=this._sources.at(k+t.value);k+=t.value;t=t.rest;if(0===t.length||m.test(t.charAt(0)))throw Error("Found a source, but no line and column");
t=c.decode(t);p.originalLine=l+t.value;l=p.originalLine;p.originalLine+=1;t=t.rest;if(0===t.length||m.test(t.charAt(0)))throw Error("Found a source and line, but no column");t=c.decode(t);p.originalColumn=h+t.value;h=p.originalColumn;t=t.rest;0<t.length&&!m.test(t.charAt(0))&&(t=c.decode(t),p.name=this._names.at(y+t.value),y+=t.value,t=t.rest)}this.__generatedMappings.push(p);"number"===typeof p.originalLine&&this.__originalMappings.push(p)}this.__generatedMappings.sort(d.compareByGeneratedPositions);
this.__originalMappings.sort(d.compareByOriginalPositions)};g.prototype._findMapping=function(a,b,c,d,e){if(0>=a[c])throw new TypeError("Line must be greater than or equal to 1, got "+a[c]);if(0>a[d])throw new TypeError("Column must be greater than or equal to 0, got "+a[d]);return k.search(a,b,e)};g.prototype.originalPositionFor=function(a){a={generatedLine:d.getArg(a,"line"),generatedColumn:d.getArg(a,"column")};if(a=this._findMapping(a,this._generatedMappings,"generatedLine","generatedColumn",
d.compareByGeneratedPositions)){var b=d.getArg(a,"source",null);b&&this.sourceRoot&&(b=d.join(this.sourceRoot,b));return{source:b,line:d.getArg(a,"originalLine",null),column:d.getArg(a,"originalColumn",null),name:d.getArg(a,"name",null)}}return{source:null,line:null,column:null,name:null}};g.prototype.sourceContentFor=function(a){if(!this.sourcesContent)return null;this.sourceRoot&&(a=d.relative(this.sourceRoot,a));if(this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];var b;
if(this.sourceRoot&&(b=d.urlParse(this.sourceRoot))){var c=a.replace(/^file:\/\//,"");if("file"==b.scheme&&this._sources.has(c))return this.sourcesContent[this._sources.indexOf(c)];if((!b.path||"/"==b.path)&&this._sources.has("/"+a))return this.sourcesContent[this._sources.indexOf("/"+a)]}throw Error('"'+a+'" is not in the SourceMap.');};g.prototype.generatedPositionFor=function(a){a={source:d.getArg(a,"source"),originalLine:d.getArg(a,"line"),originalColumn:d.getArg(a,"column")};this.sourceRoot&&
(a.source=d.relative(this.sourceRoot,a.source));return(a=this._findMapping(a,this._originalMappings,"originalLine","originalColumn",d.compareByOriginalPositions))?{line:d.getArg(a,"generatedLine",null),column:d.getArg(a,"generatedColumn",null)}:{line:null,column:null}};g.GENERATED_ORDER=1;g.ORIGINAL_ORDER=2;g.prototype.eachMapping=function(a,b,c){b=b||null;switch(c||g.GENERATED_ORDER){case g.GENERATED_ORDER:c=this._generatedMappings;break;case g.ORIGINAL_ORDER:c=this._originalMappings;break;default:throw Error("Unknown order of iteration.");
}var e=this.sourceRoot;c.map(function(a){var b=a.source;b&&e&&(b=d.join(e,b));return{source:b,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,originalLine:a.originalLine,originalColumn:a.originalColumn,name:a.name}}).forEach(a,b)};h.SourceMapConsumer=g})},{"./array-set":9,"./base64-vlq":10,"./binary-search":12,"./util":16,amdefine:17}],14:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(c){this._file=k.getArg(c,"file");this._sourceRoot=
k.getArg(c,"sourceRoot",null);this._sources=new l;this._names=new l;this._mappings=[];this._sourcesContents=null}var d=e("./base64-vlq"),k=e("./util"),l=e("./array-set").ArraySet;g.prototype._version=3;g.fromSourceMap=function(c){var a=c.sourceRoot,b=new g({file:c.file,sourceRoot:a});c.eachMapping(function(c){var d={generated:{line:c.generatedLine,column:c.generatedColumn}};c.source&&(d.source=c.source,a&&(d.source=k.relative(a,d.source)),d.original={line:c.originalLine,column:c.originalColumn},c.name&&
(d.name=c.name));b.addMapping(d)});c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.addMapping=function(c){var a=k.getArg(c,"generated"),b=k.getArg(c,"original",null),d=k.getArg(c,"source",null);c=k.getArg(c,"name",null);this._validateMapping(a,b,d,c);d&&!this._sources.has(d)&&this._sources.add(d);c&&!this._names.has(c)&&this._names.add(c);this._mappings.push({generatedLine:a.line,generatedColumn:a.column,originalLine:null!=b&&b.line,originalColumn:null!=
b&&b.column,source:d,name:c})};g.prototype.setSourceContent=function(c,a){var b=c;this._sourceRoot&&(b=k.relative(this._sourceRoot,b));null!==a?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[k.toSetString(b)]=a):(delete this._sourcesContents[k.toSetString(b)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};g.prototype.applySourceMap=function(c,a){a||(a=c.file);var b=this._sourceRoot;b&&(a=k.relative(b,a));var d=new l,e=new l;this._mappings.forEach(function(g){if(g.source===
a&&g.originalLine){var l=c.originalPositionFor({line:g.originalLine,column:g.originalColumn});null!==l.source&&(g.source=b?k.relative(b,l.source):l.source,g.originalLine=l.line,g.originalColumn=l.column,null!==l.name&&null!==g.name&&(g.name=l.name))}(l=g.source)&&!d.has(l)&&d.add(l);(g=g.name)&&!e.has(g)&&e.add(g)},this);this._sources=d;this._names=e;c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&(b&&(a=k.relative(b,a)),this.setSourceContent(a,d))},this)};g.prototype._validateMapping=
function(c,a,b,d){if(!(c&&"line"in c&&"column"in c&&0<c.line&&0<=c.column&&!a&&!b&&!d||c&&"line"in c&&"column"in c&&a&&"line"in a&&"column"in a&&0<c.line&&0<=c.column&&0<a.line&&0<=a.column&&b))throw Error("Invalid mapping: "+JSON.stringify({generated:c,source:b,original:a,name:d}));};g.prototype._serializeMappings=function(){var c=0,a=1,b=0,e=0,g=0,l=0,h="",w;this._mappings.sort(k.compareByGeneratedPositions);for(var y=0,p=this._mappings.length;y<p;y++){w=this._mappings[y];if(w.generatedLine!==a)for(c=
0;w.generatedLine!==a;)h+=";",a++;else if(0<y){if(!k.compareByGeneratedPositions(w,this._mappings[y-1]))continue;h+=","}h+=d.encode(w.generatedColumn-c);c=w.generatedColumn;w.source&&(h+=d.encode(this._sources.indexOf(w.source)-l),l=this._sources.indexOf(w.source),h+=d.encode(w.originalLine-1-e),e=w.originalLine-1,h+=d.encode(w.originalColumn-b),b=w.originalColumn,w.name&&(h+=d.encode(this._names.indexOf(w.name)-g),g=this._names.indexOf(w.name)))}return h};g.prototype._generateSourcesContent=function(c,
a){return c.map(function(b){if(!this._sourcesContents)return null;a&&(b=k.relative(a,b));b=k.toSetString(b);return Object.prototype.hasOwnProperty.call(this._sourcesContents,b)?this._sourcesContents[b]:null},this)};g.prototype.toJSON=function(){var c={version:this._version,file:this._file,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};this._sourceRoot&&(c.sourceRoot=this._sourceRoot);this._sourcesContents&&(c.sourcesContent=this._generateSourcesContent(c.sources,
c.sourceRoot));return c};g.prototype.toString=function(){return JSON.stringify(this)};h.SourceMapGenerator=g})},{"./array-set":9,"./base64-vlq":10,"./util":16,amdefine:17}],15:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(d,c,a,b,e){this.children=[];this.sourceContents={};this.line=void 0===d?null:d;this.column=void 0===c?null:c;this.source=void 0===a?null:a;this.name=void 0===e?null:e;null!=b&&this.add(b)}var d=e("./source-map-generator").SourceMapGenerator,
k=e("./util");g.fromStringWithSourceMap=function(d,c){function a(a,c){null===a||void 0===a.source?b.add(c):b.add(new g(a.originalLine,a.originalColumn,a.source,c,a.name))}var b=new g,e=d.split("\n"),h=1,k=0,p=null;c.eachMapping(function(c){if(null===p){for(;h<c.generatedLine;)b.add(e.shift()+"\n"),h++;if(k<c.generatedColumn){var d=e[0];b.add(d.substr(0,c.generatedColumn));e[0]=d.substr(c.generatedColumn);k=c.generatedColumn}}else{if(h<c.generatedLine){var g="";do g+=e.shift()+"\n",h++,k=0;while(h<
c.generatedLine);k<c.generatedColumn&&(d=e[0],g+=d.substr(0,c.generatedColumn),e[0]=d.substr(c.generatedColumn),k=c.generatedColumn)}else d=e[0],g=d.substr(0,c.generatedColumn-k),e[0]=d.substr(c.generatedColumn-k),k=c.generatedColumn;a(p,g)}p=c},this);a(p,e.join("\n"));c.sources.forEach(function(a){var d=c.sourceContentFor(a);d&&b.setSourceContent(a,d)});return b};g.prototype.add=function(d){if(Array.isArray(d))d.forEach(function(c){this.add(c)},this);else if(d instanceof g||"string"===typeof d)d&&
this.children.push(d);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+d);return this};g.prototype.prepend=function(d){if(Array.isArray(d))for(var c=d.length-1;0<=c;c--)this.prepend(d[c]);else if(d instanceof g||"string"===typeof d)this.children.unshift(d);else throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+d);return this};g.prototype.walk=function(d){for(var c,a=0,b=this.children.length;a<b;a++)c=
this.children[a],c instanceof g?c.walk(d):""!==c&&d(c,{source:this.source,line:this.line,column:this.column,name:this.name})};g.prototype.join=function(d){var c,a,b=this.children.length;if(0<b){c=[];for(a=0;a<b-1;a++)c.push(this.children[a]),c.push(d);c.push(this.children[a]);this.children=c}return this};g.prototype.replaceRight=function(d,c){var a=this.children[this.children.length-1];a instanceof g?a.replaceRight(d,c):"string"===typeof a?this.children[this.children.length-1]=a.replace(d,c):this.children.push("".replace(d,
c));return this};g.prototype.setSourceContent=function(d,c){this.sourceContents[k.toSetString(d)]=c};g.prototype.walkSourceContents=function(d){for(var c=0,a=this.children.length;c<a;c++)this.children[c]instanceof g&&this.children[c].walkSourceContents(d);for(var b=Object.keys(this.sourceContents),c=0,a=b.length;c<a;c++)d(k.fromSetString(b[c]),this.sourceContents[b[c]])};g.prototype.toString=function(){var d="";this.walk(function(c){d+=c});return d};g.prototype.toStringWithSourceMap=function(e){var c=
"",a=1,b=0,g=new d(e),h=!1,k=null,p=null,w=null,m=null;this.walk(function(d,e){c+=d;null!==e.source&&null!==e.line&&null!==e.column?(k===e.source&&p===e.line&&w===e.column&&m===e.name||g.addMapping({source:e.source,original:{line:e.line,column:e.column},generated:{line:a,column:b},name:e.name}),k=e.source,p=e.line,w=e.column,m=e.name,h=!0):h&&(g.addMapping({generated:{line:a,column:b}}),k=null,h=!1);d.split("").forEach(function(c){"\n"===c?(a++,b=0):b++})});this.walkSourceContents(function(a,b){g.setSourceContent(a,
b)});return{code:c,map:g}};h.SourceNode=g})},{"./source-map-generator":14,"./util":16,amdefine:17}],16:[function(h,r,m){if("function"!==typeof e)var e=h("amdefine")(r,h);e(function(e,h,m){function g(a){return(a=a.match(l))?{scheme:a[1],auth:a[3],host:a[4],port:a[6],path:a[7]}:null}function d(a){var b=a.scheme+"://";a.auth&&(b+=a.auth+"@");a.host&&(b+=a.host);a.port&&(b+=":"+a.port);a.path&&(b+=a.path);return b}function k(a,b){var c=a||"",d=b||"";return(c>d)-(c<d)}h.getArg=function(a,b,c){if(b in a)return a[b];
if(3===arguments.length)return c;throw Error('"'+b+'" is a required argument.');};var l=/([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/,c=/^data:.+\,.+/;h.urlParse=g;h.urlGenerate=d;h.join=function(a,b){var e;return b.match(l)||b.match(c)?b:"/"===b.charAt(0)&&(e=g(a))?(e.path=b,d(e)):a.replace(/\/$/,"")+"/"+b};h.toSetString=function(a){return"$"+a};h.fromSetString=function(a){return a.substr(1)};h.relative=function(a,b){a=a.replace(/\/$/,"");var c=g(a);return"/"==b.charAt(0)&&c&&"/"==c.path?
b.slice(1):0===b.indexOf(a+"/")?b.substr(a.length+1):b};h.compareByOriginalPositions=function(a,b,c){var d;return(d=k(a.source,b.source))||(d=a.originalLine-b.originalLine)||(d=a.originalColumn-b.originalColumn)||c||(d=k(a.name,b.name))?d:(d=a.generatedLine-b.generatedLine)?d:a.generatedColumn-b.generatedColumn};h.compareByGeneratedPositions=function(a,b,c){var d;return(d=a.generatedLine-b.generatedLine)||(d=a.generatedColumn-b.generatedColumn)||c||(d=k(a.source,b.source))||(d=a.originalLine-b.originalLine)?
d:(d=a.originalColumn-b.originalColumn)?d:k(a.name,b.name)}})},{amdefine:17}],17:[function(h,r,m){(function(e,p){r.exports=function(m,r){function g(a,b){var c;if(a&&"."===a.charAt(0)&&b){c=b.split("/");c=c.slice(0,c.length-1);var d=c=c.concat(a.split("/")),e,g;for(e=0;d[e];e+=1)if(g=d[e],"."===g)d.splice(e,1),--e;else if(".."===g)if(1!==e||".."!==d[2]&&".."!==d[0])0<e&&(d.splice(e-1,2),e-=2);else break;a=c.join("/")}return a}function d(a){return function(b){return g(b,a)}}function k(a){function c(d){b[a]=
d}c.fromText=function(a,b){throw Error("amdefine does not implement load.fromText");};return c}function l(a,c,d){var e,g,h;if(a)g=b[a]={},h={id:a,uri:p,exports:g},e=B(r,g,h,a);else{if(z)throw Error("amdefine with no module ID cannot be called more than once per file.");z=!0;g=m.exports;h=m;e=B(r,g,h,m.id)}c&&(c=c.map(function(a){return e(a)}));c="function"===typeof d?d.apply(h.exports,c):d;void 0!==c&&(h.exports=c,a&&(b[a]=h.exports))}function c(b,c,d){Array.isArray(b)?(d=c,c=b,b=void 0):"string"!==
typeof b&&(d=b,b=c=void 0);c&&!Array.isArray(c)&&(d=c,c=void 0);c||(c=["require","exports","module"]);b?a[b]=[b,c,d]:l(b,c,d)}var a={},b={},z=!1,D=h("path"),B,E;B=function(a,b,c,d){function h(g,k){if("string"===typeof g)return E(a,b,c,g,d);g=g.map(function(e){return E(a,b,c,e,d)});e.nextTick(function(){k.apply(null,g)})}h.toUrl=function(a){return 0===a.indexOf(".")?g(a,D.dirname(c.filename)):a};return h};r=r||function(){return m.require.apply(m,arguments)};E=function(c,e,h,m,p){var r=m.indexOf("!"),
G=m;if(-1===r){m=g(m,p);if("require"===m)return B(c,e,h,p);if("exports"===m)return e;if("module"===m)return h;if(b.hasOwnProperty(m))return b[m];if(a[m])return l.apply(null,a[m]),b[m];if(c)return c(G);throw Error("No module with ID: "+m);}G=m.substring(0,r);m=m.substring(r+1,m.length);r=E(c,e,h,G,p);m=r.normalize?r.normalize(m,d(p)):g(m,p);b[m]||r.load(m,B(c,e,h,p),k(m),{});return b[m]};c.require=function(c){if(b[c])return b[c];if(a[c])return l.apply(null,a[c]),b[c]};c.amd={};return c}}).call(this,
h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),"/node_modules/source-map/node_modules/amdefine/amdefine.js")},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,path:7}],18:[function(h,r,m){(function(e,p){function r(){return"undefined"!==typeof window&&"function"===typeof XMLHttpRequest}function A(a){if(a in F)return F[a];try{if(r()){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);var c=4===b.readyState?
b.responseText:null}else c=y.readFileSync(a,"utf8")}catch(d){c=null}return F[a]=c}function g(a,b){if(!a)return b;var c=w.dirname(a),d=/^\w+:\/\/[^\/]*/.exec(c),d=d?d[0]:"";return d+w.resolve(c.slice(d.length),b)}function d(a){var b;a:{if(r()&&(b=new XMLHttpRequest,b.open("GET",a,!1),b.send(null),b=b.getResponseHeader("SourceMap")||b.getResponseHeader("X-SourceMap")))break a;b=A(a);b=(b=/\/\/[#@]\s*sourceMappingURL=(.*)\s*$/m.exec(b))?b[1]:null}if(!b)return null;"data:application/json;base64,"==b.slice(0,
29).toLowerCase()?(a=(new p(b.slice(29),"base64")).toString(),b=null):(b=g(a,b),a=A(b,"utf8"));return a?{url:b,map:a}:null}function k(a){var b=C[a.source];if(!b){var c=d(a.source);c?(b=C[a.source]={url:c.url,map:new E(c.map)},b.map.sourcesContent&&b.map.sources.forEach(function(a,c){var d=b.map.sourcesContent[c];if(d){var e=g(b.url,a);F[e]=d}})):b=C[a.source]={url:null,map:null}}return b&&b.map&&(c=b.map.originalPositionFor(a),null!==c.source)?(c.source=g(b.url,c.source),c):a}function l(a){var b=
/^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(a);return b?(a=k({source:b[2],line:b[3],column:b[4]-1}),"eval at "+b[1]+" ("+a.source+":"+a.line+":"+(a.column+1)+")"):(b=/^eval at ([^(]+) \((.+)\)$/.exec(a))?"eval at "+b[1]+" ("+l(b[2])+")":a}function c(){var a,b="";this.isNative()?b="native":(a=this.getScriptNameOrSourceURL(),!a&&this.isEval()&&(b=this.getEvalOrigin(),b+=", "),b=a?b+a:b+"<anonymous>",a=this.getLineNumber(),null!=a&&(b+=":"+a,(a=this.getColumnNumber())&&(b+=":"+a)));a="";var c=this.getFunctionName(),
d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?a+="new "+(c||"<anonymous>"):c?a+=c:(a+=b,d=!1);else{var e=this.getTypeName(),g=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(a+=e+"."),a+=c,g&&c.indexOf("."+g)!=c.length-g.length-1&&(a+=" [as "+g+"]")):a+=e+"."+(g||"<anonymous>")}d&&(a+=" ("+b+")");return a}function a(a){var b={};Object.getOwnPropertyNames(Object.getPrototypeOf(a)).forEach(function(c){b[c]=/^(?:is|get)/.test(c)?function(){return a[c].call(a)}:a[c]});b.toString=c;return b}function b(b){var c=
b.getFileName()||b.getScriptNameOrSourceURL();if(c){var d=k({source:c,line:b.getLineNumber(),column:b.getColumnNumber()-1});b=a(b);b.getFileName=function(){return d.source};b.getLineNumber=function(){return d.line};b.getColumnNumber=function(){return d.column+1};b.getScriptNameOrSourceURL=function(){return d.source};return b}var e=b.isEval()&&b.getEvalOrigin();e&&(e=l(e),b=a(b),b.getEvalOrigin=function(){return e});return b}function z(a,c){t&&(F={},C={});return a+c.map(function(a){return"\n at "+
b(a)}).join("")}function D(a){var b=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2],b=+b[3],d=F[a];!d&&y.existsSync(a)&&(d=y.readFileSync(a,"utf8"));if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return"\n"+a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function B(a){if(a&&a.stack){var b=D(a);null!==b&&console.log(b);console.log(a.stack)}else console.log("Uncaught exception:",a);e.exit(1)}var E=h("source-map").SourceMapConsumer,w=h("path"),y=h("fs"),H=!1,t=!1,F={},C=
{};m.wrapCallSite=b;m.getErrorSource=D;m.mapSourcePosition=k;m.retrieveSourceMap=d;m.install=function(a){if(!H){H=!0;Error.prepareStackTrace=z;a=a||{};var b="handleUncaughtExceptions"in a?a.handleUncaughtExceptions:!0;t="emptyCacheBetweenOperations"in a?a.emptyCacheBetweenOperations:!1;a.retrieveFile&&(A=a.retrieveFile);a.retrieveSourceMap&&(d=a.retrieveSourceMap);if(b&&!r())e.on("uncaughtException",B)}}}).call(this,h("node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js"),
h("buffer").Buffer)},{"node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js":6,buffer:3,fs:2,path:7,"source-map":8}]},{},[1]);return K});

View File

@@ -0,0 +1,6 @@
<p>
Make sure to run build.js.
This test should say either "Test failed" or "Test passed":
</p>
<script src="../browser-source-map-support.js"></script>
<script src="script.js"></script>

View File

@@ -0,0 +1,12 @@
sourceMapSupport.install()
foo = -> throw new Error 'foo'
try
foo()
catch e
if /\bscript\.coffee\b/.test e.stack
document.body.appendChild document.createTextNode 'Test passed'
else
document.body.appendChild document.createTextNode 'Test failed'
console.log e.stack

View File

@@ -0,0 +1,25 @@
// Generated by CoffeeScript 1.7.1
(function() {
var e, foo;
sourceMapSupport.install();
foo = function() {
throw new Error('foo');
};
try {
foo();
} catch (_error) {
e = _error;
if (/\bscript\.coffee\b/.test(e.stack)) {
document.body.appendChild(document.createTextNode('Test passed'));
} else {
document.body.appendChild(document.createTextNode('Test failed'));
console.log(e.stack);
}
}
}).call(this);
//# sourceMappingURL=script.map

View File

@@ -0,0 +1,10 @@
{
"version": 3,
"file": "script.js",
"sourceRoot": "..",
"sources": [
"browser-test/script.coffee"
],
"names": [],
"mappings": ";AAAA;AAAA,MAAA,MAAA;;AAAA,EAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;;AAAA,EAEA,GAAA,GAAM,SAAA,GAAA;AAAG,UAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;EAAA,CAFN,CAAA;;AAIA;AACE,IAAA,GAAA,CAAA,CAAA,CADF;GAAA,cAAA;AAGE,IADI,UACJ,CAAA;AAAA,IAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;AACE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CADF;KAAA,MAAA;AAGE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;AAAA,MACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,CADA,CAHF;KAHF;GAJA;AAAA"
}

69
react-app/node_modules/source-map-support/build.js generated vendored Executable file
View File

@@ -0,0 +1,69 @@
#!/usr/bin/env node
var fs = require('fs');
var querystring = require('querystring');
var child_process = require('child_process');
function run(command, callback) {
console.log(command);
child_process.exec(command, callback);
}
// Use browserify to package up source-map-support.js
fs.writeFileSync('.temp.js', 'sourceMapSupport = require("./source-map-support");');
run('node_modules/browserify/bin/cmd.js .temp.js', function(error, stdout) {
if (error) throw error;
// Wrap the code so it works both as a normal <script> module and as an AMD module
var header = [
'/*',
' * Support for source maps in V8 stack traces',
' * https://github.com/evanw/node-source-map-support',
' */',
].join('\n');
var code = [
'(this["define"] || function(name, callback) { this["sourceMapSupport"] = callback(); })("browser-source-map-support", function(sourceMapSupport) {',
stdout.replace(/\bbyte\b/g, 'bite').replace(new RegExp(__dirname + '/', 'g'), '').replace(/@license/g, 'license'),
'return sourceMapSupport});',
].join('\n');
// Use the online Google Closure Compiler service for minification
fs.writeFileSync('.temp.js', querystring.stringify({
compilation_level: 'SIMPLE_OPTIMIZATIONS',
output_info: 'compiled_code',
output_format: 'text',
js_code: code
}));
run('curl -d @.temp.js "http://closure-compiler.appspot.com/compile"', function(error, stdout) {
if (error) throw error;
var code = header + '\n' + stdout;
fs.unlinkSync('.temp.js');
fs.writeFileSync('browser-source-map-support.js', code);
fs.writeFileSync('amd-test/browser-source-map-support.js', code);
});
});
// Build the AMD test
run('node_modules/coffee-script/bin/coffee --map --compile amd-test/script.coffee', function(error) {
if (error) throw error;
});
// Build the browserify test
run('node_modules/coffee-script/bin/coffee --map --compile browserify-test/script.coffee', function(error) {
if (error) throw error;
run('node_modules/browserify/bin/cmd.js --debug browserify-test/script.js > browserify-test/compiled.js', function(error) {
if (error) throw error;
})
});
// Build the browser test
run('node_modules/coffee-script/bin/coffee --map --compile browser-test/script.coffee', function(error) {
if (error) throw error;
});
// Build the header test
run('node_modules/coffee-script/bin/coffee --map --compile header-test/script.coffee', function(error) {
if (error) throw error;
var contents = fs.readFileSync('header-test/script.js', 'utf8');
fs.writeFileSync('header-test/script.js', contents.replace(/\/\/# sourceMappingURL=.*/g, ''))
});

View File

@@ -0,0 +1,6 @@
<p>
Make sure to run build.js, then run server.js and visit <a href="http://localhost:1337/">http://localhost:1337/</a>.
This test should say either "Test failed" or "Test passed":
</p>
<script src="browser-source-map-support.js"></script>
<script src="script.js"></script>

View File

@@ -0,0 +1,12 @@
sourceMapSupport.install()
foo = -> throw new Error 'foo'
try
foo()
catch e
if /\bscript\.coffee\b/.test e.stack
document.body.appendChild document.createTextNode 'Test passed'
else
document.body.appendChild document.createTextNode 'Test failed'
console.log e.stack

View File

@@ -0,0 +1,25 @@
// Generated by CoffeeScript 1.7.1
(function() {
var e, foo;
sourceMapSupport.install();
foo = function() {
throw new Error('foo');
};
try {
foo();
} catch (_error) {
e = _error;
if (/\bscript\.coffee\b/.test(e.stack)) {
document.body.appendChild(document.createTextNode('Test passed'));
} else {
document.body.appendChild(document.createTextNode('Test failed'));
console.log(e.stack);
}
}
}).call(this);

View File

@@ -0,0 +1,10 @@
{
"version": 3,
"file": "script.js",
"sourceRoot": "..",
"sources": [
"header-test/script.coffee"
],
"names": [],
"mappings": ";AAAA;AAAA,MAAA,MAAA;;AAAA,EAAA,gBAAgB,CAAC,OAAjB,CAAA,CAAA,CAAA;;AAAA,EAEA,GAAA,GAAM,SAAA,GAAA;AAAG,UAAU,IAAA,KAAA,CAAM,KAAN,CAAV,CAAH;EAAA,CAFN,CAAA;;AAIA;AACE,IAAA,GAAA,CAAA,CAAA,CADF;GAAA,cAAA;AAGE,IADI,UACJ,CAAA;AAAA,IAAA,IAAG,oBAAoB,CAAC,IAArB,CAA0B,CAAC,CAAC,KAA5B,CAAH;AACE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CADF;KAAA,MAAA;AAGE,MAAA,QAAQ,CAAC,IAAI,CAAC,WAAd,CAA0B,QAAQ,CAAC,cAAT,CAAwB,aAAxB,CAA1B,CAAA,CAAA;AAAA,MACA,OAAO,CAAC,GAAR,CAAY,CAAC,CAAC,KAAd,CADA,CAHF;KAHF;GAJA;AAAA"
}

View File

@@ -0,0 +1,45 @@
var fs = require('fs');
var http = require('http');
http.createServer(function(req, res) {
switch (req.url) {
case '/':
case '/index.html': {
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(fs.readFileSync('index.html', 'utf8'));
break;
}
case '/browser-source-map-support.js': {
res.writeHead(200, { 'Content-Type': 'text/javascript' });
res.end(fs.readFileSync('../browser-source-map-support.js', 'utf8'));
break;
}
case '/script.js': {
res.writeHead(200, { 'Content-Type': 'text/javascript', 'SourceMap': 'script-source-map.map' });
res.end(fs.readFileSync('script.js', 'utf8'));
break;
}
case '/script-source-map.map': {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(fs.readFileSync('script.map', 'utf8'));
break;
}
case '/header-test/script.coffee': {
res.writeHead(200, { 'Content-Type': 'text/x-coffeescript' });
res.end(fs.readFileSync('script.coffee', 'utf8'));
break;
}
default: {
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('404 not found');
break;
}
}
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

View File

@@ -0,0 +1,2 @@
dist/*
node_modules/*

View File

@@ -0,0 +1,4 @@
language: node_js
node_js:
- 0.8
- "0.10"

View File

@@ -0,0 +1,121 @@
# Change Log
## 0.1.32
* Fixed a bug where SourceMapConsumer couldn't handle negative relative columns
(issue 92).
* Fixed test runner to actually report number of failed tests as its process
exit code.
* Fixed a typo when reporting bad mappings (issue 87).
## 0.1.31
* Delay parsing the mappings in SourceMapConsumer until queried for a source
location.
* Support Sass source maps (which at the time of writing deviate from the spec
in small ways) in SourceMapConsumer.
## 0.1.30
* Do not join source root with a source, when the source is a data URI.
* Extend the test runner to allow running single specific test files at a time.
* Performance improvements in `SourceNode.prototype.walk` and
`SourceMapConsumer.prototype.eachMapping`.
* Source map browser builds will now work inside Workers.
* Better error messages when attempting to add an invalid mapping to a
`SourceMapGenerator`.
## 0.1.29
* Allow duplicate entries in the `names` and `sources` arrays of source maps
(usually from TypeScript) we are parsing. Fixes github isse 72.
## 0.1.28
* Skip duplicate mappings when creating source maps from SourceNode; github
issue 75.
## 0.1.27
* Don't throw an error when the `file` property is missing in SourceMapConsumer,
we don't use it anyway.
## 0.1.26
* Fix SourceNode.fromStringWithSourceMap for empty maps. Fixes github issue 70.
## 0.1.25
* Make compatible with browserify
## 0.1.24
* Fix issue with absolute paths and `file://` URIs. See
https://bugzilla.mozilla.org/show_bug.cgi?id=885597
## 0.1.23
* Fix issue with absolute paths and sourcesContent, github issue 64.
## 0.1.22
* Ignore duplicate mappings in SourceMapGenerator. Fixes github issue 21.
## 0.1.21
* Fixed handling of sources that start with a slash so that they are relative to
the source root's host.
## 0.1.20
* Fixed github issue #43: absolute URLs aren't joined with the source root
anymore.
## 0.1.19
* Using Travis CI to run tests.
## 0.1.18
* Fixed a bug in the handling of sourceRoot.
## 0.1.17
* Added SourceNode.fromStringWithSourceMap.
## 0.1.16
* Added missing documentation.
* Fixed the generating of empty mappings in SourceNode.
## 0.1.15
* Added SourceMapGenerator.applySourceMap.
## 0.1.14
* The sourceRoot is now handled consistently.
## 0.1.13
* Added SourceMapGenerator.fromSourceMap.
## 0.1.12
* SourceNode now generates empty mappings too.
## 0.1.11
* Added name support to SourceNode.
## 0.1.10
* Added sourcesContent support to the customer and generator.

View File

@@ -0,0 +1,28 @@
Copyright (c) 2009-2011, Mozilla Foundation and contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the names of the Mozilla Foundation nor the names of project
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -0,0 +1,166 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
var path = require('path');
var fs = require('fs');
var copy = require('dryice').copy;
function removeAmdefine(src) {
src = String(src).replace(
/if\s*\(typeof\s*define\s*!==\s*'function'\)\s*{\s*var\s*define\s*=\s*require\('amdefine'\)\(module,\s*require\);\s*}\s*/g,
'');
src = src.replace(
/\b(define\(.*)('amdefine',?)/gm,
'$1');
return src;
}
removeAmdefine.onRead = true;
function makeNonRelative(src) {
return src
.replace(/require\('.\//g, 'require(\'source-map/')
.replace(/\.\.\/\.\.\/lib\//g, '');
}
makeNonRelative.onRead = true;
function buildBrowser() {
console.log('\nCreating dist/source-map.js');
var project = copy.createCommonJsProject({
roots: [ path.join(__dirname, 'lib') ]
});
copy({
source: [
'build/mini-require.js',
{
project: project,
require: [ 'source-map/source-map-generator',
'source-map/source-map-consumer',
'source-map/source-node']
},
'build/suffix-browser.js'
],
filter: [
copy.filter.moduleDefines,
removeAmdefine
],
dest: 'dist/source-map.js'
});
}
function buildBrowserMin() {
console.log('\nCreating dist/source-map.min.js');
copy({
source: 'dist/source-map.js',
filter: copy.filter.uglifyjs,
dest: 'dist/source-map.min.js'
});
}
function buildFirefox() {
console.log('\nCreating dist/SourceMap.jsm');
var project = copy.createCommonJsProject({
roots: [ path.join(__dirname, 'lib') ]
});
copy({
source: [
'build/prefix-source-map.jsm',
{
project: project,
require: [ 'source-map/source-map-consumer',
'source-map/source-map-generator',
'source-map/source-node' ]
},
'build/suffix-source-map.jsm'
],
filter: [
copy.filter.moduleDefines,
removeAmdefine,
makeNonRelative
],
dest: 'dist/SourceMap.jsm'
});
// Create dist/test/Utils.jsm
console.log('\nCreating dist/test/Utils.jsm');
project = copy.createCommonJsProject({
roots: [ __dirname, path.join(__dirname, 'lib') ]
});
copy({
source: [
'build/prefix-utils.jsm',
'build/assert-shim.js',
{
project: project,
require: [ 'test/source-map/util' ]
},
'build/suffix-utils.jsm'
],
filter: [
copy.filter.moduleDefines,
removeAmdefine,
makeNonRelative
],
dest: 'dist/test/Utils.jsm'
});
function isTestFile(f) {
return /^test\-.*?\.js/.test(f);
}
var testFiles = fs.readdirSync(path.join(__dirname, 'test', 'source-map')).filter(isTestFile);
testFiles.forEach(function (testFile) {
console.log('\nCreating', path.join('dist', 'test', testFile.replace(/\-/g, '_')));
copy({
source: [
'build/test-prefix.js',
path.join('test', 'source-map', testFile),
'build/test-suffix.js'
],
filter: [
removeAmdefine,
makeNonRelative,
function (input, source) {
return input.replace('define(',
'define("'
+ path.join('test', 'source-map', testFile.replace(/\.js$/, ''))
+ '", ["require", "exports", "module"], ');
},
function (input, source) {
return input.replace('{THIS_MODULE}', function () {
return "test/source-map/" + testFile.replace(/\.js$/, '');
});
}
],
dest: path.join('dist', 'test', testFile.replace(/\-/g, '_'))
});
});
}
function ensureDir(name) {
var dirExists = false;
try {
dirExists = fs.statSync(name).isDirectory();
} catch (err) {}
if (!dirExists) {
fs.mkdirSync(name, 0777);
}
}
ensureDir("dist");
ensureDir("dist/test");
buildFirefox();
buildBrowser();
buildBrowserMin();

View File

@@ -0,0 +1,434 @@
# Source Map
This is a library to generate and consume the source map format
[described here][format].
This library is written in the Asynchronous Module Definition format, and works
in the following environments:
* Modern Browsers supporting ECMAScript 5 (either after the build, or with an
AMD loader such as RequireJS)
* Inside Firefox (as a JSM file, after the build)
* With NodeJS versions 0.8.X and higher
## Node
$ npm install source-map
## Building from Source (for everywhere else)
Install Node and then run
$ git clone https://fitzgen@github.com/mozilla/source-map.git
$ cd source-map
$ npm link .
Next, run
$ node Makefile.dryice.js
This should spew a bunch of stuff to stdout, and create the following files:
* `dist/source-map.js` - The unminified browser version.
* `dist/source-map.min.js` - The minified browser version.
* `dist/SourceMap.jsm` - The JavaScript Module for inclusion in Firefox source.
## Examples
### Consuming a source map
var rawSourceMap = {
version: 3,
file: 'min.js',
names: ['bar', 'baz', 'n'],
sources: ['one.js', 'two.js'],
sourceRoot: 'http://example.com/www/js/',
mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
};
var smc = new SourceMapConsumer(rawSourceMap);
console.log(smc.sources);
// [ 'http://example.com/www/js/one.js',
// 'http://example.com/www/js/two.js' ]
console.log(smc.originalPositionFor({
line: 2,
column: 28
}));
// { source: 'http://example.com/www/js/two.js',
// line: 2,
// column: 10,
// name: 'n' }
console.log(smc.generatedPositionFor({
source: 'http://example.com/www/js/two.js',
line: 2,
column: 10
}));
// { line: 2, column: 28 }
smc.eachMapping(function (m) {
// ...
});
### Generating a source map
In depth guide:
[**Compiling to JavaScript, and Debugging with Source Maps**](https://hacks.mozilla.org/2013/05/compiling-to-javascript-and-debugging-with-source-maps/)
#### With SourceNode (high level API)
function compile(ast) {
switch (ast.type) {
case 'BinaryExpression':
return new SourceNode(
ast.location.line,
ast.location.column,
ast.location.source,
[compile(ast.left), " + ", compile(ast.right)]
);
case 'Literal':
return new SourceNode(
ast.location.line,
ast.location.column,
ast.location.source,
String(ast.value)
);
// ...
default:
throw new Error("Bad AST");
}
}
var ast = parse("40 + 2", "add.js");
console.log(compile(ast).toStringWithSourceMap({
file: 'add.js'
}));
// { code: '40 + 2',
// map: [object SourceMapGenerator] }
#### With SourceMapGenerator (low level API)
var map = new SourceMapGenerator({
file: "source-mapped.js"
});
map.addMapping({
generated: {
line: 10,
column: 35
},
source: "foo.js",
original: {
line: 33,
column: 2
},
name: "christopher"
});
console.log(map.toString());
// '{"version":3,"file":"source-mapped.js","sources":["foo.js"],"names":["christopher"],"mappings":";;;;;;;;;mCAgCEA"}'
## API
Get a reference to the module:
// NodeJS
var sourceMap = require('source-map');
// Browser builds
var sourceMap = window.sourceMap;
// Inside Firefox
let sourceMap = {};
Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap);
### SourceMapConsumer
A SourceMapConsumer instance represents a parsed source map which we can query
for information about the original file positions by giving it a file position
in the generated source.
#### new SourceMapConsumer(rawSourceMap)
The only parameter is the raw source map (either as a string which can be
`JSON.parse`'d, or an object). According to the spec, source maps have the
following attributes:
* `version`: Which version of the source map spec this map is following.
* `sources`: An array of URLs to the original source files.
* `names`: An array of identifiers which can be referrenced by individual
mappings.
* `sourceRoot`: Optional. The URL root from which all sources are relative.
* `sourcesContent`: Optional. An array of contents of the original source files.
* `mappings`: A string of base64 VLQs which contain the actual mappings.
* `file`: The generated filename this source map is associated with.
#### SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
Returns the original source, line, and column information for the generated
source's line and column positions provided. The only argument is an object with
the following properties:
* `line`: The line number in the generated source.
* `column`: The column number in the generated source.
and an object is returned with the following properties:
* `source`: The original source file, or null if this information is not
available.
* `line`: The line number in the original source, or null if this information is
not available.
* `column`: The column number in the original source, or null or null if this
information is not available.
* `name`: The original identifier, or null if this information is not available.
#### SourceMapConsumer.prototype.generatedPositionFor(originalPosition)
Returns the generated line and column information for the original source,
line, and column positions provided. The only argument is an object with
the following properties:
* `source`: The filename of the original source.
* `line`: The line number in the original source.
* `column`: The column number in the original source.
and an object is returned with the following properties:
* `line`: The line number in the generated source, or null.
* `column`: The column number in the generated source, or null.
#### SourceMapConsumer.prototype.sourceContentFor(source)
Returns the original source content for the source provided. The only
argument is the URL of the original source file.
#### SourceMapConsumer.prototype.eachMapping(callback, context, order)
Iterate over each mapping between an original source/line/column and a
generated line/column in this source map.
* `callback`: The function that is called with each mapping. Mappings have the
form `{ source, generatedLine, generatedColumn, originalLine, originalColumn,
name }`
* `context`: Optional. If specified, this object will be the value of `this`
every time that `callback` is called.
* `order`: Either `SourceMapConsumer.GENERATED_ORDER` or
`SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to iterate over
the mappings sorted by the generated file's line/column order or the
original's source/line/column order, respectively. Defaults to
`SourceMapConsumer.GENERATED_ORDER`.
### SourceMapGenerator
An instance of the SourceMapGenerator represents a source map which is being
built incrementally.
#### new SourceMapGenerator(startOfSourceMap)
To create a new one, you must pass an object with the following properties:
* `file`: The filename of the generated source that this source map is
associated with.
* `sourceRoot`: An optional root for all relative URLs in this source map.
#### SourceMapGenerator.fromSourceMap(sourceMapConsumer)
Creates a new SourceMapGenerator based on a SourceMapConsumer
* `sourceMapConsumer` The SourceMap.
#### SourceMapGenerator.prototype.addMapping(mapping)
Add a single mapping from original source line and column to the generated
source's line and column for this source map being created. The mapping object
should have the following properties:
* `generated`: An object with the generated line and column positions.
* `original`: An object with the original line and column positions.
* `source`: The original source file (relative to the sourceRoot).
* `name`: An optional original token name for this mapping.
#### SourceMapGenerator.prototype.setSourceContent(sourceFile, sourceContent)
Set the source content for an original source file.
* `sourceFile` the URL of the original source file.
* `sourceContent` the content of the source file.
#### SourceMapGenerator.prototype.applySourceMap(sourceMapConsumer[, sourceFile])
Applies a SourceMap for a source file to the SourceMap.
Each mapping to the supplied source file is rewritten using the
supplied SourceMap. Note: The resolution for the resulting mappings
is the minimium of this map and the supplied map.
* `sourceMapConsumer`: The SourceMap to be applied.
* `sourceFile`: Optional. The filename of the source file.
If omitted, sourceMapConsumer.file will be used.
#### SourceMapGenerator.prototype.toString()
Renders the source map being generated to a string.
### SourceNode
SourceNodes provide a way to abstract over interpolating and/or concatenating
snippets of generated JavaScript source code, while maintaining the line and
column information associated between those snippets and the original source
code. This is useful as the final intermediate representation a compiler might
use before outputting the generated JS and source map.
#### new SourceNode(line, column, source[, chunk[, name]])
* `line`: The original line number associated with this source node, or null if
it isn't associated with an original line.
* `column`: The original column number associated with this source node, or null
if it isn't associated with an original column.
* `source`: The original source's filename.
* `chunk`: Optional. Is immediately passed to `SourceNode.prototype.add`, see
below.
* `name`: Optional. The original identifier.
#### SourceNode.fromStringWithSourceMap(code, sourceMapConsumer)
Creates a SourceNode from generated code and a SourceMapConsumer.
* `code`: The generated code
* `sourceMapConsumer` The SourceMap for the generated code
#### SourceNode.prototype.add(chunk)
Add a chunk of generated JS to this source node.
* `chunk`: A string snippet of generated JS code, another instance of
`SourceNode`, or an array where each member is one of those things.
#### SourceNode.prototype.prepend(chunk)
Prepend a chunk of generated JS to this source node.
* `chunk`: A string snippet of generated JS code, another instance of
`SourceNode`, or an array where each member is one of those things.
#### SourceNode.prototype.setSourceContent(sourceFile, sourceContent)
Set the source content for a source file. This will be added to the
`SourceMap` in the `sourcesContent` field.
* `sourceFile`: The filename of the source file
* `sourceContent`: The content of the source file
#### SourceNode.prototype.walk(fn)
Walk over the tree of JS snippets in this node and its children. The walking
function is called once for each snippet of JS and is passed that snippet and
the its original associated source's line/column location.
* `fn`: The traversal function.
#### SourceNode.prototype.walkSourceContents(fn)
Walk over the tree of SourceNodes. The walking function is called for each
source file content and is passed the filename and source content.
* `fn`: The traversal function.
#### SourceNode.prototype.join(sep)
Like `Array.prototype.join` except for SourceNodes. Inserts the separator
between each of this source node's children.
* `sep`: The separator.
#### SourceNode.prototype.replaceRight(pattern, replacement)
Call `String.prototype.replace` on the very right-most source snippet. Useful
for trimming whitespace from the end of a source node, etc.
* `pattern`: The pattern to replace.
* `replacement`: The thing to replace the pattern with.
#### SourceNode.prototype.toString()
Return the string representation of this source node. Walks over the tree and
concatenates all the various snippets together to one string.
### SourceNode.prototype.toStringWithSourceMap(startOfSourceMap)
Returns the string representation of this tree of source nodes, plus a
SourceMapGenerator which contains all the mappings between the generated and
original sources.
The arguments are the same as those to `new SourceMapGenerator`.
## Tests
[![Build Status](https://travis-ci.org/mozilla/source-map.png?branch=master)](https://travis-ci.org/mozilla/source-map)
Install NodeJS version 0.8.0 or greater, then run `node test/run-tests.js`.
To add new tests, create a new file named `test/test-<your new test name>.js`
and export your test functions with names that start with "test", for example
exports["test doing the foo bar"] = function (assert, util) {
...
};
The new test will be located automatically when you run the suite.
The `util` argument is the test utility module located at `test/source-map/util`.
The `assert` argument is a cut down version of node's assert module. You have
access to the following assertion functions:
* `doesNotThrow`
* `equal`
* `ok`
* `strictEqual`
* `throws`
(The reason for the restricted set of test functions is because we need the
tests to run inside Firefox's test suite as well and so the assert module is
shimmed in that environment. See `build/assert-shim.js`.)
[format]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit
[feature]: https://wiki.mozilla.org/DevTools/Features/SourceMap
[Dryice]: https://github.com/mozilla/dryice

View File

@@ -0,0 +1,56 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
define('test/source-map/assert', ['exports'], function (exports) {
let do_throw = function (msg) {
throw new Error(msg);
};
exports.init = function (throw_fn) {
do_throw = throw_fn;
};
exports.doesNotThrow = function (fn) {
try {
fn();
}
catch (e) {
do_throw(e.message);
}
};
exports.equal = function (actual, expected, msg) {
msg = msg || String(actual) + ' != ' + String(expected);
if (actual != expected) {
do_throw(msg);
}
};
exports.ok = function (val, msg) {
msg = msg || String(val) + ' is falsey';
if (!Boolean(val)) {
do_throw(msg);
}
};
exports.strictEqual = function (actual, expected, msg) {
msg = msg || String(actual) + ' !== ' + String(expected);
if (actual !== expected) {
do_throw(msg);
}
};
exports.throws = function (fn) {
try {
fn();
do_throw('Expected an error to be thrown, but it wasn\'t.');
}
catch (e) {
}
};
});

View File

@@ -0,0 +1,152 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
/**
* Define a module along with a payload.
* @param {string} moduleName Name for the payload
* @param {ignored} deps Ignored. For compatibility with CommonJS AMD Spec
* @param {function} payload Function with (require, exports, module) params
*/
function define(moduleName, deps, payload) {
if (typeof moduleName != "string") {
throw new TypeError('Expected string, got: ' + moduleName);
}
if (arguments.length == 2) {
payload = deps;
}
if (moduleName in define.modules) {
throw new Error("Module already defined: " + moduleName);
}
define.modules[moduleName] = payload;
};
/**
* The global store of un-instantiated modules
*/
define.modules = {};
/**
* We invoke require() in the context of a Domain so we can have multiple
* sets of modules running separate from each other.
* This contrasts with JSMs which are singletons, Domains allows us to
* optionally load a CommonJS module twice with separate data each time.
* Perhaps you want 2 command lines with a different set of commands in each,
* for example.
*/
function Domain() {
this.modules = {};
this._currentModule = null;
}
(function () {
/**
* Lookup module names and resolve them by calling the definition function if
* needed.
* There are 2 ways to call this, either with an array of dependencies and a
* callback to call when the dependencies are found (which can happen
* asynchronously in an in-page context) or with a single string an no callback
* where the dependency is resolved synchronously and returned.
* The API is designed to be compatible with the CommonJS AMD spec and
* RequireJS.
* @param {string[]|string} deps A name, or names for the payload
* @param {function|undefined} callback Function to call when the dependencies
* are resolved
* @return {undefined|object} The module required or undefined for
* array/callback method
*/
Domain.prototype.require = function(deps, callback) {
if (Array.isArray(deps)) {
var params = deps.map(function(dep) {
return this.lookup(dep);
}, this);
if (callback) {
callback.apply(null, params);
}
return undefined;
}
else {
return this.lookup(deps);
}
};
function normalize(path) {
var bits = path.split('/');
var i = 1;
while (i < bits.length) {
if (bits[i] === '..') {
bits.splice(i-1, 1);
} else if (bits[i] === '.') {
bits.splice(i, 1);
} else {
i++;
}
}
return bits.join('/');
}
function join(a, b) {
a = a.trim();
b = b.trim();
if (/^\//.test(b)) {
return b;
} else {
return a.replace(/\/*$/, '/') + b;
}
}
function dirname(path) {
var bits = path.split('/');
bits.pop();
return bits.join('/');
}
/**
* Lookup module names and resolve them by calling the definition function if
* needed.
* @param {string} moduleName A name for the payload to lookup
* @return {object} The module specified by aModuleName or null if not found.
*/
Domain.prototype.lookup = function(moduleName) {
if (/^\./.test(moduleName)) {
moduleName = normalize(join(dirname(this._currentModule), moduleName));
}
if (moduleName in this.modules) {
var module = this.modules[moduleName];
return module;
}
if (!(moduleName in define.modules)) {
throw new Error("Module not defined: " + moduleName);
}
var module = define.modules[moduleName];
if (typeof module == "function") {
var exports = {};
var previousModule = this._currentModule;
this._currentModule = moduleName;
module(this.require.bind(this), exports, { id: moduleName, uri: "" });
this._currentModule = previousModule;
module = exports;
}
// cache the resulting module object for next time
this.modules[moduleName] = module;
return module;
};
}());
define.Domain = Domain;
define.globalDomain = new Domain();
var require = define.globalDomain.require.bind(define.globalDomain);

View File

@@ -0,0 +1,20 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
/*
* WARNING!
*
* Do not edit this file directly, it is built from the sources at
* https://github.com/mozilla/source-map/
*/
///////////////////////////////////////////////////////////////////////////////
this.EXPORTED_SYMBOLS = [ "SourceMapConsumer", "SourceMapGenerator", "SourceNode" ];
Components.utils.import('resource://gre/modules/devtools/Require.jsm');

View File

@@ -0,0 +1,18 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
/*
* WARNING!
*
* Do not edit this file directly, it is built from the sources at
* https://github.com/mozilla/source-map/
*/
Components.utils.import('resource://gre/modules/devtools/Require.jsm');
Components.utils.import('resource://gre/modules/devtools/SourceMap.jsm');
this.EXPORTED_SYMBOLS = [ "define", "runSourceMapTests" ];

View File

@@ -0,0 +1,8 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
///////////////////////////////////////////////////////////////////////////////
this.sourceMap = {
SourceMapConsumer: require('source-map/source-map-consumer').SourceMapConsumer,
SourceMapGenerator: require('source-map/source-map-generator').SourceMapGenerator,
SourceNode: require('source-map/source-node').SourceNode
};

View File

@@ -0,0 +1,6 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
///////////////////////////////////////////////////////////////////////////////
this.SourceMapConsumer = require('source-map/source-map-consumer').SourceMapConsumer;
this.SourceMapGenerator = require('source-map/source-map-generator').SourceMapGenerator;
this.SourceNode = require('source-map/source-node').SourceNode;

View File

@@ -0,0 +1,21 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
function runSourceMapTests(modName, do_throw) {
let mod = require(modName);
let assert = require('test/source-map/assert');
let util = require('test/source-map/util');
assert.init(do_throw);
for (let k in mod) {
if (/^test/.test(k)) {
mod[k](assert, util);
}
}
}
this.runSourceMapTests = runSourceMapTests;

View File

@@ -0,0 +1,8 @@
/*
* WARNING!
*
* Do not edit this file directly, it is built from the sources at
* https://github.com/mozilla/source-map/
*/
Components.utils.import('resource://test/Utils.jsm');

View File

@@ -0,0 +1,3 @@
function run_test() {
runSourceMapTests('{THIS_MODULE}', do_throw);
}

View File

@@ -0,0 +1,8 @@
/*
* Copyright 2009-2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE.txt or:
* http://opensource.org/licenses/BSD-3-Clause
*/
exports.SourceMapGenerator = require('./source-map/source-map-generator').SourceMapGenerator;
exports.SourceMapConsumer = require('./source-map/source-map-consumer').SourceMapConsumer;
exports.SourceNode = require('./source-map/source-node').SourceNode;

View File

@@ -0,0 +1,97 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
/**
* A data structure which is a combination of an array and a set. Adding a new
* member is O(1), testing for membership is O(1), and finding the index of an
* element is O(1). Removing elements from the set is not supported. Only
* strings are supported for membership.
*/
function ArraySet() {
this._array = [];
this._set = {};
}
/**
* Static method for creating ArraySet instances from an existing array.
*/
ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {
var set = new ArraySet();
for (var i = 0, len = aArray.length; i < len; i++) {
set.add(aArray[i], aAllowDuplicates);
}
return set;
};
/**
* Add the given string to this set.
*
* @param String aStr
*/
ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {
var isDuplicate = this.has(aStr);
var idx = this._array.length;
if (!isDuplicate || aAllowDuplicates) {
this._array.push(aStr);
}
if (!isDuplicate) {
this._set[util.toSetString(aStr)] = idx;
}
};
/**
* Is the given string a member of this set?
*
* @param String aStr
*/
ArraySet.prototype.has = function ArraySet_has(aStr) {
return Object.prototype.hasOwnProperty.call(this._set,
util.toSetString(aStr));
};
/**
* What is the index of the given string in the array?
*
* @param String aStr
*/
ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
if (this.has(aStr)) {
return this._set[util.toSetString(aStr)];
}
throw new Error('"' + aStr + '" is not in the set.');
};
/**
* What is the element at the given index?
*
* @param Number aIdx
*/
ArraySet.prototype.at = function ArraySet_at(aIdx) {
if (aIdx >= 0 && aIdx < this._array.length) {
return this._array[aIdx];
}
throw new Error('No element indexed by ' + aIdx);
};
/**
* Returns the array representation of this set (which has the proper indices
* indicated by indexOf). Note that this is a copy of the internal array used
* for storing the members so that no one can mess with internal state.
*/
ArraySet.prototype.toArray = function ArraySet_toArray() {
return this._array.slice();
};
exports.ArraySet = ArraySet;
});

View File

@@ -0,0 +1,144 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*
* Based on the Base 64 VLQ implementation in Closure Compiler:
* https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
*
* Copyright 2011 The Closure Compiler Authors. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64 = require('./base64');
// A single base 64 digit can contain 6 bits of data. For the base 64 variable
// length quantities we use in the source map spec, the first bit is the sign,
// the next four bits are the actual value, and the 6th bit is the
// continuation bit. The continuation bit tells us whether there are more
// digits in this value following this digit.
//
// Continuation
// | Sign
// | |
// V V
// 101011
var VLQ_BASE_SHIFT = 5;
// binary: 100000
var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
// binary: 011111
var VLQ_BASE_MASK = VLQ_BASE - 1;
// binary: 100000
var VLQ_CONTINUATION_BIT = VLQ_BASE;
/**
* Converts from a two-complement value to a value where the sign bit is
* is placed in the least significant bit. For example, as decimals:
* 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
* 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
*/
function toVLQSigned(aValue) {
return aValue < 0
? ((-aValue) << 1) + 1
: (aValue << 1) + 0;
}
/**
* Converts to a two-complement value from a value where the sign bit is
* is placed in the least significant bit. For example, as decimals:
* 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
* 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
*/
function fromVLQSigned(aValue) {
var isNegative = (aValue & 1) === 1;
var shifted = aValue >> 1;
return isNegative
? -shifted
: shifted;
}
/**
* Returns the base 64 VLQ encoded value.
*/
exports.encode = function base64VLQ_encode(aValue) {
var encoded = "";
var digit;
var vlq = toVLQSigned(aValue);
do {
digit = vlq & VLQ_BASE_MASK;
vlq >>>= VLQ_BASE_SHIFT;
if (vlq > 0) {
// There are still more digits in this value, so we must make sure the
// continuation bit is marked.
digit |= VLQ_CONTINUATION_BIT;
}
encoded += base64.encode(digit);
} while (vlq > 0);
return encoded;
};
/**
* Decodes the next base 64 VLQ value from the given string and returns the
* value and the rest of the string.
*/
exports.decode = function base64VLQ_decode(aStr) {
var i = 0;
var strLen = aStr.length;
var result = 0;
var shift = 0;
var continuation, digit;
do {
if (i >= strLen) {
throw new Error("Expected more digits in base 64 VLQ value.");
}
digit = base64.decode(aStr.charAt(i++));
continuation = !!(digit & VLQ_CONTINUATION_BIT);
digit &= VLQ_BASE_MASK;
result = result + (digit << shift);
shift += VLQ_BASE_SHIFT;
} while (continuation);
return {
value: fromVLQSigned(result),
rest: aStr.slice(i)
};
};
});

View File

@@ -0,0 +1,42 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var charToIntMap = {};
var intToCharMap = {};
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
.split('')
.forEach(function (ch, index) {
charToIntMap[ch] = index;
intToCharMap[index] = ch;
});
/**
* Encode an integer in the range of 0 to 63 to a single base 64 digit.
*/
exports.encode = function base64_encode(aNumber) {
if (aNumber in intToCharMap) {
return intToCharMap[aNumber];
}
throw new TypeError("Must be between 0 and 63: " + aNumber);
};
/**
* Decode a single base 64 digit to an integer.
*/
exports.decode = function base64_decode(aChar) {
if (aChar in charToIntMap) {
return charToIntMap[aChar];
}
throw new TypeError("Not a valid base 64 digit: " + aChar);
};
});

View File

@@ -0,0 +1,81 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
/**
* Recursive implementation of binary search.
*
* @param aLow Indices here and lower do not contain the needle.
* @param aHigh Indices here and higher do not contain the needle.
* @param aNeedle The element being searched for.
* @param aHaystack The non-empty array being searched.
* @param aCompare Function which takes two elements and returns -1, 0, or 1.
*/
function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare) {
// This function terminates when one of the following is true:
//
// 1. We find the exact element we are looking for.
//
// 2. We did not find the exact element, but we can return the next
// closest element that is less than that element.
//
// 3. We did not find the exact element, and there is no next-closest
// element which is less than the one we are searching for, so we
// return null.
var mid = Math.floor((aHigh - aLow) / 2) + aLow;
var cmp = aCompare(aNeedle, aHaystack[mid], true);
if (cmp === 0) {
// Found the element we are looking for.
return aHaystack[mid];
}
else if (cmp > 0) {
// aHaystack[mid] is greater than our needle.
if (aHigh - mid > 1) {
// The element is in the upper half.
return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare);
}
// We did not find an exact match, return the next closest one
// (termination case 2).
return aHaystack[mid];
}
else {
// aHaystack[mid] is less than our needle.
if (mid - aLow > 1) {
// The element is in the lower half.
return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare);
}
// The exact needle element was not found in this haystack. Determine if
// we are in termination case (2) or (3) and return the appropriate thing.
return aLow < 0
? null
: aHaystack[aLow];
}
}
/**
* This is an implementation of binary search which will always try and return
* the next lowest value checked if there is no exact hit. This is because
* mappings between original and generated line/col pairs are single points,
* and there is an implicit region between each of them, so a miss just means
* that you aren't on the very start of a region.
*
* @param aNeedle The element you are looking for.
* @param aHaystack The array that is being searched.
* @param aCompare A function which takes the needle and an element in the
* array and returns -1, 0, or 1 depending on whether the needle is less
* than, equal to, or greater than the element, respectively.
*/
exports.search = function search(aNeedle, aHaystack, aCompare) {
return aHaystack.length > 0
? recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare)
: null;
};
});

View File

@@ -0,0 +1,478 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('./util');
var binarySearch = require('./binary-search');
var ArraySet = require('./array-set').ArraySet;
var base64VLQ = require('./base64-vlq');
/**
* A SourceMapConsumer instance represents a parsed source map which we can
* query for information about the original file positions by giving it a file
* position in the generated source.
*
* The only parameter is the raw source map (either as a JSON string, or
* already parsed to an object). According to the spec, source maps have the
* following attributes:
*
* - version: Which version of the source map spec this map is following.
* - sources: An array of URLs to the original source files.
* - names: An array of identifiers which can be referrenced by individual mappings.
* - sourceRoot: Optional. The URL root from which all sources are relative.
* - sourcesContent: Optional. An array of contents of the original source files.
* - mappings: A string of base64 VLQs which contain the actual mappings.
* - file: The generated file this source map is associated with.
*
* Here is an example source map, taken from the source map spec[0]:
*
* {
* version : 3,
* file: "out.js",
* sourceRoot : "",
* sources: ["foo.js", "bar.js"],
* names: ["src", "maps", "are", "fun"],
* mappings: "AA,AB;;ABCDE;"
* }
*
* [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
*/
function SourceMapConsumer(aSourceMap) {
var sourceMap = aSourceMap;
if (typeof aSourceMap === 'string') {
sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ''));
}
var version = util.getArg(sourceMap, 'version');
var sources = util.getArg(sourceMap, 'sources');
// Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
// requires the array) to play nice here.
var names = util.getArg(sourceMap, 'names', []);
var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);
var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);
var mappings = util.getArg(sourceMap, 'mappings');
var file = util.getArg(sourceMap, 'file', null);
// Once again, Sass deviates from the spec and supplies the version as a
// string rather than a number, so we use loose equality checking here.
if (version != this._version) {
throw new Error('Unsupported version: ' + version);
}
// Pass `true` below to allow duplicate names and sources. While source maps
// are intended to be compressed and deduplicated, the TypeScript compiler
// sometimes generates source maps with duplicates in them. See Github issue
// #72 and bugzil.la/889492.
this._names = ArraySet.fromArray(names, true);
this._sources = ArraySet.fromArray(sources, true);
this.sourceRoot = sourceRoot;
this.sourcesContent = sourcesContent;
this._mappings = mappings;
this.file = file;
}
/**
* Create a SourceMapConsumer from a SourceMapGenerator.
*
* @param SourceMapGenerator aSourceMap
* The source map that will be consumed.
* @returns SourceMapConsumer
*/
SourceMapConsumer.fromSourceMap =
function SourceMapConsumer_fromSourceMap(aSourceMap) {
var smc = Object.create(SourceMapConsumer.prototype);
smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);
smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);
smc.sourceRoot = aSourceMap._sourceRoot;
smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),
smc.sourceRoot);
smc.file = aSourceMap._file;
smc.__generatedMappings = aSourceMap._mappings.slice()
.sort(util.compareByGeneratedPositions);
smc.__originalMappings = aSourceMap._mappings.slice()
.sort(util.compareByOriginalPositions);
return smc;
};
/**
* The version of the source mapping spec that we are consuming.
*/
SourceMapConsumer.prototype._version = 3;
/**
* The list of original sources.
*/
Object.defineProperty(SourceMapConsumer.prototype, 'sources', {
get: function () {
return this._sources.toArray().map(function (s) {
return this.sourceRoot ? util.join(this.sourceRoot, s) : s;
}, this);
}
});
// `__generatedMappings` and `__originalMappings` are arrays that hold the
// parsed mapping coordinates from the source map's "mappings" attribute. They
// are lazily instantiated, accessed via the `_generatedMappings` and
// `_originalMappings` getters respectively, and we only parse the mappings
// and create these arrays once queried for a source location. We jump through
// these hoops because there can be many thousands of mappings, and parsing
// them is expensive, so we only want to do it if we must.
//
// Each object in the arrays is of the form:
//
// {
// generatedLine: The line number in the generated code,
// generatedColumn: The column number in the generated code,
// source: The path to the original source file that generated this
// chunk of code,
// originalLine: The line number in the original source that
// corresponds to this chunk of generated code,
// originalColumn: The column number in the original source that
// corresponds to this chunk of generated code,
// name: The name of the original symbol which generated this chunk of
// code.
// }
//
// All properties except for `generatedLine` and `generatedColumn` can be
// `null`.
//
// `_generatedMappings` is ordered by the generated positions.
//
// `_originalMappings` is ordered by the original positions.
SourceMapConsumer.prototype.__generatedMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {
get: function () {
if (!this.__generatedMappings) {
this.__generatedMappings = [];
this.__originalMappings = [];
this._parseMappings(this._mappings, this.sourceRoot);
}
return this.__generatedMappings;
}
});
SourceMapConsumer.prototype.__originalMappings = null;
Object.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {
get: function () {
if (!this.__originalMappings) {
this.__generatedMappings = [];
this.__originalMappings = [];
this._parseMappings(this._mappings, this.sourceRoot);
}
return this.__originalMappings;
}
});
/**
* Parse the mappings in a string in to a data structure which we can easily
* query (the ordered arrays in the `this.__generatedMappings` and
* `this.__originalMappings` properties).
*/
SourceMapConsumer.prototype._parseMappings =
function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {
var generatedLine = 1;
var previousGeneratedColumn = 0;
var previousOriginalLine = 0;
var previousOriginalColumn = 0;
var previousSource = 0;
var previousName = 0;
var mappingSeparator = /^[,;]/;
var str = aStr;
var mapping;
var temp;
while (str.length > 0) {
if (str.charAt(0) === ';') {
generatedLine++;
str = str.slice(1);
previousGeneratedColumn = 0;
}
else if (str.charAt(0) === ',') {
str = str.slice(1);
}
else {
mapping = {};
mapping.generatedLine = generatedLine;
// Generated column.
temp = base64VLQ.decode(str);
mapping.generatedColumn = previousGeneratedColumn + temp.value;
previousGeneratedColumn = mapping.generatedColumn;
str = temp.rest;
if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) {
// Original source.
temp = base64VLQ.decode(str);
mapping.source = this._sources.at(previousSource + temp.value);
previousSource += temp.value;
str = temp.rest;
if (str.length === 0 || mappingSeparator.test(str.charAt(0))) {
throw new Error('Found a source, but no line and column');
}
// Original line.
temp = base64VLQ.decode(str);
mapping.originalLine = previousOriginalLine + temp.value;
previousOriginalLine = mapping.originalLine;
// Lines are stored 0-based
mapping.originalLine += 1;
str = temp.rest;
if (str.length === 0 || mappingSeparator.test(str.charAt(0))) {
throw new Error('Found a source and line, but no column');
}
// Original column.
temp = base64VLQ.decode(str);
mapping.originalColumn = previousOriginalColumn + temp.value;
previousOriginalColumn = mapping.originalColumn;
str = temp.rest;
if (str.length > 0 && !mappingSeparator.test(str.charAt(0))) {
// Original name.
temp = base64VLQ.decode(str);
mapping.name = this._names.at(previousName + temp.value);
previousName += temp.value;
str = temp.rest;
}
}
this.__generatedMappings.push(mapping);
if (typeof mapping.originalLine === 'number') {
this.__originalMappings.push(mapping);
}
}
}
this.__generatedMappings.sort(util.compareByGeneratedPositions);
this.__originalMappings.sort(util.compareByOriginalPositions);
};
/**
* Find the mapping that best matches the hypothetical "needle" mapping that
* we are searching for in the given "haystack" of mappings.
*/
SourceMapConsumer.prototype._findMapping =
function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,
aColumnName, aComparator) {
// To return the position we are searching for, we must first find the
// mapping for the given position and then return the opposite position it
// points to. Because the mappings are sorted, we can use binary search to
// find the best mapping.
if (aNeedle[aLineName] <= 0) {
throw new TypeError('Line must be greater than or equal to 1, got '
+ aNeedle[aLineName]);
}
if (aNeedle[aColumnName] < 0) {
throw new TypeError('Column must be greater than or equal to 0, got '
+ aNeedle[aColumnName]);
}
return binarySearch.search(aNeedle, aMappings, aComparator);
};
/**
* Returns the original source, line, and column information for the generated
* source's line and column positions provided. The only argument is an object
* with the following properties:
*
* - line: The line number in the generated source.
* - column: The column number in the generated source.
*
* and an object is returned with the following properties:
*
* - source: The original source file, or null.
* - line: The line number in the original source, or null.
* - column: The column number in the original source, or null.
* - name: The original identifier, or null.
*/
SourceMapConsumer.prototype.originalPositionFor =
function SourceMapConsumer_originalPositionFor(aArgs) {
var needle = {
generatedLine: util.getArg(aArgs, 'line'),
generatedColumn: util.getArg(aArgs, 'column')
};
var mapping = this._findMapping(needle,
this._generatedMappings,
"generatedLine",
"generatedColumn",
util.compareByGeneratedPositions);
if (mapping) {
var source = util.getArg(mapping, 'source', null);
if (source && this.sourceRoot) {
source = util.join(this.sourceRoot, source);
}
return {
source: source,
line: util.getArg(mapping, 'originalLine', null),
column: util.getArg(mapping, 'originalColumn', null),
name: util.getArg(mapping, 'name', null)
};
}
return {
source: null,
line: null,
column: null,
name: null
};
};
/**
* Returns the original source content. The only argument is the url of the
* original source file. Returns null if no original source content is
* availible.
*/
SourceMapConsumer.prototype.sourceContentFor =
function SourceMapConsumer_sourceContentFor(aSource) {
if (!this.sourcesContent) {
return null;
}
if (this.sourceRoot) {
aSource = util.relative(this.sourceRoot, aSource);
}
if (this._sources.has(aSource)) {
return this.sourcesContent[this._sources.indexOf(aSource)];
}
var url;
if (this.sourceRoot
&& (url = util.urlParse(this.sourceRoot))) {
// XXX: file:// URIs and absolute paths lead to unexpected behavior for
// many users. We can help them out when they expect file:// URIs to
// behave like it would if they were running a local HTTP server. See
// https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
if (url.scheme == "file"
&& this._sources.has(fileUriAbsPath)) {
return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]
}
if ((!url.path || url.path == "/")
&& this._sources.has("/" + aSource)) {
return this.sourcesContent[this._sources.indexOf("/" + aSource)];
}
}
throw new Error('"' + aSource + '" is not in the SourceMap.');
};
/**
* Returns the generated line and column information for the original source,
* line, and column positions provided. The only argument is an object with
* the following properties:
*
* - source: The filename of the original source.
* - line: The line number in the original source.
* - column: The column number in the original source.
*
* and an object is returned with the following properties:
*
* - line: The line number in the generated source, or null.
* - column: The column number in the generated source, or null.
*/
SourceMapConsumer.prototype.generatedPositionFor =
function SourceMapConsumer_generatedPositionFor(aArgs) {
var needle = {
source: util.getArg(aArgs, 'source'),
originalLine: util.getArg(aArgs, 'line'),
originalColumn: util.getArg(aArgs, 'column')
};
if (this.sourceRoot) {
needle.source = util.relative(this.sourceRoot, needle.source);
}
var mapping = this._findMapping(needle,
this._originalMappings,
"originalLine",
"originalColumn",
util.compareByOriginalPositions);
if (mapping) {
return {
line: util.getArg(mapping, 'generatedLine', null),
column: util.getArg(mapping, 'generatedColumn', null)
};
}
return {
line: null,
column: null
};
};
SourceMapConsumer.GENERATED_ORDER = 1;
SourceMapConsumer.ORIGINAL_ORDER = 2;
/**
* Iterate over each mapping between an original source/line/column and a
* generated line/column in this source map.
*
* @param Function aCallback
* The function that is called with each mapping.
* @param Object aContext
* Optional. If specified, this object will be the value of `this` every
* time that `aCallback` is called.
* @param aOrder
* Either `SourceMapConsumer.GENERATED_ORDER` or
* `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
* iterate over the mappings sorted by the generated file's line/column
* order or the original's source/line/column order, respectively. Defaults to
* `SourceMapConsumer.GENERATED_ORDER`.
*/
SourceMapConsumer.prototype.eachMapping =
function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {
var context = aContext || null;
var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
var mappings;
switch (order) {
case SourceMapConsumer.GENERATED_ORDER:
mappings = this._generatedMappings;
break;
case SourceMapConsumer.ORIGINAL_ORDER:
mappings = this._originalMappings;
break;
default:
throw new Error("Unknown order of iteration.");
}
var sourceRoot = this.sourceRoot;
mappings.map(function (mapping) {
var source = mapping.source;
if (source && sourceRoot) {
source = util.join(sourceRoot, source);
}
return {
source: source,
generatedLine: mapping.generatedLine,
generatedColumn: mapping.generatedColumn,
originalLine: mapping.originalLine,
originalColumn: mapping.originalColumn,
name: mapping.name
};
}).forEach(aCallback, context);
};
exports.SourceMapConsumer = SourceMapConsumer;
});

View File

@@ -0,0 +1,380 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64VLQ = require('./base64-vlq');
var util = require('./util');
var ArraySet = require('./array-set').ArraySet;
/**
* An instance of the SourceMapGenerator represents a source map which is
* being built incrementally. To create a new one, you must pass an object
* with the following properties:
*
* - file: The filename of the generated source.
* - sourceRoot: An optional root for all URLs in this source map.
*/
function SourceMapGenerator(aArgs) {
this._file = util.getArg(aArgs, 'file');
this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);
this._sources = new ArraySet();
this._names = new ArraySet();
this._mappings = [];
this._sourcesContents = null;
}
SourceMapGenerator.prototype._version = 3;
/**
* Creates a new SourceMapGenerator based on a SourceMapConsumer
*
* @param aSourceMapConsumer The SourceMap.
*/
SourceMapGenerator.fromSourceMap =
function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {
var sourceRoot = aSourceMapConsumer.sourceRoot;
var generator = new SourceMapGenerator({
file: aSourceMapConsumer.file,
sourceRoot: sourceRoot
});
aSourceMapConsumer.eachMapping(function (mapping) {
var newMapping = {
generated: {
line: mapping.generatedLine,
column: mapping.generatedColumn
}
};
if (mapping.source) {
newMapping.source = mapping.source;
if (sourceRoot) {
newMapping.source = util.relative(sourceRoot, newMapping.source);
}
newMapping.original = {
line: mapping.originalLine,
column: mapping.originalColumn
};
if (mapping.name) {
newMapping.name = mapping.name;
}
}
generator.addMapping(newMapping);
});
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content) {
generator.setSourceContent(sourceFile, content);
}
});
return generator;
};
/**
* Add a single mapping from original source line and column to the generated
* source's line and column for this source map being created. The mapping
* object should have the following properties:
*
* - generated: An object with the generated line and column positions.
* - original: An object with the original line and column positions.
* - source: The original source file (relative to the sourceRoot).
* - name: An optional original token name for this mapping.
*/
SourceMapGenerator.prototype.addMapping =
function SourceMapGenerator_addMapping(aArgs) {
var generated = util.getArg(aArgs, 'generated');
var original = util.getArg(aArgs, 'original', null);
var source = util.getArg(aArgs, 'source', null);
var name = util.getArg(aArgs, 'name', null);
this._validateMapping(generated, original, source, name);
if (source && !this._sources.has(source)) {
this._sources.add(source);
}
if (name && !this._names.has(name)) {
this._names.add(name);
}
this._mappings.push({
generatedLine: generated.line,
generatedColumn: generated.column,
originalLine: original != null && original.line,
originalColumn: original != null && original.column,
source: source,
name: name
});
};
/**
* Set the source content for a source file.
*/
SourceMapGenerator.prototype.setSourceContent =
function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {
var source = aSourceFile;
if (this._sourceRoot) {
source = util.relative(this._sourceRoot, source);
}
if (aSourceContent !== null) {
// Add the source content to the _sourcesContents map.
// Create a new _sourcesContents map if the property is null.
if (!this._sourcesContents) {
this._sourcesContents = {};
}
this._sourcesContents[util.toSetString(source)] = aSourceContent;
} else {
// Remove the source file from the _sourcesContents map.
// If the _sourcesContents map is empty, set the property to null.
delete this._sourcesContents[util.toSetString(source)];
if (Object.keys(this._sourcesContents).length === 0) {
this._sourcesContents = null;
}
}
};
/**
* Applies the mappings of a sub-source-map for a specific source file to the
* source map being generated. Each mapping to the supplied source file is
* rewritten using the supplied source map. Note: The resolution for the
* resulting mappings is the minimium of this map and the supplied map.
*
* @param aSourceMapConsumer The source map to be applied.
* @param aSourceFile Optional. The filename of the source file.
* If omitted, SourceMapConsumer's file property will be used.
*/
SourceMapGenerator.prototype.applySourceMap =
function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile) {
// If aSourceFile is omitted, we will use the file property of the SourceMap
if (!aSourceFile) {
aSourceFile = aSourceMapConsumer.file;
}
var sourceRoot = this._sourceRoot;
// Make "aSourceFile" relative if an absolute Url is passed.
if (sourceRoot) {
aSourceFile = util.relative(sourceRoot, aSourceFile);
}
// Applying the SourceMap can add and remove items from the sources and
// the names array.
var newSources = new ArraySet();
var newNames = new ArraySet();
// Find mappings for the "aSourceFile"
this._mappings.forEach(function (mapping) {
if (mapping.source === aSourceFile && mapping.originalLine) {
// Check if it can be mapped by the source map, then update the mapping.
var original = aSourceMapConsumer.originalPositionFor({
line: mapping.originalLine,
column: mapping.originalColumn
});
if (original.source !== null) {
// Copy mapping
if (sourceRoot) {
mapping.source = util.relative(sourceRoot, original.source);
} else {
mapping.source = original.source;
}
mapping.originalLine = original.line;
mapping.originalColumn = original.column;
if (original.name !== null && mapping.name !== null) {
// Only use the identifier name if it's an identifier
// in both SourceMaps
mapping.name = original.name;
}
}
}
var source = mapping.source;
if (source && !newSources.has(source)) {
newSources.add(source);
}
var name = mapping.name;
if (name && !newNames.has(name)) {
newNames.add(name);
}
}, this);
this._sources = newSources;
this._names = newNames;
// Copy sourcesContents of applied map.
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content) {
if (sourceRoot) {
sourceFile = util.relative(sourceRoot, sourceFile);
}
this.setSourceContent(sourceFile, content);
}
}, this);
};
/**
* A mapping can have one of the three levels of data:
*
* 1. Just the generated position.
* 2. The Generated position, original position, and original source.
* 3. Generated and original position, original source, as well as a name
* token.
*
* To maintain consistency, we validate that any new mapping being added falls
* in to one of these categories.
*/
SourceMapGenerator.prototype._validateMapping =
function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,
aName) {
if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
&& aGenerated.line > 0 && aGenerated.column >= 0
&& !aOriginal && !aSource && !aName) {
// Case 1.
return;
}
else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated
&& aOriginal && 'line' in aOriginal && 'column' in aOriginal
&& aGenerated.line > 0 && aGenerated.column >= 0
&& aOriginal.line > 0 && aOriginal.column >= 0
&& aSource) {
// Cases 2 and 3.
return;
}
else {
throw new Error('Invalid mapping: ' + JSON.stringify({
generated: aGenerated,
source: aSource,
original: aOriginal,
name: aName
}));
}
};
/**
* Serialize the accumulated mappings in to the stream of base 64 VLQs
* specified by the source map format.
*/
SourceMapGenerator.prototype._serializeMappings =
function SourceMapGenerator_serializeMappings() {
var previousGeneratedColumn = 0;
var previousGeneratedLine = 1;
var previousOriginalColumn = 0;
var previousOriginalLine = 0;
var previousName = 0;
var previousSource = 0;
var result = '';
var mapping;
// The mappings must be guaranteed to be in sorted order before we start
// serializing them or else the generated line numbers (which are defined
// via the ';' separators) will be all messed up. Note: it might be more
// performant to maintain the sorting as we insert them, rather than as we
// serialize them, but the big O is the same either way.
this._mappings.sort(util.compareByGeneratedPositions);
for (var i = 0, len = this._mappings.length; i < len; i++) {
mapping = this._mappings[i];
if (mapping.generatedLine !== previousGeneratedLine) {
previousGeneratedColumn = 0;
while (mapping.generatedLine !== previousGeneratedLine) {
result += ';';
previousGeneratedLine++;
}
}
else {
if (i > 0) {
if (!util.compareByGeneratedPositions(mapping, this._mappings[i - 1])) {
continue;
}
result += ',';
}
}
result += base64VLQ.encode(mapping.generatedColumn
- previousGeneratedColumn);
previousGeneratedColumn = mapping.generatedColumn;
if (mapping.source) {
result += base64VLQ.encode(this._sources.indexOf(mapping.source)
- previousSource);
previousSource = this._sources.indexOf(mapping.source);
// lines are stored 0-based in SourceMap spec version 3
result += base64VLQ.encode(mapping.originalLine - 1
- previousOriginalLine);
previousOriginalLine = mapping.originalLine - 1;
result += base64VLQ.encode(mapping.originalColumn
- previousOriginalColumn);
previousOriginalColumn = mapping.originalColumn;
if (mapping.name) {
result += base64VLQ.encode(this._names.indexOf(mapping.name)
- previousName);
previousName = this._names.indexOf(mapping.name);
}
}
}
return result;
};
SourceMapGenerator.prototype._generateSourcesContent =
function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {
return aSources.map(function (source) {
if (!this._sourcesContents) {
return null;
}
if (aSourceRoot) {
source = util.relative(aSourceRoot, source);
}
var key = util.toSetString(source);
return Object.prototype.hasOwnProperty.call(this._sourcesContents,
key)
? this._sourcesContents[key]
: null;
}, this);
};
/**
* Externalize the source map.
*/
SourceMapGenerator.prototype.toJSON =
function SourceMapGenerator_toJSON() {
var map = {
version: this._version,
file: this._file,
sources: this._sources.toArray(),
names: this._names.toArray(),
mappings: this._serializeMappings()
};
if (this._sourceRoot) {
map.sourceRoot = this._sourceRoot;
}
if (this._sourcesContents) {
map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
}
return map;
};
/**
* Render the source map being generated to a string.
*/
SourceMapGenerator.prototype.toString =
function SourceMapGenerator_toString() {
return JSON.stringify(this);
};
exports.SourceMapGenerator = SourceMapGenerator;
});

View File

@@ -0,0 +1,371 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapGenerator = require('./source-map-generator').SourceMapGenerator;
var util = require('./util');
/**
* SourceNodes provide a way to abstract over interpolating/concatenating
* snippets of generated JavaScript source code while maintaining the line and
* column information associated with the original source code.
*
* @param aLine The original line number.
* @param aColumn The original column number.
* @param aSource The original source's filename.
* @param aChunks Optional. An array of strings which are snippets of
* generated JS, or other SourceNodes.
* @param aName The original identifier.
*/
function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
this.children = [];
this.sourceContents = {};
this.line = aLine === undefined ? null : aLine;
this.column = aColumn === undefined ? null : aColumn;
this.source = aSource === undefined ? null : aSource;
this.name = aName === undefined ? null : aName;
if (aChunks != null) this.add(aChunks);
}
/**
* Creates a SourceNode from generated code and a SourceMapConsumer.
*
* @param aGeneratedCode The generated code
* @param aSourceMapConsumer The SourceMap for the generated code
*/
SourceNode.fromStringWithSourceMap =
function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer) {
// The SourceNode we want to fill with the generated code
// and the SourceMap
var node = new SourceNode();
// The generated code
// Processed fragments are removed from this array.
var remainingLines = aGeneratedCode.split('\n');
// We need to remember the position of "remainingLines"
var lastGeneratedLine = 1, lastGeneratedColumn = 0;
// The generate SourceNodes we need a code range.
// To extract it current and last mapping is used.
// Here we store the last mapping.
var lastMapping = null;
aSourceMapConsumer.eachMapping(function (mapping) {
if (lastMapping === null) {
// We add the generated code until the first mapping
// to the SourceNode without any mapping.
// Each line is added as separate string.
while (lastGeneratedLine < mapping.generatedLine) {
node.add(remainingLines.shift() + "\n");
lastGeneratedLine++;
}
if (lastGeneratedColumn < mapping.generatedColumn) {
var nextLine = remainingLines[0];
node.add(nextLine.substr(0, mapping.generatedColumn));
remainingLines[0] = nextLine.substr(mapping.generatedColumn);
lastGeneratedColumn = mapping.generatedColumn;
}
} else {
// We add the code from "lastMapping" to "mapping":
// First check if there is a new line in between.
if (lastGeneratedLine < mapping.generatedLine) {
var code = "";
// Associate full lines with "lastMapping"
do {
code += remainingLines.shift() + "\n";
lastGeneratedLine++;
lastGeneratedColumn = 0;
} while (lastGeneratedLine < mapping.generatedLine);
// When we reached the correct line, we add code until we
// reach the correct column too.
if (lastGeneratedColumn < mapping.generatedColumn) {
var nextLine = remainingLines[0];
code += nextLine.substr(0, mapping.generatedColumn);
remainingLines[0] = nextLine.substr(mapping.generatedColumn);
lastGeneratedColumn = mapping.generatedColumn;
}
// Create the SourceNode.
addMappingWithCode(lastMapping, code);
} else {
// There is no new line in between.
// Associate the code between "lastGeneratedColumn" and
// "mapping.generatedColumn" with "lastMapping"
var nextLine = remainingLines[0];
var code = nextLine.substr(0, mapping.generatedColumn -
lastGeneratedColumn);
remainingLines[0] = nextLine.substr(mapping.generatedColumn -
lastGeneratedColumn);
lastGeneratedColumn = mapping.generatedColumn;
addMappingWithCode(lastMapping, code);
}
}
lastMapping = mapping;
}, this);
// We have processed all mappings.
// Associate the remaining code in the current line with "lastMapping"
// and add the remaining lines without any mapping
addMappingWithCode(lastMapping, remainingLines.join("\n"));
// Copy sourcesContent into SourceNode
aSourceMapConsumer.sources.forEach(function (sourceFile) {
var content = aSourceMapConsumer.sourceContentFor(sourceFile);
if (content) {
node.setSourceContent(sourceFile, content);
}
});
return node;
function addMappingWithCode(mapping, code) {
if (mapping === null || mapping.source === undefined) {
node.add(code);
} else {
node.add(new SourceNode(mapping.originalLine,
mapping.originalColumn,
mapping.source,
code,
mapping.name));
}
}
};
/**
* Add a chunk of generated JS to this source node.
*
* @param aChunk A string snippet of generated JS code, another instance of
* SourceNode, or an array where each member is one of those things.
*/
SourceNode.prototype.add = function SourceNode_add(aChunk) {
if (Array.isArray(aChunk)) {
aChunk.forEach(function (chunk) {
this.add(chunk);
}, this);
}
else if (aChunk instanceof SourceNode || typeof aChunk === "string") {
if (aChunk) {
this.children.push(aChunk);
}
}
else {
throw new TypeError(
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
);
}
return this;
};
/**
* Add a chunk of generated JS to the beginning of this source node.
*
* @param aChunk A string snippet of generated JS code, another instance of
* SourceNode, or an array where each member is one of those things.
*/
SourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {
if (Array.isArray(aChunk)) {
for (var i = aChunk.length-1; i >= 0; i--) {
this.prepend(aChunk[i]);
}
}
else if (aChunk instanceof SourceNode || typeof aChunk === "string") {
this.children.unshift(aChunk);
}
else {
throw new TypeError(
"Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
);
}
return this;
};
/**
* Walk over the tree of JS snippets in this node and its children. The
* walking function is called once for each snippet of JS and is passed that
* snippet and the its original associated source's line/column location.
*
* @param aFn The traversal function.
*/
SourceNode.prototype.walk = function SourceNode_walk(aFn) {
var chunk;
for (var i = 0, len = this.children.length; i < len; i++) {
chunk = this.children[i];
if (chunk instanceof SourceNode) {
chunk.walk(aFn);
}
else {
if (chunk !== '') {
aFn(chunk, { source: this.source,
line: this.line,
column: this.column,
name: this.name });
}
}
}
};
/**
* Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
* each of `this.children`.
*
* @param aSep The separator.
*/
SourceNode.prototype.join = function SourceNode_join(aSep) {
var newChildren;
var i;
var len = this.children.length;
if (len > 0) {
newChildren = [];
for (i = 0; i < len-1; i++) {
newChildren.push(this.children[i]);
newChildren.push(aSep);
}
newChildren.push(this.children[i]);
this.children = newChildren;
}
return this;
};
/**
* Call String.prototype.replace on the very right-most source snippet. Useful
* for trimming whitespace from the end of a source node, etc.
*
* @param aPattern The pattern to replace.
* @param aReplacement The thing to replace the pattern with.
*/
SourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {
var lastChild = this.children[this.children.length - 1];
if (lastChild instanceof SourceNode) {
lastChild.replaceRight(aPattern, aReplacement);
}
else if (typeof lastChild === 'string') {
this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
}
else {
this.children.push(''.replace(aPattern, aReplacement));
}
return this;
};
/**
* Set the source content for a source file. This will be added to the SourceMapGenerator
* in the sourcesContent field.
*
* @param aSourceFile The filename of the source file
* @param aSourceContent The content of the source file
*/
SourceNode.prototype.setSourceContent =
function SourceNode_setSourceContent(aSourceFile, aSourceContent) {
this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
};
/**
* Walk over the tree of SourceNodes. The walking function is called for each
* source file content and is passed the filename and source content.
*
* @param aFn The traversal function.
*/
SourceNode.prototype.walkSourceContents =
function SourceNode_walkSourceContents(aFn) {
for (var i = 0, len = this.children.length; i < len; i++) {
if (this.children[i] instanceof SourceNode) {
this.children[i].walkSourceContents(aFn);
}
}
var sources = Object.keys(this.sourceContents);
for (var i = 0, len = sources.length; i < len; i++) {
aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
}
};
/**
* Return the string representation of this source node. Walks over the tree
* and concatenates all the various snippets together to one string.
*/
SourceNode.prototype.toString = function SourceNode_toString() {
var str = "";
this.walk(function (chunk) {
str += chunk;
});
return str;
};
/**
* Returns the string representation of this source node along with a source
* map.
*/
SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {
var generated = {
code: "",
line: 1,
column: 0
};
var map = new SourceMapGenerator(aArgs);
var sourceMappingActive = false;
var lastOriginalSource = null;
var lastOriginalLine = null;
var lastOriginalColumn = null;
var lastOriginalName = null;
this.walk(function (chunk, original) {
generated.code += chunk;
if (original.source !== null
&& original.line !== null
&& original.column !== null) {
if(lastOriginalSource !== original.source
|| lastOriginalLine !== original.line
|| lastOriginalColumn !== original.column
|| lastOriginalName !== original.name) {
map.addMapping({
source: original.source,
original: {
line: original.line,
column: original.column
},
generated: {
line: generated.line,
column: generated.column
},
name: original.name
});
}
lastOriginalSource = original.source;
lastOriginalLine = original.line;
lastOriginalColumn = original.column;
lastOriginalName = original.name;
sourceMappingActive = true;
} else if (sourceMappingActive) {
map.addMapping({
generated: {
line: generated.line,
column: generated.column
}
});
lastOriginalSource = null;
sourceMappingActive = false;
}
chunk.split('').forEach(function (ch) {
if (ch === '\n') {
generated.line++;
generated.column = 0;
} else {
generated.column++;
}
});
});
this.walkSourceContents(function (sourceFile, sourceContent) {
map.setSourceContent(sourceFile, sourceContent);
});
return { code: generated.code, map: map };
};
exports.SourceNode = SourceNode;
});

View File

@@ -0,0 +1,205 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
/**
* This is a helper function for getting values from parameter/options
* objects.
*
* @param args The object we are extracting values from
* @param name The name of the property we are getting.
* @param defaultValue An optional value to return if the property is missing
* from the object. If this is not specified and the property is missing, an
* error will be thrown.
*/
function getArg(aArgs, aName, aDefaultValue) {
if (aName in aArgs) {
return aArgs[aName];
} else if (arguments.length === 3) {
return aDefaultValue;
} else {
throw new Error('"' + aName + '" is a required argument.');
}
}
exports.getArg = getArg;
var urlRegexp = /([\w+\-.]+):\/\/((\w+:\w+)@)?([\w.]+)?(:(\d+))?(\S+)?/;
var dataUrlRegexp = /^data:.+\,.+/;
function urlParse(aUrl) {
var match = aUrl.match(urlRegexp);
if (!match) {
return null;
}
return {
scheme: match[1],
auth: match[3],
host: match[4],
port: match[6],
path: match[7]
};
}
exports.urlParse = urlParse;
function urlGenerate(aParsedUrl) {
var url = aParsedUrl.scheme + "://";
if (aParsedUrl.auth) {
url += aParsedUrl.auth + "@"
}
if (aParsedUrl.host) {
url += aParsedUrl.host;
}
if (aParsedUrl.port) {
url += ":" + aParsedUrl.port
}
if (aParsedUrl.path) {
url += aParsedUrl.path;
}
return url;
}
exports.urlGenerate = urlGenerate;
function join(aRoot, aPath) {
var url;
if (aPath.match(urlRegexp) || aPath.match(dataUrlRegexp)) {
return aPath;
}
if (aPath.charAt(0) === '/' && (url = urlParse(aRoot))) {
url.path = aPath;
return urlGenerate(url);
}
return aRoot.replace(/\/$/, '') + '/' + aPath;
}
exports.join = join;
/**
* Because behavior goes wacky when you set `__proto__` on objects, we
* have to prefix all the strings in our set with an arbitrary character.
*
* See https://github.com/mozilla/source-map/pull/31 and
* https://github.com/mozilla/source-map/issues/30
*
* @param String aStr
*/
function toSetString(aStr) {
return '$' + aStr;
}
exports.toSetString = toSetString;
function fromSetString(aStr) {
return aStr.substr(1);
}
exports.fromSetString = fromSetString;
function relative(aRoot, aPath) {
aRoot = aRoot.replace(/\/$/, '');
var url = urlParse(aRoot);
if (aPath.charAt(0) == "/" && url && url.path == "/") {
return aPath.slice(1);
}
return aPath.indexOf(aRoot + '/') === 0
? aPath.substr(aRoot.length + 1)
: aPath;
}
exports.relative = relative;
function strcmp(aStr1, aStr2) {
var s1 = aStr1 || "";
var s2 = aStr2 || "";
return (s1 > s2) - (s1 < s2);
}
/**
* Comparator between two mappings where the original positions are compared.
*
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
* mappings with the same original source/line/column, but different generated
* line and column the same. Useful when searching for a mapping with a
* stubbed out mapping.
*/
function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
var cmp;
cmp = strcmp(mappingA.source, mappingB.source);
if (cmp) {
return cmp;
}
cmp = mappingA.originalLine - mappingB.originalLine;
if (cmp) {
return cmp;
}
cmp = mappingA.originalColumn - mappingB.originalColumn;
if (cmp || onlyCompareOriginal) {
return cmp;
}
cmp = strcmp(mappingA.name, mappingB.name);
if (cmp) {
return cmp;
}
cmp = mappingA.generatedLine - mappingB.generatedLine;
if (cmp) {
return cmp;
}
return mappingA.generatedColumn - mappingB.generatedColumn;
};
exports.compareByOriginalPositions = compareByOriginalPositions;
/**
* Comparator between two mappings where the generated positions are
* compared.
*
* Optionally pass in `true` as `onlyCompareGenerated` to consider two
* mappings with the same generated line and column, but different
* source/name/original line and column the same. Useful when searching for a
* mapping with a stubbed out mapping.
*/
function compareByGeneratedPositions(mappingA, mappingB, onlyCompareGenerated) {
var cmp;
cmp = mappingA.generatedLine - mappingB.generatedLine;
if (cmp) {
return cmp;
}
cmp = mappingA.generatedColumn - mappingB.generatedColumn;
if (cmp || onlyCompareGenerated) {
return cmp;
}
cmp = strcmp(mappingA.source, mappingB.source);
if (cmp) {
return cmp;
}
cmp = mappingA.originalLine - mappingB.originalLine;
if (cmp) {
return cmp;
}
cmp = mappingA.originalColumn - mappingB.originalColumn;
if (cmp) {
return cmp;
}
return strcmp(mappingA.name, mappingB.name);
};
exports.compareByGeneratedPositions = compareByGeneratedPositions;
});

View File

@@ -0,0 +1,167 @@
{
"_args": [
[
"source-map@0.1.32",
"/Users/mromano/dev/react-sfs/node_modules/source-map-support"
]
],
"_from": "source-map@0.1.32",
"_id": "source-map@0.1.32",
"_inCache": true,
"_installable": true,
"_location": "/source-map-support/source-map",
"_npmUser": {
"email": "fitzgen@gmail.com",
"name": "nickfitzgerald"
},
"_npmVersion": "1.2.18",
"_phantomChildren": {},
"_requested": {
"name": "source-map",
"raw": "source-map@0.1.32",
"rawSpec": "0.1.32",
"scope": null,
"spec": "0.1.32",
"type": "version"
},
"_requiredBy": [
"/source-map-support"
],
"_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
"_shasum": "c8b6c167797ba4740a8ea33252162ff08591b266",
"_shrinkwrap": null,
"_spec": "source-map@0.1.32",
"_where": "/Users/mromano/dev/react-sfs/node_modules/source-map-support",
"author": {
"email": "nfitzgerald@mozilla.com",
"name": "Nick Fitzgerald"
},
"bugs": {
"url": "https://github.com/mozilla/source-map/issues"
},
"contributors": [
{
"email": "tobias.koppers@googlemail.com",
"name": "Tobias Koppers"
},
{
"email": "duncan@dweebd.com",
"name": "Duncan Beevers"
},
{
"email": "scrane@mozilla.com",
"name": "Stephen Crane"
},
{
"email": "seddon.ryan@gmail.com",
"name": "Ryan Seddon"
},
{
"email": "miles.elam@deem.com",
"name": "Miles Elam"
},
{
"email": "mihai.bazon@gmail.com",
"name": "Mihai Bazon"
},
{
"email": "github.public.email@michael.ficarra.me",
"name": "Michael Ficarra"
},
{
"email": "todd@twolfson.com",
"name": "Todd Wolfson"
},
{
"email": "alexander@solovyov.net",
"name": "Alexander Solovyov"
},
{
"email": "fgnass@gmail.com",
"name": "Felix Gnass"
},
{
"email": "conrad.irwin@gmail.com",
"name": "Conrad Irwin"
},
{
"email": "usrbincc@yahoo.com",
"name": "usrbincc"
},
{
"email": "glasser@davidglasser.net",
"name": "David Glasser"
},
{
"email": "chase@newrelic.com",
"name": "Chase Douglas"
},
{
"email": "evan.exe@gmail.com",
"name": "Evan Wallace"
},
{
"email": "fayearthur@gmail.com",
"name": "Heather Arthur"
},
{
"email": "hughskennedy@gmail.com",
"name": "Hugh Kennedy"
},
{
"email": "glasser@davidglasser.net",
"name": "David Glasser"
}
],
"dependencies": {
"amdefine": ">=0.0.4"
},
"description": "Generates and consumes source maps",
"devDependencies": {
"dryice": ">=0.4.8"
},
"directories": {
"lib": "./lib"
},
"dist": {
"shasum": "c8b6c167797ba4740a8ea33252162ff08591b266",
"tarball": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz"
},
"engines": {
"node": ">=0.8.0"
},
"homepage": "https://github.com/mozilla/source-map",
"licenses": [
{
"type": "BSD",
"url": "http://opensource.org/licenses/BSD-3-Clause"
}
],
"main": "./lib/source-map.js",
"maintainers": [
{
"email": "mozilla-developer-tools@googlegroups.com",
"name": "mozilla-devtools"
},
{
"email": "dherman@mozilla.com",
"name": "mozilla"
},
{
"email": "fitzgen@gmail.com",
"name": "nickfitzgerald"
}
],
"name": "source-map",
"optionalDependencies": {},
"readme": "ERROR: No README data found!",
"repository": {
"type": "git",
"url": "git+ssh://git@github.com/mozilla/source-map.git"
},
"scripts": {
"build": "node Makefile.dryice.js",
"test": "node test/run-tests.js"
},
"version": "0.1.32"
}

View File

@@ -0,0 +1,62 @@
#!/usr/bin/env node
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
var assert = require('assert');
var fs = require('fs');
var path = require('path');
var util = require('./source-map/util');
function run(tests) {
var total = 0;
var passed = 0;
for (var i = 0; i < tests.length; i++) {
for (var k in tests[i].testCase) {
if (/^test/.test(k)) {
total++;
try {
tests[i].testCase[k](assert, util);
passed++;
}
catch (e) {
console.log('FAILED ' + tests[i].name + ': ' + k + '!');
console.log(e.stack);
}
}
}
}
console.log('');
console.log(passed + ' / ' + total + ' tests passed.');
console.log('');
return total - passed;
}
function isTestFile(f) {
var testToRun = process.argv[2];
return testToRun
? path.basename(testToRun) === f
: /^test\-.*?\.js/.test(f);
}
function toModule(f) {
return './source-map/' + f.replace(/\.js$/, '');
}
var requires = fs.readdirSync(path.join(__dirname, 'source-map'))
.filter(isTestFile)
.map(toModule);
var code = run(requires.map(require).map(function (mod, i) {
return {
name: requires[i],
testCase: mod
};
}));
process.exit(code);

View File

@@ -0,0 +1,26 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2012 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var sourceMap;
try {
sourceMap = require('../../lib/source-map');
} catch (e) {
sourceMap = {};
Components.utils.import('resource:///modules/devtools/SourceMap.jsm', sourceMap);
}
exports['test that the api is properly exposed in the top level'] = function (assert, util) {
assert.equal(typeof sourceMap.SourceMapGenerator, "function");
assert.equal(typeof sourceMap.SourceMapConsumer, "function");
assert.equal(typeof sourceMap.SourceNode, "function");
};
});

View File

@@ -0,0 +1,104 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var ArraySet = require('../../lib/source-map/array-set').ArraySet;
function makeTestSet() {
var set = new ArraySet();
for (var i = 0; i < 100; i++) {
set.add(String(i));
}
return set;
}
exports['test .has() membership'] = function (assert, util) {
var set = makeTestSet();
for (var i = 0; i < 100; i++) {
assert.ok(set.has(String(i)));
}
};
exports['test .indexOf() elements'] = function (assert, util) {
var set = makeTestSet();
for (var i = 0; i < 100; i++) {
assert.strictEqual(set.indexOf(String(i)), i);
}
};
exports['test .at() indexing'] = function (assert, util) {
var set = makeTestSet();
for (var i = 0; i < 100; i++) {
assert.strictEqual(set.at(i), String(i));
}
};
exports['test creating from an array'] = function (assert, util) {
var set = ArraySet.fromArray(['foo', 'bar', 'baz', 'quux', 'hasOwnProperty']);
assert.ok(set.has('foo'));
assert.ok(set.has('bar'));
assert.ok(set.has('baz'));
assert.ok(set.has('quux'));
assert.ok(set.has('hasOwnProperty'));
assert.strictEqual(set.indexOf('foo'), 0);
assert.strictEqual(set.indexOf('bar'), 1);
assert.strictEqual(set.indexOf('baz'), 2);
assert.strictEqual(set.indexOf('quux'), 3);
assert.strictEqual(set.at(0), 'foo');
assert.strictEqual(set.at(1), 'bar');
assert.strictEqual(set.at(2), 'baz');
assert.strictEqual(set.at(3), 'quux');
};
exports['test that you can add __proto__; see github issue #30'] = function (assert, util) {
var set = new ArraySet();
set.add('__proto__');
assert.ok(set.has('__proto__'));
assert.strictEqual(set.at(0), '__proto__');
assert.strictEqual(set.indexOf('__proto__'), 0);
};
exports['test .fromArray() with duplicates'] = function (assert, util) {
var set = ArraySet.fromArray(['foo', 'foo']);
assert.ok(set.has('foo'));
assert.strictEqual(set.at(0), 'foo');
assert.strictEqual(set.indexOf('foo'), 0);
assert.strictEqual(set.toArray().length, 1);
set = ArraySet.fromArray(['foo', 'foo'], true);
assert.ok(set.has('foo'));
assert.strictEqual(set.at(0), 'foo');
assert.strictEqual(set.at(1), 'foo');
assert.strictEqual(set.indexOf('foo'), 0);
assert.strictEqual(set.toArray().length, 2);
};
exports['test .add() with duplicates'] = function (assert, util) {
var set = new ArraySet();
set.add('foo');
set.add('foo');
assert.ok(set.has('foo'));
assert.strictEqual(set.at(0), 'foo');
assert.strictEqual(set.indexOf('foo'), 0);
assert.strictEqual(set.toArray().length, 1);
set.add('foo', true);
assert.ok(set.has('foo'));
assert.strictEqual(set.at(0), 'foo');
assert.strictEqual(set.at(1), 'foo');
assert.strictEqual(set.indexOf('foo'), 0);
assert.strictEqual(set.toArray().length, 2);
};
});

View File

@@ -0,0 +1,24 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64VLQ = require('../../lib/source-map/base64-vlq');
exports['test normal encoding and decoding'] = function (assert, util) {
var result;
for (var i = -255; i < 256; i++) {
result = base64VLQ.decode(base64VLQ.encode(i));
assert.ok(result);
assert.equal(result.value, i);
assert.equal(result.rest, "");
}
};
});

View File

@@ -0,0 +1,35 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var base64 = require('../../lib/source-map/base64');
exports['test out of range encoding'] = function (assert, util) {
assert.throws(function () {
base64.encode(-1);
});
assert.throws(function () {
base64.encode(64);
});
};
exports['test out of range decoding'] = function (assert, util) {
assert.throws(function () {
base64.decode('=');
});
};
exports['test normal encoding and decoding'] = function (assert, util) {
for (var i = 0; i < 64; i++) {
assert.equal(base64.decode(base64.encode(i)), i);
}
};
});

View File

@@ -0,0 +1,54 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var binarySearch = require('../../lib/source-map/binary-search');
function numberCompare(a, b) {
return a - b;
}
exports['test too high'] = function (assert, util) {
var needle = 30;
var haystack = [2,4,6,8,10,12,14,16,18,20];
assert.doesNotThrow(function () {
binarySearch.search(needle, haystack, numberCompare);
});
assert.equal(binarySearch.search(needle, haystack, numberCompare), 20);
};
exports['test too low'] = function (assert, util) {
var needle = 1;
var haystack = [2,4,6,8,10,12,14,16,18,20];
assert.doesNotThrow(function () {
binarySearch.search(needle, haystack, numberCompare);
});
assert.equal(binarySearch.search(needle, haystack, numberCompare), null);
};
exports['test exact search'] = function (assert, util) {
var needle = 4;
var haystack = [2,4,6,8,10,12,14,16,18,20];
assert.equal(binarySearch.search(needle, haystack, numberCompare), 4);
};
exports['test fuzzy search'] = function (assert, util) {
var needle = 19;
var haystack = [2,4,6,8,10,12,14,16,18,20];
assert.equal(binarySearch.search(needle, haystack, numberCompare), 18);
};
});

View File

@@ -0,0 +1,72 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
exports['test eating our own dog food'] = function (assert, util) {
var smg = new SourceMapGenerator({
file: 'testing.js',
sourceRoot: '/wu/tang'
});
smg.addMapping({
source: 'gza.coffee',
original: { line: 1, column: 0 },
generated: { line: 2, column: 2 }
});
smg.addMapping({
source: 'gza.coffee',
original: { line: 2, column: 0 },
generated: { line: 3, column: 2 }
});
smg.addMapping({
source: 'gza.coffee',
original: { line: 3, column: 0 },
generated: { line: 4, column: 2 }
});
smg.addMapping({
source: 'gza.coffee',
original: { line: 4, column: 0 },
generated: { line: 5, column: 2 }
});
var smc = new SourceMapConsumer(smg.toString());
// Exact
util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 0, null, smc, assert);
util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 0, null, smc, assert);
util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 0, null, smc, assert);
util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 0, null, smc, assert);
// Fuzzy
// Original to generated
util.assertMapping(2, 0, null, null, null, null, smc, assert, true);
util.assertMapping(2, 9, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true);
util.assertMapping(3, 0, '/wu/tang/gza.coffee', 1, 0, null, smc, assert, true);
util.assertMapping(3, 9, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true);
util.assertMapping(4, 0, '/wu/tang/gza.coffee', 2, 0, null, smc, assert, true);
util.assertMapping(4, 9, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true);
util.assertMapping(5, 0, '/wu/tang/gza.coffee', 3, 0, null, smc, assert, true);
util.assertMapping(5, 9, '/wu/tang/gza.coffee', 4, 0, null, smc, assert, true);
// Generated to original
util.assertMapping(2, 2, '/wu/tang/gza.coffee', 1, 1, null, smc, assert, null, true);
util.assertMapping(3, 2, '/wu/tang/gza.coffee', 2, 3, null, smc, assert, null, true);
util.assertMapping(4, 2, '/wu/tang/gza.coffee', 3, 6, null, smc, assert, null, true);
util.assertMapping(5, 2, '/wu/tang/gza.coffee', 4, 9, null, smc, assert, null, true);
};
});

View File

@@ -0,0 +1,451 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
exports['test that we can instantiate with a string or an objects'] = function (assert, util) {
assert.doesNotThrow(function () {
var map = new SourceMapConsumer(util.testMap);
});
assert.doesNotThrow(function () {
var map = new SourceMapConsumer(JSON.stringify(util.testMap));
});
};
exports['test that the `sources` field has the original sources'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
var sources = map.sources;
assert.equal(sources[0], '/the/root/one.js');
assert.equal(sources[1], '/the/root/two.js');
assert.equal(sources.length, 2);
};
exports['test that the source root is reflected in a mapping\'s source field'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
var mapping;
mapping = map.originalPositionFor({
line: 2,
column: 1
});
assert.equal(mapping.source, '/the/root/two.js');
mapping = map.originalPositionFor({
line: 1,
column: 1
});
assert.equal(mapping.source, '/the/root/one.js');
};
exports['test mapping tokens back exactly'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
util.assertMapping(1, 1, '/the/root/one.js', 1, 1, null, map, assert);
util.assertMapping(1, 5, '/the/root/one.js', 1, 5, null, map, assert);
util.assertMapping(1, 9, '/the/root/one.js', 1, 11, null, map, assert);
util.assertMapping(1, 18, '/the/root/one.js', 1, 21, 'bar', map, assert);
util.assertMapping(1, 21, '/the/root/one.js', 2, 3, null, map, assert);
util.assertMapping(1, 28, '/the/root/one.js', 2, 10, 'baz', map, assert);
util.assertMapping(1, 32, '/the/root/one.js', 2, 14, 'bar', map, assert);
util.assertMapping(2, 1, '/the/root/two.js', 1, 1, null, map, assert);
util.assertMapping(2, 5, '/the/root/two.js', 1, 5, null, map, assert);
util.assertMapping(2, 9, '/the/root/two.js', 1, 11, null, map, assert);
util.assertMapping(2, 18, '/the/root/two.js', 1, 21, 'n', map, assert);
util.assertMapping(2, 21, '/the/root/two.js', 2, 3, null, map, assert);
util.assertMapping(2, 28, '/the/root/two.js', 2, 10, 'n', map, assert);
};
exports['test mapping tokens fuzzy'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
// Finding original positions
util.assertMapping(1, 20, '/the/root/one.js', 1, 21, 'bar', map, assert, true);
util.assertMapping(1, 30, '/the/root/one.js', 2, 10, 'baz', map, assert, true);
util.assertMapping(2, 12, '/the/root/two.js', 1, 11, null, map, assert, true);
// Finding generated positions
util.assertMapping(1, 18, '/the/root/one.js', 1, 22, 'bar', map, assert, null, true);
util.assertMapping(1, 28, '/the/root/one.js', 2, 13, 'baz', map, assert, null, true);
util.assertMapping(2, 9, '/the/root/two.js', 1, 16, null, map, assert, null, true);
};
exports['test creating source map consumers with )]}\' prefix'] = function (assert, util) {
assert.doesNotThrow(function () {
var map = new SourceMapConsumer(")]}'" + JSON.stringify(util.testMap));
});
};
exports['test eachMapping'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
var previousLine = -Infinity;
var previousColumn = -Infinity;
map.eachMapping(function (mapping) {
assert.ok(mapping.generatedLine >= previousLine);
if (mapping.source) {
assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0);
}
if (mapping.generatedLine === previousLine) {
assert.ok(mapping.generatedColumn >= previousColumn);
previousColumn = mapping.generatedColumn;
}
else {
previousLine = mapping.generatedLine;
previousColumn = -Infinity;
}
});
};
exports['test iterating over mappings in a different order'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
var previousLine = -Infinity;
var previousColumn = -Infinity;
var previousSource = "";
map.eachMapping(function (mapping) {
assert.ok(mapping.source >= previousSource);
if (mapping.source === previousSource) {
assert.ok(mapping.originalLine >= previousLine);
if (mapping.originalLine === previousLine) {
assert.ok(mapping.originalColumn >= previousColumn);
previousColumn = mapping.originalColumn;
}
else {
previousLine = mapping.originalLine;
previousColumn = -Infinity;
}
}
else {
previousSource = mapping.source;
previousLine = -Infinity;
previousColumn = -Infinity;
}
}, null, SourceMapConsumer.ORIGINAL_ORDER);
};
exports['test that we can set the context for `this` in eachMapping'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMap);
var context = {};
map.eachMapping(function () {
assert.equal(this, context);
}, context);
};
exports['test that the `sourcesContent` field has the original sources'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMapWithSourcesContent);
var sourcesContent = map.sourcesContent;
assert.equal(sourcesContent[0], ' ONE.foo = function (bar) {\n return baz(bar);\n };');
assert.equal(sourcesContent[1], ' TWO.inc = function (n) {\n return n + 1;\n };');
assert.equal(sourcesContent.length, 2);
};
exports['test that we can get the original sources for the sources'] = function (assert, util) {
var map = new SourceMapConsumer(util.testMapWithSourcesContent);
var sources = map.sources;
assert.equal(map.sourceContentFor(sources[0]), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
assert.equal(map.sourceContentFor(sources[1]), ' TWO.inc = function (n) {\n return n + 1;\n };');
assert.equal(map.sourceContentFor("one.js"), ' ONE.foo = function (bar) {\n return baz(bar);\n };');
assert.equal(map.sourceContentFor("two.js"), ' TWO.inc = function (n) {\n return n + 1;\n };');
assert.throws(function () {
map.sourceContentFor("");
}, Error);
assert.throws(function () {
map.sourceContentFor("/the/root/three.js");
}, Error);
assert.throws(function () {
map.sourceContentFor("three.js");
}, Error);
};
exports['test sourceRoot + generatedPositionFor'] = function (assert, util) {
var map = new SourceMapGenerator({
sourceRoot: 'foo/bar',
file: 'baz.js'
});
map.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: 'bang.coffee'
});
map.addMapping({
original: { line: 5, column: 5 },
generated: { line: 6, column: 6 },
source: 'bang.coffee'
});
map = new SourceMapConsumer(map.toString());
// Should handle without sourceRoot.
var pos = map.generatedPositionFor({
line: 1,
column: 1,
source: 'bang.coffee'
});
assert.equal(pos.line, 2);
assert.equal(pos.column, 2);
// Should handle with sourceRoot.
var pos = map.generatedPositionFor({
line: 1,
column: 1,
source: 'foo/bar/bang.coffee'
});
assert.equal(pos.line, 2);
assert.equal(pos.column, 2);
};
exports['test sourceRoot + originalPositionFor'] = function (assert, util) {
var map = new SourceMapGenerator({
sourceRoot: 'foo/bar',
file: 'baz.js'
});
map.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: 'bang.coffee'
});
map = new SourceMapConsumer(map.toString());
var pos = map.originalPositionFor({
line: 2,
column: 2,
});
// Should always have the prepended source root
assert.equal(pos.source, 'foo/bar/bang.coffee');
assert.equal(pos.line, 1);
assert.equal(pos.column, 1);
};
exports['test github issue #56'] = function (assert, util) {
var map = new SourceMapGenerator({
sourceRoot: 'http://',
file: 'www.example.com/foo.js'
});
map.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: 'www.example.com/original.js'
});
map = new SourceMapConsumer(map.toString());
var sources = map.sources;
assert.equal(sources.length, 1);
assert.equal(sources[0], 'http://www.example.com/original.js');
};
exports['test github issue #43'] = function (assert, util) {
var map = new SourceMapGenerator({
sourceRoot: 'http://example.com',
file: 'foo.js'
});
map.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: 'http://cdn.example.com/original.js'
});
map = new SourceMapConsumer(map.toString());
var sources = map.sources;
assert.equal(sources.length, 1,
'Should only be one source.');
assert.equal(sources[0], 'http://cdn.example.com/original.js',
'Should not be joined with the sourceRoot.');
};
exports['test absolute path, but same host sources'] = function (assert, util) {
var map = new SourceMapGenerator({
sourceRoot: 'http://example.com/foo/bar',
file: 'foo.js'
});
map.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: '/original.js'
});
map = new SourceMapConsumer(map.toString());
var sources = map.sources;
assert.equal(sources.length, 1,
'Should only be one source.');
assert.equal(sources[0], 'http://example.com/original.js',
'Source should be relative the host of the source root.');
};
exports['test github issue #64'] = function (assert, util) {
var map = new SourceMapConsumer({
"version": 3,
"file": "foo.js",
"sourceRoot": "http://example.com/",
"sources": ["/a"],
"names": [],
"mappings": "AACA",
"sourcesContent": ["foo"]
});
assert.equal(map.sourceContentFor("a"), "foo");
assert.equal(map.sourceContentFor("/a"), "foo");
};
exports['test bug 885597'] = function (assert, util) {
var map = new SourceMapConsumer({
"version": 3,
"file": "foo.js",
"sourceRoot": "file:///Users/AlGore/Invented/The/Internet/",
"sources": ["/a"],
"names": [],
"mappings": "AACA",
"sourcesContent": ["foo"]
});
var s = map.sources[0];
assert.equal(map.sourceContentFor(s), "foo");
};
exports['test github issue #72, duplicate sources'] = function (assert, util) {
var map = new SourceMapConsumer({
"version": 3,
"file": "foo.js",
"sources": ["source1.js", "source1.js", "source3.js"],
"names": [],
"mappings": ";EAAC;;IAEE;;MEEE",
"sourceRoot": "http://example.com"
});
var pos = map.originalPositionFor({
line: 2,
column: 2
});
assert.equal(pos.source, 'http://example.com/source1.js');
assert.equal(pos.line, 1);
assert.equal(pos.column, 1);
var pos = map.originalPositionFor({
line: 4,
column: 4
});
assert.equal(pos.source, 'http://example.com/source1.js');
assert.equal(pos.line, 3);
assert.equal(pos.column, 3);
var pos = map.originalPositionFor({
line: 6,
column: 6
});
assert.equal(pos.source, 'http://example.com/source3.js');
assert.equal(pos.line, 5);
assert.equal(pos.column, 5);
};
exports['test github issue #72, duplicate names'] = function (assert, util) {
var map = new SourceMapConsumer({
"version": 3,
"file": "foo.js",
"sources": ["source.js"],
"names": ["name1", "name1", "name3"],
"mappings": ";EAACA;;IAEEA;;MAEEE",
"sourceRoot": "http://example.com"
});
var pos = map.originalPositionFor({
line: 2,
column: 2
});
assert.equal(pos.name, 'name1');
assert.equal(pos.line, 1);
assert.equal(pos.column, 1);
var pos = map.originalPositionFor({
line: 4,
column: 4
});
assert.equal(pos.name, 'name1');
assert.equal(pos.line, 3);
assert.equal(pos.column, 3);
var pos = map.originalPositionFor({
line: 6,
column: 6
});
assert.equal(pos.name, 'name3');
assert.equal(pos.line, 5);
assert.equal(pos.column, 5);
};
exports['test SourceMapConsumer.fromSourceMap'] = function (assert, util) {
var smg = new SourceMapGenerator({
sourceRoot: 'http://example.com/',
file: 'foo.js'
});
smg.addMapping({
original: { line: 1, column: 1 },
generated: { line: 2, column: 2 },
source: 'bar.js'
});
smg.addMapping({
original: { line: 2, column: 2 },
generated: { line: 4, column: 4 },
source: 'baz.js',
name: 'dirtMcGirt'
});
smg.setSourceContent('baz.js', 'baz.js content');
var smc = SourceMapConsumer.fromSourceMap(smg);
assert.equal(smc.file, 'foo.js');
assert.equal(smc.sourceRoot, 'http://example.com/');
assert.equal(smc.sources.length, 2);
assert.equal(smc.sources[0], 'http://example.com/bar.js');
assert.equal(smc.sources[1], 'http://example.com/baz.js');
assert.equal(smc.sourceContentFor('baz.js'), 'baz.js content');
var pos = smc.originalPositionFor({
line: 2,
column: 2
});
assert.equal(pos.line, 1);
assert.equal(pos.column, 1);
assert.equal(pos.source, 'http://example.com/bar.js');
assert.equal(pos.name, null);
pos = smc.generatedPositionFor({
line: 1,
column: 1,
source: 'http://example.com/bar.js'
});
assert.equal(pos.line, 2);
assert.equal(pos.column, 2);
pos = smc.originalPositionFor({
line: 4,
column: 4
});
assert.equal(pos.line, 2);
assert.equal(pos.column, 2);
assert.equal(pos.source, 'http://example.com/baz.js');
assert.equal(pos.name, 'dirtMcGirt');
pos = smc.generatedPositionFor({
line: 2,
column: 2,
source: 'http://example.com/baz.js'
});
assert.equal(pos.line, 4);
assert.equal(pos.column, 4);
};
});

View File

@@ -0,0 +1,417 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
var SourceNode = require('../../lib/source-map/source-node').SourceNode;
var util = require('./util');
exports['test some simple stuff'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'foo.js',
sourceRoot: '.'
});
assert.ok(true);
};
exports['test JSON serialization'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'foo.js',
sourceRoot: '.'
});
assert.equal(map.toString(), JSON.stringify(map));
};
exports['test adding mappings (case 1)'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'generated-foo.js',
sourceRoot: '.'
});
assert.doesNotThrow(function () {
map.addMapping({
generated: { line: 1, column: 1 }
});
});
};
exports['test adding mappings (case 2)'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'generated-foo.js',
sourceRoot: '.'
});
assert.doesNotThrow(function () {
map.addMapping({
generated: { line: 1, column: 1 },
source: 'bar.js',
original: { line: 1, column: 1 }
});
});
};
exports['test adding mappings (case 3)'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'generated-foo.js',
sourceRoot: '.'
});
assert.doesNotThrow(function () {
map.addMapping({
generated: { line: 1, column: 1 },
source: 'bar.js',
original: { line: 1, column: 1 },
name: 'someToken'
});
});
};
exports['test adding mappings (invalid)'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'generated-foo.js',
sourceRoot: '.'
});
// Not enough info.
assert.throws(function () {
map.addMapping({});
});
// Original file position, but no source.
assert.throws(function () {
map.addMapping({
generated: { line: 1, column: 1 },
original: { line: 1, column: 1 }
});
});
};
exports['test that the correct mappings are being generated'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'min.js',
sourceRoot: '/the/root'
});
map.addMapping({
generated: { line: 1, column: 1 },
original: { line: 1, column: 1 },
source: 'one.js'
});
map.addMapping({
generated: { line: 1, column: 5 },
original: { line: 1, column: 5 },
source: 'one.js'
});
map.addMapping({
generated: { line: 1, column: 9 },
original: { line: 1, column: 11 },
source: 'one.js'
});
map.addMapping({
generated: { line: 1, column: 18 },
original: { line: 1, column: 21 },
source: 'one.js',
name: 'bar'
});
map.addMapping({
generated: { line: 1, column: 21 },
original: { line: 2, column: 3 },
source: 'one.js'
});
map.addMapping({
generated: { line: 1, column: 28 },
original: { line: 2, column: 10 },
source: 'one.js',
name: 'baz'
});
map.addMapping({
generated: { line: 1, column: 32 },
original: { line: 2, column: 14 },
source: 'one.js',
name: 'bar'
});
map.addMapping({
generated: { line: 2, column: 1 },
original: { line: 1, column: 1 },
source: 'two.js'
});
map.addMapping({
generated: { line: 2, column: 5 },
original: { line: 1, column: 5 },
source: 'two.js'
});
map.addMapping({
generated: { line: 2, column: 9 },
original: { line: 1, column: 11 },
source: 'two.js'
});
map.addMapping({
generated: { line: 2, column: 18 },
original: { line: 1, column: 21 },
source: 'two.js',
name: 'n'
});
map.addMapping({
generated: { line: 2, column: 21 },
original: { line: 2, column: 3 },
source: 'two.js'
});
map.addMapping({
generated: { line: 2, column: 28 },
original: { line: 2, column: 10 },
source: 'two.js',
name: 'n'
});
map = JSON.parse(map.toString());
util.assertEqualMaps(assert, map, util.testMap);
};
exports['test that source content can be set'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'min.js',
sourceRoot: '/the/root'
});
map.addMapping({
generated: { line: 1, column: 1 },
original: { line: 1, column: 1 },
source: 'one.js'
});
map.addMapping({
generated: { line: 2, column: 1 },
original: { line: 1, column: 1 },
source: 'two.js'
});
map.setSourceContent('one.js', 'one file content');
map = JSON.parse(map.toString());
assert.equal(map.sources[0], 'one.js');
assert.equal(map.sources[1], 'two.js');
assert.equal(map.sourcesContent[0], 'one file content');
assert.equal(map.sourcesContent[1], null);
};
exports['test .fromSourceMap'] = function (assert, util) {
var map = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(util.testMap));
util.assertEqualMaps(assert, map.toJSON(), util.testMap);
};
exports['test .fromSourceMap with sourcesContent'] = function (assert, util) {
var map = SourceMapGenerator.fromSourceMap(
new SourceMapConsumer(util.testMapWithSourcesContent));
util.assertEqualMaps(assert, map.toJSON(), util.testMapWithSourcesContent);
};
exports['test applySourceMap'] = function (assert, util) {
var node = new SourceNode(null, null, null, [
new SourceNode(2, 0, 'fileX', 'lineX2\n'),
'genA1\n',
new SourceNode(2, 0, 'fileY', 'lineY2\n'),
'genA2\n',
new SourceNode(1, 0, 'fileX', 'lineX1\n'),
'genA3\n',
new SourceNode(1, 0, 'fileY', 'lineY1\n')
]);
var mapStep1 = node.toStringWithSourceMap({
file: 'fileA'
}).map;
mapStep1.setSourceContent('fileX', 'lineX1\nlineX2\n');
mapStep1 = mapStep1.toJSON();
node = new SourceNode(null, null, null, [
'gen1\n',
new SourceNode(1, 0, 'fileA', 'lineA1\n'),
new SourceNode(2, 0, 'fileA', 'lineA2\n'),
new SourceNode(3, 0, 'fileA', 'lineA3\n'),
new SourceNode(4, 0, 'fileA', 'lineA4\n'),
new SourceNode(1, 0, 'fileB', 'lineB1\n'),
new SourceNode(2, 0, 'fileB', 'lineB2\n'),
'gen2\n'
]);
var mapStep2 = node.toStringWithSourceMap({
file: 'fileGen'
}).map;
mapStep2.setSourceContent('fileB', 'lineB1\nlineB2\n');
mapStep2 = mapStep2.toJSON();
node = new SourceNode(null, null, null, [
'gen1\n',
new SourceNode(2, 0, 'fileX', 'lineA1\n'),
new SourceNode(2, 0, 'fileA', 'lineA2\n'),
new SourceNode(2, 0, 'fileY', 'lineA3\n'),
new SourceNode(4, 0, 'fileA', 'lineA4\n'),
new SourceNode(1, 0, 'fileB', 'lineB1\n'),
new SourceNode(2, 0, 'fileB', 'lineB2\n'),
'gen2\n'
]);
var expectedMap = node.toStringWithSourceMap({
file: 'fileGen'
}).map;
expectedMap.setSourceContent('fileX', 'lineX1\nlineX2\n');
expectedMap.setSourceContent('fileB', 'lineB1\nlineB2\n');
expectedMap = expectedMap.toJSON();
// apply source map "mapStep1" to "mapStep2"
var generator = SourceMapGenerator.fromSourceMap(new SourceMapConsumer(mapStep2));
generator.applySourceMap(new SourceMapConsumer(mapStep1));
var actualMap = generator.toJSON();
util.assertEqualMaps(assert, actualMap, expectedMap);
};
exports['test sorting with duplicate generated mappings'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'test.js'
});
map.addMapping({
generated: { line: 3, column: 0 },
original: { line: 2, column: 0 },
source: 'a.js'
});
map.addMapping({
generated: { line: 2, column: 0 }
});
map.addMapping({
generated: { line: 2, column: 0 }
});
map.addMapping({
generated: { line: 1, column: 0 },
original: { line: 1, column: 0 },
source: 'a.js'
});
util.assertEqualMaps(assert, map.toJSON(), {
version: 3,
file: 'test.js',
sources: ['a.js'],
names: [],
mappings: 'AAAA;A;AACA'
});
};
exports['test ignore duplicate mappings.'] = function (assert, util) {
var init = { file: 'min.js', sourceRoot: '/the/root' };
var map1, map2;
// null original source location
var nullMapping1 = {
generated: { line: 1, column: 0 }
};
var nullMapping2 = {
generated: { line: 2, column: 2 }
};
map1 = new SourceMapGenerator(init);
map2 = new SourceMapGenerator(init);
map1.addMapping(nullMapping1);
map1.addMapping(nullMapping1);
map2.addMapping(nullMapping1);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
map1.addMapping(nullMapping2);
map1.addMapping(nullMapping1);
map2.addMapping(nullMapping2);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
// original source location
var srcMapping1 = {
generated: { line: 1, column: 0 },
original: { line: 11, column: 0 },
source: 'srcMapping1.js'
};
var srcMapping2 = {
generated: { line: 2, column: 2 },
original: { line: 11, column: 0 },
source: 'srcMapping2.js'
};
map1 = new SourceMapGenerator(init);
map2 = new SourceMapGenerator(init);
map1.addMapping(srcMapping1);
map1.addMapping(srcMapping1);
map2.addMapping(srcMapping1);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
map1.addMapping(srcMapping2);
map1.addMapping(srcMapping1);
map2.addMapping(srcMapping2);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
// full original source and name information
var fullMapping1 = {
generated: { line: 1, column: 0 },
original: { line: 11, column: 0 },
source: 'fullMapping1.js',
name: 'fullMapping1'
};
var fullMapping2 = {
generated: { line: 2, column: 2 },
original: { line: 11, column: 0 },
source: 'fullMapping2.js',
name: 'fullMapping2'
};
map1 = new SourceMapGenerator(init);
map2 = new SourceMapGenerator(init);
map1.addMapping(fullMapping1);
map1.addMapping(fullMapping1);
map2.addMapping(fullMapping1);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
map1.addMapping(fullMapping2);
map1.addMapping(fullMapping1);
map2.addMapping(fullMapping2);
util.assertEqualMaps(assert, map1.toJSON(), map2.toJSON());
};
exports['test github issue #72, check for duplicate names or sources'] = function (assert, util) {
var map = new SourceMapGenerator({
file: 'test.js'
});
map.addMapping({
generated: { line: 1, column: 1 },
original: { line: 2, column: 2 },
source: 'a.js',
name: 'foo'
});
map.addMapping({
generated: { line: 3, column: 3 },
original: { line: 4, column: 4 },
source: 'a.js',
name: 'foo'
});
util.assertEqualMaps(assert, map.toJSON(), {
version: 3,
file: 'test.js',
sources: ['a.js'],
names: ['foo'],
mappings: 'CACEA;;GAEEA'
});
};
});

View File

@@ -0,0 +1,365 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var SourceMapGenerator = require('../../lib/source-map/source-map-generator').SourceMapGenerator;
var SourceMapConsumer = require('../../lib/source-map/source-map-consumer').SourceMapConsumer;
var SourceNode = require('../../lib/source-map/source-node').SourceNode;
exports['test .add()'] = function (assert, util) {
var node = new SourceNode(null, null, null);
// Adding a string works.
node.add('function noop() {}');
// Adding another source node works.
node.add(new SourceNode(null, null, null));
// Adding an array works.
node.add(['function foo() {',
new SourceNode(null, null, null,
'return 10;'),
'}']);
// Adding other stuff doesn't.
assert.throws(function () {
node.add({});
});
assert.throws(function () {
node.add(function () {});
});
};
exports['test .prepend()'] = function (assert, util) {
var node = new SourceNode(null, null, null);
// Prepending a string works.
node.prepend('function noop() {}');
assert.equal(node.children[0], 'function noop() {}');
assert.equal(node.children.length, 1);
// Prepending another source node works.
node.prepend(new SourceNode(null, null, null));
assert.equal(node.children[0], '');
assert.equal(node.children[1], 'function noop() {}');
assert.equal(node.children.length, 2);
// Prepending an array works.
node.prepend(['function foo() {',
new SourceNode(null, null, null,
'return 10;'),
'}']);
assert.equal(node.children[0], 'function foo() {');
assert.equal(node.children[1], 'return 10;');
assert.equal(node.children[2], '}');
assert.equal(node.children[3], '');
assert.equal(node.children[4], 'function noop() {}');
assert.equal(node.children.length, 5);
// Prepending other stuff doesn't.
assert.throws(function () {
node.prepend({});
});
assert.throws(function () {
node.prepend(function () {});
});
};
exports['test .toString()'] = function (assert, util) {
assert.equal((new SourceNode(null, null, null,
['function foo() {',
new SourceNode(null, null, null, 'return 10;'),
'}'])).toString(),
'function foo() {return 10;}');
};
exports['test .join()'] = function (assert, util) {
assert.equal((new SourceNode(null, null, null,
['a', 'b', 'c', 'd'])).join(', ').toString(),
'a, b, c, d');
};
exports['test .walk()'] = function (assert, util) {
var node = new SourceNode(null, null, null,
['(function () {\n',
' ', new SourceNode(1, 0, 'a.js', ['someCall()']), ';\n',
' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n',
'}());']);
var expected = [
{ str: '(function () {\n', source: null, line: null, column: null },
{ str: ' ', source: null, line: null, column: null },
{ str: 'someCall()', source: 'a.js', line: 1, column: 0 },
{ str: ';\n', source: null, line: null, column: null },
{ str: ' ', source: null, line: null, column: null },
{ str: 'if (foo) bar()', source: 'b.js', line: 2, column: 0 },
{ str: ';\n', source: null, line: null, column: null },
{ str: '}());', source: null, line: null, column: null },
];
var i = 0;
node.walk(function (chunk, loc) {
assert.equal(expected[i].str, chunk);
assert.equal(expected[i].source, loc.source);
assert.equal(expected[i].line, loc.line);
assert.equal(expected[i].column, loc.column);
i++;
});
};
exports['test .replaceRight'] = function (assert, util) {
var node;
// Not nested
node = new SourceNode(null, null, null, 'hello world');
node.replaceRight(/world/, 'universe');
assert.equal(node.toString(), 'hello universe');
// Nested
node = new SourceNode(null, null, null,
[new SourceNode(null, null, null, 'hey sexy mama, '),
new SourceNode(null, null, null, 'want to kill all humans?')]);
node.replaceRight(/kill all humans/, 'watch Futurama');
assert.equal(node.toString(), 'hey sexy mama, want to watch Futurama?');
};
exports['test .toStringWithSourceMap()'] = function (assert, util) {
var node = new SourceNode(null, null, null,
['(function () {\n',
' ',
new SourceNode(1, 0, 'a.js', 'someCall', 'originalCall'),
new SourceNode(1, 8, 'a.js', '()'),
';\n',
' ', new SourceNode(2, 0, 'b.js', ['if (foo) bar()']), ';\n',
'}());']);
var map = node.toStringWithSourceMap({
file: 'foo.js'
}).map;
assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
map = new SourceMapConsumer(map.toString());
var actual;
actual = map.originalPositionFor({
line: 1,
column: 4
});
assert.equal(actual.source, null);
assert.equal(actual.line, null);
assert.equal(actual.column, null);
actual = map.originalPositionFor({
line: 2,
column: 2
});
assert.equal(actual.source, 'a.js');
assert.equal(actual.line, 1);
assert.equal(actual.column, 0);
assert.equal(actual.name, 'originalCall');
actual = map.originalPositionFor({
line: 3,
column: 2
});
assert.equal(actual.source, 'b.js');
assert.equal(actual.line, 2);
assert.equal(actual.column, 0);
actual = map.originalPositionFor({
line: 3,
column: 16
});
assert.equal(actual.source, null);
assert.equal(actual.line, null);
assert.equal(actual.column, null);
actual = map.originalPositionFor({
line: 4,
column: 2
});
assert.equal(actual.source, null);
assert.equal(actual.line, null);
assert.equal(actual.column, null);
};
exports['test .fromStringWithSourceMap()'] = function (assert, util) {
var node = SourceNode.fromStringWithSourceMap(
util.testGeneratedCode,
new SourceMapConsumer(util.testMap));
var result = node.toStringWithSourceMap({
file: 'min.js'
});
var map = result.map;
var code = result.code;
assert.equal(code, util.testGeneratedCode);
assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
map = map.toJSON();
assert.equal(map.version, util.testMap.version);
assert.equal(map.file, util.testMap.file);
assert.equal(map.mappings, util.testMap.mappings);
};
exports['test .fromStringWithSourceMap() empty map'] = function (assert, util) {
var node = SourceNode.fromStringWithSourceMap(
util.testGeneratedCode,
new SourceMapConsumer(util.emptyMap));
var result = node.toStringWithSourceMap({
file: 'min.js'
});
var map = result.map;
var code = result.code;
assert.equal(code, util.testGeneratedCode);
assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
map = map.toJSON();
assert.equal(map.version, util.emptyMap.version);
assert.equal(map.file, util.emptyMap.file);
assert.equal(map.mappings.length, util.emptyMap.mappings.length);
assert.equal(map.mappings, util.emptyMap.mappings);
};
exports['test .fromStringWithSourceMap() complex version'] = function (assert, util) {
var input = new SourceNode(null, null, null, [
"(function() {\n",
" var Test = {};\n",
" ", new SourceNode(1, 0, "a.js", "Test.A = { value: 1234 };\n"),
" ", new SourceNode(2, 0, "a.js", "Test.A.x = 'xyz';"), "\n",
"}());\n",
"/* Generated Source */"]);
input = input.toStringWithSourceMap({
file: 'foo.js'
});
var node = SourceNode.fromStringWithSourceMap(
input.code,
new SourceMapConsumer(input.map.toString()));
var result = node.toStringWithSourceMap({
file: 'foo.js'
});
var map = result.map;
var code = result.code;
assert.equal(code, input.code);
assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
map = map.toJSON();
var inputMap = input.map.toJSON();
util.assertEqualMaps(assert, map, inputMap);
};
exports['test .fromStringWithSourceMap() merging duplicate mappings'] = function (assert, util) {
var input = new SourceNode(null, null, null, [
new SourceNode(1, 0, "a.js", "(function"),
new SourceNode(1, 0, "a.js", "() {\n"),
" ",
new SourceNode(1, 0, "a.js", "var Test = "),
new SourceNode(1, 0, "b.js", "{};\n"),
new SourceNode(2, 0, "b.js", "Test"),
new SourceNode(2, 0, "b.js", ".A", "A"),
new SourceNode(2, 20, "b.js", " = { value: 1234 };\n", "A"),
"}());\n",
"/* Generated Source */"
]);
input = input.toStringWithSourceMap({
file: 'foo.js'
});
var correctMap = new SourceMapGenerator({
file: 'foo.js'
});
correctMap.addMapping({
generated: { line: 1, column: 0 },
source: 'a.js',
original: { line: 1, column: 0 }
});
correctMap.addMapping({
generated: { line: 2, column: 0 }
});
correctMap.addMapping({
generated: { line: 2, column: 2 },
source: 'a.js',
original: { line: 1, column: 0 }
});
correctMap.addMapping({
generated: { line: 2, column: 13 },
source: 'b.js',
original: { line: 1, column: 0 }
});
correctMap.addMapping({
generated: { line: 3, column: 0 },
source: 'b.js',
original: { line: 2, column: 0 }
});
correctMap.addMapping({
generated: { line: 3, column: 4 },
source: 'b.js',
name: 'A',
original: { line: 2, column: 0 }
});
correctMap.addMapping({
generated: { line: 3, column: 6 },
source: 'b.js',
name: 'A',
original: { line: 2, column: 20 }
});
correctMap.addMapping({
generated: { line: 4, column: 0 }
});
var inputMap = input.map.toJSON();
correctMap = correctMap.toJSON();
util.assertEqualMaps(assert, correctMap, inputMap);
};
exports['test setSourceContent with toStringWithSourceMap'] = function (assert, util) {
var aNode = new SourceNode(1, 1, 'a.js', 'a');
aNode.setSourceContent('a.js', 'someContent');
var node = new SourceNode(null, null, null,
['(function () {\n',
' ', aNode,
' ', new SourceNode(1, 1, 'b.js', 'b'),
'}());']);
node.setSourceContent('b.js', 'otherContent');
var map = node.toStringWithSourceMap({
file: 'foo.js'
}).map;
assert.ok(map instanceof SourceMapGenerator, 'map instanceof SourceMapGenerator');
map = new SourceMapConsumer(map.toString());
assert.equal(map.sources.length, 2);
assert.equal(map.sources[0], 'a.js');
assert.equal(map.sources[1], 'b.js');
assert.equal(map.sourcesContent.length, 2);
assert.equal(map.sourcesContent[0], 'someContent');
assert.equal(map.sourcesContent[1], 'otherContent');
};
exports['test walkSourceContents'] = function (assert, util) {
var aNode = new SourceNode(1, 1, 'a.js', 'a');
aNode.setSourceContent('a.js', 'someContent');
var node = new SourceNode(null, null, null,
['(function () {\n',
' ', aNode,
' ', new SourceNode(1, 1, 'b.js', 'b'),
'}());']);
node.setSourceContent('b.js', 'otherContent');
var results = [];
node.walkSourceContents(function (sourceFile, sourceContent) {
results.push([sourceFile, sourceContent]);
});
assert.equal(results.length, 2);
assert.equal(results[0][0], 'a.js');
assert.equal(results[0][1], 'someContent');
assert.equal(results[1][0], 'b.js');
assert.equal(results[1][1], 'otherContent');
};
});

View File

@@ -0,0 +1,161 @@
/* -*- Mode: js; js-indent-level: 2; -*- */
/*
* Copyright 2011 Mozilla Foundation and contributors
* Licensed under the New BSD license. See LICENSE or:
* http://opensource.org/licenses/BSD-3-Clause
*/
if (typeof define !== 'function') {
var define = require('amdefine')(module, require);
}
define(function (require, exports, module) {
var util = require('../../lib/source-map/util');
// This is a test mapping which maps functions from two different files
// (one.js and two.js) to a minified generated source.
//
// Here is one.js:
//
// ONE.foo = function (bar) {
// return baz(bar);
// };
//
// Here is two.js:
//
// TWO.inc = function (n) {
// return n + 1;
// };
//
// And here is the generated code (min.js):
//
// ONE.foo=function(a){return baz(a);};
// TWO.inc=function(a){return a+1;};
exports.testGeneratedCode = " ONE.foo=function(a){return baz(a);};\n"+
" TWO.inc=function(a){return a+1;};";
exports.testMap = {
version: 3,
file: 'min.js',
names: ['bar', 'baz', 'n'],
sources: ['one.js', 'two.js'],
sourceRoot: '/the/root',
mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
};
exports.testMapWithSourcesContent = {
version: 3,
file: 'min.js',
names: ['bar', 'baz', 'n'],
sources: ['one.js', 'two.js'],
sourcesContent: [
' ONE.foo = function (bar) {\n' +
' return baz(bar);\n' +
' };',
' TWO.inc = function (n) {\n' +
' return n + 1;\n' +
' };'
],
sourceRoot: '/the/root',
mappings: 'CAAC,IAAI,IAAM,SAAUA,GAClB,OAAOC,IAAID;CCDb,IAAI,IAAM,SAAUE,GAClB,OAAOA'
};
exports.emptyMap = {
version: 3,
file: 'min.js',
names: [],
sources: [],
mappings: ''
};
function assertMapping(generatedLine, generatedColumn, originalSource,
originalLine, originalColumn, name, map, assert,
dontTestGenerated, dontTestOriginal) {
if (!dontTestOriginal) {
var origMapping = map.originalPositionFor({
line: generatedLine,
column: generatedColumn
});
assert.equal(origMapping.name, name,
'Incorrect name, expected ' + JSON.stringify(name)
+ ', got ' + JSON.stringify(origMapping.name));
assert.equal(origMapping.line, originalLine,
'Incorrect line, expected ' + JSON.stringify(originalLine)
+ ', got ' + JSON.stringify(origMapping.line));
assert.equal(origMapping.column, originalColumn,
'Incorrect column, expected ' + JSON.stringify(originalColumn)
+ ', got ' + JSON.stringify(origMapping.column));
var expectedSource;
if (originalSource && map.sourceRoot && originalSource.indexOf(map.sourceRoot) === 0) {
expectedSource = originalSource;
} else if (originalSource) {
expectedSource = map.sourceRoot
? util.join(map.sourceRoot, originalSource)
: originalSource;
} else {
expectedSource = null;
}
assert.equal(origMapping.source, expectedSource,
'Incorrect source, expected ' + JSON.stringify(expectedSource)
+ ', got ' + JSON.stringify(origMapping.source));
}
if (!dontTestGenerated) {
var genMapping = map.generatedPositionFor({
source: originalSource,
line: originalLine,
column: originalColumn
});
assert.equal(genMapping.line, generatedLine,
'Incorrect line, expected ' + JSON.stringify(generatedLine)
+ ', got ' + JSON.stringify(genMapping.line));
assert.equal(genMapping.column, generatedColumn,
'Incorrect column, expected ' + JSON.stringify(generatedColumn)
+ ', got ' + JSON.stringify(genMapping.column));
}
}
exports.assertMapping = assertMapping;
function assertEqualMaps(assert, actualMap, expectedMap) {
assert.equal(actualMap.version, expectedMap.version, "version mismatch");
assert.equal(actualMap.file, expectedMap.file, "file mismatch");
assert.equal(actualMap.names.length,
expectedMap.names.length,
"names length mismatch: " +
actualMap.names.join(", ") + " != " + expectedMap.names.join(", "));
for (var i = 0; i < actualMap.names.length; i++) {
assert.equal(actualMap.names[i],
expectedMap.names[i],
"names[" + i + "] mismatch: " +
actualMap.names.join(", ") + " != " + expectedMap.names.join(", "));
}
assert.equal(actualMap.sources.length,
expectedMap.sources.length,
"sources length mismatch: " +
actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", "));
for (var i = 0; i < actualMap.sources.length; i++) {
assert.equal(actualMap.sources[i],
expectedMap.sources[i],
"sources[" + i + "] length mismatch: " +
actualMap.sources.join(", ") + " != " + expectedMap.sources.join(", "));
}
assert.equal(actualMap.sourceRoot,
expectedMap.sourceRoot,
"sourceRoot mismatch: " +
actualMap.sourceRoot + " != " + expectedMap.sourceRoot);
assert.equal(actualMap.mappings, expectedMap.mappings,
"mappings mismatch:\nActual: " + actualMap.mappings + "\nExpected: " + expectedMap.mappings);
if (actualMap.sourcesContent) {
assert.equal(actualMap.sourcesContent.length,
expectedMap.sourcesContent.length,
"sourcesContent length mismatch");
for (var i = 0; i < actualMap.sourcesContent.length; i++) {
assert.equal(actualMap.sourcesContent[i],
expectedMap.sourcesContent[i],
"sourcesContent[" + i + "] mismatch");
}
}
}
exports.assertEqualMaps = assertEqualMaps;
});

79
react-app/node_modules/source-map-support/package.json generated vendored Normal file
View File

@@ -0,0 +1,79 @@
{
"_args": [
[
"source-map-support@^0.2.10",
"/Users/mromano/dev/react-sfs/node_modules/babel-register"
]
],
"_from": "source-map-support@>=0.2.10 <0.3.0",
"_id": "source-map-support@0.2.10",
"_inCache": true,
"_installable": true,
"_location": "/source-map-support",
"_npmUser": {
"email": "evan.exe@gmail.com",
"name": "evanw"
},
"_npmVersion": "1.4.28",
"_phantomChildren": {
"amdefine": "1.0.0"
},
"_requested": {
"name": "source-map-support",
"raw": "source-map-support@^0.2.10",
"rawSpec": "^0.2.10",
"scope": null,
"spec": ">=0.2.10 <0.3.0",
"type": "range"
},
"_requiredBy": [
"/babel-register"
],
"_resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz",
"_shasum": "ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc",
"_shrinkwrap": null,
"_spec": "source-map-support@^0.2.10",
"_where": "/Users/mromano/dev/react-sfs/node_modules/babel-register",
"bugs": {
"url": "https://github.com/evanw/node-source-map-support/issues"
},
"dependencies": {
"source-map": "0.1.32"
},
"description": "Fixes stack traces for files with source maps",
"devDependencies": {
"browserify": "3.44.2",
"coffee-script": "1.7.1",
"mocha": "1.18.2"
},
"directories": {},
"dist": {
"shasum": "ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc",
"tarball": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz"
},
"gitHead": "e1a092fe79a1abf1a6d7b59b7878ced3fa9e793d",
"homepage": "https://github.com/evanw/node-source-map-support",
"licenses": [
{
"type": "MIT"
}
],
"main": "./source-map-support.js",
"maintainers": [
{
"email": "evan.exe@gmail.com",
"name": "evanw"
}
],
"name": "source-map-support",
"optionalDependencies": {},
"readme": "ERROR: No README data found!",
"repository": {
"type": "git",
"url": "git+https://github.com/evanw/node-source-map-support.git"
},
"scripts": {
"test": "node_modules/mocha/bin/mocha"
},
"version": "0.2.10"
}

View File

@@ -0,0 +1,386 @@
var SourceMapConsumer = require('source-map').SourceMapConsumer;
var path = require('path');
var fs = require('fs');
// Only install once if called multiple times
var alreadyInstalled = false;
// If true, the caches are reset before a stack trace formatting operation
var emptyCacheBetweenOperations = false;
// Maps a file path to a string containing the file contents
var fileContentsCache = {};
// Maps a file path to a source map for that file
var sourceMapCache = {};
function isInBrowser() {
return ((typeof window !== 'undefined') && (typeof XMLHttpRequest === 'function'));
}
function retrieveFile(path) {
if (path in fileContentsCache) {
return fileContentsCache[path];
}
try {
// Use SJAX if we are in the browser
if (isInBrowser()) {
var xhr = new XMLHttpRequest();
xhr.open('GET', path, false);
xhr.send(null);
var contents = xhr.readyState === 4 ? xhr.responseText : null;
}
// Otherwise, use the filesystem
else {
var contents = fs.readFileSync(path, 'utf8');
}
} catch (e) {
var contents = null;
}
return fileContentsCache[path] = contents;
}
// Support URLs relative to a directory, but be careful about a protocol prefix
// in case we are in the browser (i.e. directories may start with "http://")
function supportRelativeURL(file, url) {
if (!file) return url;
var dir = path.dirname(file);
var match = /^\w+:\/\/[^\/]*/.exec(dir);
var protocol = match ? match[0] : '';
return protocol + path.resolve(dir.slice(protocol.length), url);
}
function retrieveSourceMapURL(source) {
var fileData;
if (isInBrowser()) {
var xhr = new XMLHttpRequest();
xhr.open('GET', source, false);
xhr.send(null);
fileData = xhr.readyState === 4 ? xhr.responseText : null;
// Support providing a sourceMappingURL via the SourceMap header
var sourceMapHeader = xhr.getResponseHeader("SourceMap") ||
xhr.getResponseHeader("X-SourceMap");
if (sourceMapHeader) {
return sourceMapHeader;
}
}
// Get the URL of the source map
fileData = retrieveFile(source);
var match = /\/\/[#@]\s*sourceMappingURL=(.*)\s*$/m.exec(fileData);
if (!match) return null;
return match[1];
};
// Can be overridden by the retrieveSourceMap option to install. Takes a
// generated source filename; returns a {map, optional url} object, or null if
// there is no source map. The map field may be either a string or the parsed
// JSON object (ie, it must be a valid argument to the SourceMapConsumer
// constructor).
function retrieveSourceMap(source) {
var sourceMappingURL = retrieveSourceMapURL(source);
if (!sourceMappingURL) return null;
// Read the contents of the source map
var sourceMapData;
var dataUrlPrefix = "data:application/json;base64,";
if (sourceMappingURL.slice(0, dataUrlPrefix.length).toLowerCase() == dataUrlPrefix) {
// Support source map URL as a data url
sourceMapData = new Buffer(sourceMappingURL.slice(dataUrlPrefix.length), "base64").toString();
sourceMappingURL = null;
} else {
// Support source map URLs relative to the source URL
sourceMappingURL = supportRelativeURL(source, sourceMappingURL);
sourceMapData = retrieveFile(sourceMappingURL, 'utf8');
}
if (!sourceMapData) {
return null;
}
return {
url: sourceMappingURL,
map: sourceMapData
};
}
function mapSourcePosition(position) {
var sourceMap = sourceMapCache[position.source];
if (!sourceMap) {
// Call the (overrideable) retrieveSourceMap function to get the source map.
var urlAndMap = retrieveSourceMap(position.source);
if (urlAndMap) {
sourceMap = sourceMapCache[position.source] = {
url: urlAndMap.url,
map: new SourceMapConsumer(urlAndMap.map)
};
// Load all sources stored inline with the source map into the file cache
// to pretend like they are already loaded. They may not exist on disk.
if (sourceMap.map.sourcesContent) {
sourceMap.map.sources.forEach(function(source, i) {
var contents = sourceMap.map.sourcesContent[i];
if (contents) {
var url = supportRelativeURL(sourceMap.url, source);
fileContentsCache[url] = contents;
}
});
}
} else {
sourceMap = sourceMapCache[position.source] = {
url: null,
map: null
};
}
}
// Resolve the source URL relative to the URL of the source map
if (sourceMap && sourceMap.map) {
var originalPosition = sourceMap.map.originalPositionFor(position);
// Only return the original position if a matching line was found. If no
// matching line is found then we return position instead, which will cause
// the stack trace to print the path and line for the compiled file. It is
// better to give a precise location in the compiled file than a vague
// location in the original file.
if (originalPosition.source !== null) {
originalPosition.source = supportRelativeURL(
sourceMap.url, originalPosition.source);
return originalPosition;
}
}
return position;
}
// Parses code generated by FormatEvalOrigin(), a function inside V8:
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js
function mapEvalOrigin(origin) {
// Most eval() calls are in this format
var match = /^eval at ([^(]+) \((.+):(\d+):(\d+)\)$/.exec(origin);
if (match) {
var position = mapSourcePosition({
source: match[2],
line: match[3],
column: match[4] - 1
});
return 'eval at ' + match[1] + ' (' + position.source + ':' +
position.line + ':' + (position.column + 1) + ')';
}
// Parse nested eval() calls using recursion
match = /^eval at ([^(]+) \((.+)\)$/.exec(origin);
if (match) {
return 'eval at ' + match[1] + ' (' + mapEvalOrigin(match[2]) + ')';
}
// Make sure we still return useful information if we didn't find anything
return origin;
}
// This is copied almost verbatim from the V8 source code at
// https://code.google.com/p/v8/source/browse/trunk/src/messages.js. The
// implementation of wrapCallSite() used to just forward to the actual source
// code of CallSite.prototype.toString but unfortunately a new release of V8
// did something to the prototype chain and broke the shim. The only fix I
// could find was copy/paste.
function CallSiteToString() {
var fileName;
var fileLocation = "";
if (this.isNative()) {
fileLocation = "native";
} else {
fileName = this.getScriptNameOrSourceURL();
if (!fileName && this.isEval()) {
fileLocation = this.getEvalOrigin();
fileLocation += ", "; // Expecting source position to follow.
}
if (fileName) {
fileLocation += fileName;
} else {
// Source code does not originate from a file and is not native, but we
// can still get the source position inside the source string, e.g. in
// an eval string.
fileLocation += "<anonymous>";
}
var lineNumber = this.getLineNumber();
if (lineNumber != null) {
fileLocation += ":" + lineNumber;
var columnNumber = this.getColumnNumber();
if (columnNumber) {
fileLocation += ":" + columnNumber;
}
}
}
var line = "";
var functionName = this.getFunctionName();
var addSuffix = true;
var isConstructor = this.isConstructor();
var isMethodCall = !(this.isToplevel() || isConstructor);
if (isMethodCall) {
var typeName = this.getTypeName();
var methodName = this.getMethodName();
if (functionName) {
if (typeName && functionName.indexOf(typeName) != 0) {
line += typeName + ".";
}
line += functionName;
if (methodName && functionName.indexOf("." + methodName) != functionName.length - methodName.length - 1) {
line += " [as " + methodName + "]";
}
} else {
line += typeName + "." + (methodName || "<anonymous>");
}
} else if (isConstructor) {
line += "new " + (functionName || "<anonymous>");
} else if (functionName) {
line += functionName;
} else {
line += fileLocation;
addSuffix = false;
}
if (addSuffix) {
line += " (" + fileLocation + ")";
}
return line;
}
function cloneCallSite(frame) {
var object = {};
Object.getOwnPropertyNames(Object.getPrototypeOf(frame)).forEach(function(name) {
object[name] = /^(?:is|get)/.test(name) ? function() { return frame[name].call(frame); } : frame[name];
});
object.toString = CallSiteToString;
return object;
}
function wrapCallSite(frame) {
// Most call sites will return the source file from getFileName(), but code
// passed to eval() ending in "//# sourceURL=..." will return the source file
// from getScriptNameOrSourceURL() instead
var source = frame.getFileName() || frame.getScriptNameOrSourceURL();
if (source) {
var position = mapSourcePosition({
source: source,
line: frame.getLineNumber(),
column: frame.getColumnNumber() - 1
});
frame = cloneCallSite(frame);
frame.getFileName = function() { return position.source; };
frame.getLineNumber = function() { return position.line; };
frame.getColumnNumber = function() { return position.column + 1; };
frame.getScriptNameOrSourceURL = function() { return position.source; };
return frame;
}
// Code called using eval() needs special handling
var origin = frame.isEval() && frame.getEvalOrigin();
if (origin) {
origin = mapEvalOrigin(origin);
frame = cloneCallSite(frame);
frame.getEvalOrigin = function() { return origin; };
return frame;
}
// If we get here then we were unable to change the source position
return frame;
}
// This function is part of the V8 stack trace API, for more info see:
// http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
function prepareStackTrace(error, stack) {
if (emptyCacheBetweenOperations) {
fileContentsCache = {};
sourceMapCache = {};
}
return error + stack.map(function(frame) {
return '\n at ' + wrapCallSite(frame);
}).join('');
}
// Generate position and snippet of original source with pointer
function getErrorSource(error) {
var match = /\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(error.stack);
if (match) {
var source = match[1];
var line = +match[2];
var column = +match[3];
// Support the inline sourceContents inside the source map
var contents = fileContentsCache[source];
// Support files on disk
if (!contents && fs.existsSync(source)) {
contents = fs.readFileSync(source, 'utf8');
}
// Format the line from the original source code like node does
if (contents) {
var code = contents.split(/(?:\r\n|\r|\n)/)[line - 1];
if (code) {
return '\n' + source + ':' + line + '\n' + code + '\n' +
new Array(column).join(' ') + '^';
}
}
}
return null;
}
// Mimic node's stack trace printing when an exception escapes the process
function handleUncaughtExceptions(error) {
if (!error || !error.stack) {
console.log('Uncaught exception:', error);
} else {
var source = getErrorSource(error);
if (source !== null) console.log(source);
console.log(error.stack);
}
process.exit(1);
}
exports.wrapCallSite = wrapCallSite;
exports.getErrorSource = getErrorSource;
exports.mapSourcePosition = mapSourcePosition;
exports.retrieveSourceMap = retrieveSourceMap;
exports.install = function(options) {
if (!alreadyInstalled) {
alreadyInstalled = true;
Error.prepareStackTrace = prepareStackTrace;
// Configure options
options = options || {};
var installHandler = 'handleUncaughtExceptions' in options ?
options.handleUncaughtExceptions : true;
emptyCacheBetweenOperations = 'emptyCacheBetweenOperations' in options ?
options.emptyCacheBetweenOperations : false;
// Allow sources to be found by methods other than reading the files
// directly from disk.
if (options.retrieveFile)
retrieveFile = options.retrieveFile;
// Allow source maps to be found by methods other than reading the files
// directly from disk.
if (options.retrieveSourceMap)
retrieveSourceMap = options.retrieveSourceMap;
// Provide the option to not install the uncaught exception handler. This is
// to support other uncaught exception handlers (in test frameworks, for
// example). If this handler is not installed and there are no other uncaught
// exception handlers, uncaught exceptions will be caught by node's built-in
// exception handler and the process will still be terminated. However, the
// generated JavaScript code will be shown above the stack trace instead of
// the original source code.
if (installHandler && !isInBrowser()) {
process.on('uncaughtException', handleUncaughtExceptions);
}
}
};

384
react-app/node_modules/source-map-support/test.js generated vendored Normal file
View File

@@ -0,0 +1,384 @@
require('./source-map-support').install({
emptyCacheBetweenOperations: true // Needed to be able to test for failure
});
var SourceMapGenerator = require('source-map').SourceMapGenerator;
var child_process = require('child_process');
var assert = require('assert');
var fs = require('fs');
function compareLines(actual, expected) {
assert(actual.length >= expected.length, 'got ' + actual.length + ' lines but expected at least ' + expected.length + ' lines');
for (var i = 0; i < expected.length; i++) {
// Some tests are regular expressions because the output format changed slightly between node v0.9.2 and v0.9.3
if (expected[i] instanceof RegExp) {
assert(expected[i].test(actual[i]), JSON.stringify(actual[i]) + ' does not match ' + expected[i]);
} else {
assert.equal(actual[i], expected[i]);
}
}
}
function createEmptySourceMap() {
return new SourceMapGenerator({
file: '.generated.js',
sourceRoot: '.'
});
}
function createSourceMapWithGap() {
var sourceMap = createEmptySourceMap();
sourceMap.addMapping({
generated: { line: 100, column: 0 },
original: { line: 100, column: 0 },
source: '.original.js'
});
return sourceMap;
}
function createSingleLineSourceMap() {
var sourceMap = createEmptySourceMap();
sourceMap.addMapping({
generated: { line: 1, column: 0 },
original: { line: 1, column: 0 },
source: '.original.js'
});
return sourceMap;
}
function createMultiLineSourceMap() {
var sourceMap = createEmptySourceMap();
for (var i = 1; i <= 100; i++) {
sourceMap.addMapping({
generated: { line: i, column: 0 },
original: { line: 1000 + i, column: 99 + i },
source: 'line' + i + '.js'
});
}
return sourceMap;
}
function createMultiLineSourceMapWithSourcesContent() {
var sourceMap = createEmptySourceMap();
var original = new Array(1001).join('\n');
for (var i = 1; i <= 100; i++) {
sourceMap.addMapping({
generated: { line: i, column: 0 },
original: { line: 1000 + i, column: 4 },
source: 'original.js'
});
original += ' line ' + i + '\n';
}
sourceMap.setSourceContent('original.js', original);
return sourceMap;
}
function compareStackTrace(sourceMap, source, expected) {
// Check once with a separate source map
fs.writeFileSync('.generated.js.map', sourceMap);
fs.writeFileSync('.generated.js', 'exports.test = function() {' +
source.join('\n') + '};//@ sourceMappingURL=.generated.js.map');
try {
delete require.cache[require.resolve('./.generated')];
require('./.generated').test();
} catch (e) {
compareLines(e.stack.split('\n'), expected);
}
fs.unlinkSync('.generated.js');
fs.unlinkSync('.generated.js.map');
// Check again with an inline source map (in a data URL)
fs.writeFileSync('.generated.js', 'exports.test = function() {' +
source.join('\n') + '};//@ sourceMappingURL=data:application/json;base64,' +
new Buffer(sourceMap.toString()).toString('base64'));
try {
delete require.cache[require.resolve('./.generated')];
require('./.generated').test();
} catch (e) {
compareLines(e.stack.split('\n'), expected);
}
fs.unlinkSync('.generated.js');
}
function compareStdout(done, sourceMap, source, expected) {
fs.writeFileSync('.original.js', 'this is the original code');
fs.writeFileSync('.generated.js.map', sourceMap);
fs.writeFileSync('.generated.js', source.join('\n') +
'//@ sourceMappingURL=.generated.js.map');
child_process.exec('node ./.generated', function(error, stdout, stderr) {
try {
compareLines((stdout + stderr).trim().split('\n'), expected);
} catch (e) {
return done(e);
}
fs.unlinkSync('.generated.js');
fs.unlinkSync('.generated.js.map');
fs.unlinkSync('.original.js');
done();
});
}
it('normal throw', function() {
compareStackTrace(createMultiLineSourceMap(), [
'throw new Error("test");'
], [
'Error: test',
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/
]);
});
it('throw inside function', function() {
compareStackTrace(createMultiLineSourceMap(), [
'function foo() {',
' throw new Error("test");',
'}',
'foo();'
], [
'Error: test',
/^ at foo \(.*\/line2\.js:1002:102\)$/,
/^ at Object\.exports\.test \(.*\/line4\.js:1004:104\)$/
]);
});
it('throw inside function inside function', function() {
compareStackTrace(createMultiLineSourceMap(), [
'function foo() {',
' function bar() {',
' throw new Error("test");',
' }',
' bar();',
'}',
'foo();'
], [
'Error: test',
/^ at bar \(.*\/line3\.js:1003:103\)$/,
/^ at foo \(.*\/line5\.js:1005:105\)$/,
/^ at Object\.exports\.test \(.*\/line7\.js:1007:107\)$/
]);
});
it('eval', function() {
compareStackTrace(createMultiLineSourceMap(), [
'eval("throw new Error(\'test\')");'
], [
'Error: test',
/^ at Object\.eval \(eval at <anonymous> \(.*\/line1\.js:1001:101\)/,
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/
]);
});
it('eval inside eval', function() {
compareStackTrace(createMultiLineSourceMap(), [
'eval("eval(\'throw new Error(\\"test\\")\')");'
], [
'Error: test',
/^ at Object\.eval \(eval at <anonymous> \(eval at <anonymous> \(.*\/line1\.js:1001:101\)/,
/^ at Object\.eval \(eval at <anonymous> \(.*\/line1\.js:1001:101\)/,
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/
]);
});
it('eval inside function', function() {
compareStackTrace(createMultiLineSourceMap(), [
'function foo() {',
' eval("throw new Error(\'test\')");',
'}',
'foo();'
], [
'Error: test',
/^ at eval \(eval at foo \(.*\/line2\.js:1002:102\)/,
/^ at foo \(.*\/line2\.js:1002:102\)/,
/^ at Object\.exports\.test \(.*\/line4\.js:1004:104\)$/
]);
});
it('eval with sourceURL', function() {
compareStackTrace(createMultiLineSourceMap(), [
'eval("throw new Error(\'test\')//@ sourceURL=sourceURL.js");'
], [
'Error: test',
' at Object.eval (sourceURL.js:1:7)',
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/
]);
});
it('eval with sourceURL inside eval', function() {
compareStackTrace(createMultiLineSourceMap(), [
'eval("eval(\'throw new Error(\\"test\\")//@ sourceURL=sourceURL.js\')");'
], [
'Error: test',
' at Object.eval (sourceURL.js:1:7)',
/^ at Object\.eval \(eval at <anonymous> \(.*\/line1\.js:1001:101\)/,
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/
]);
});
it('function constructor', function() {
compareStackTrace(createMultiLineSourceMap(), [
'throw new Function(")");'
], [
'SyntaxError: Unexpected token )',
/^ at Object\.Function \((?:unknown source|<anonymous>)\)$/,
/^ at Object\.exports\.test \(.*\/line1\.js:1001:101\)$/,
]);
});
it('throw with empty source map', function() {
compareStackTrace(createEmptySourceMap(), [
'throw new Error("test");'
], [
'Error: test',
/^ at Object\.exports\.test \(.*\/.generated.js:1:96\)$/
]);
});
it('throw with source map with gap', function() {
compareStackTrace(createSourceMapWithGap(), [
'throw new Error("test");'
], [
'Error: test',
/^ at Object\.exports\.test \(.*\/.generated.js:1:96\)$/
]);
});
it('sourcesContent with data URL', function() {
compareStackTrace(createMultiLineSourceMapWithSourcesContent(), [
'throw new Error("test");'
], [
'Error: test',
/^ at Object\.exports\.test \(.*\/original.js:1001:5\)$/
]);
});
it('default options', function(done) {
compareStdout(done, createSingleLineSourceMap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install();',
'process.nextTick(foo);',
'process.nextTick(function() { process.exit(1); });'
], [
/\/.original\.js:1$/,
'this is the original code',
'^',
'Error: this is the error',
/^ at foo \(.*\/.original\.js:1:1\)$/
]);
});
it('handleUncaughtExceptions is true', function(done) {
compareStdout(done, createSingleLineSourceMap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install({ handleUncaughtExceptions: true });',
'process.nextTick(foo);'
], [
/\/.original\.js:1$/,
'this is the original code',
'^',
'Error: this is the error',
/^ at foo \(.*\/.original\.js:1:1\)$/
]);
});
it('handleUncaughtExceptions is false', function(done) {
compareStdout(done, createSingleLineSourceMap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install({ handleUncaughtExceptions: false });',
'process.nextTick(foo);'
], [
/\/.generated.js:2$/,
'function foo() { throw new Error("this is the error"); }',
' ^',
'Error: this is the error',
/^ at foo \(.*\/.original\.js:1:1\)$/
]);
});
it('default options with empty source map', function(done) {
compareStdout(done, createEmptySourceMap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install();',
'process.nextTick(foo);'
], [
/\/.generated.js:2$/,
'function foo() { throw new Error("this is the error"); }',
' ^',
'Error: this is the error',
/^ at foo \(.*\/.generated.js:2:24\)$/
]);
});
it('default options with source map with gap', function(done) {
compareStdout(done, createSourceMapWithGap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install();',
'process.nextTick(foo);'
], [
/\/.generated.js:2$/,
'function foo() { throw new Error("this is the error"); }',
' ^',
'Error: this is the error',
/^ at foo \(.*\/.generated.js:2:24\)$/
]);
});
it('specifically requested error source', function(done) {
compareStdout(done, createSingleLineSourceMap(), [
'',
'function foo() { throw new Error("this is the error"); }',
'var sms = require("./source-map-support");',
'sms.install({ handleUncaughtExceptions: false });',
'process.on("uncaughtException", function (e) { console.log("SRC:" + sms.getErrorSource(e)); });',
'process.nextTick(foo);'
], [
'SRC:',
/\/.original.js:1$/,
'this is the original code',
'^'
]);
});
it('sourcesContent', function(done) {
compareStdout(done, createMultiLineSourceMapWithSourcesContent(), [
'',
'function foo() { throw new Error("this is the error"); }',
'require("./source-map-support").install();',
'process.nextTick(foo);',
'process.nextTick(function() { process.exit(1); });'
], [
/\/original\.js:1002$/,
' line 2',
' ^',
'Error: this is the error',
/^ at foo \(.*\/original\.js:1002:5\)$/
]);
});
it('missing source maps should also be cached', function(done) {
compareStdout(done, createSingleLineSourceMap(), [
'',
'var count = 0;',
'function foo() {',
' console.log(new Error("this is the error").stack.split("\\n").slice(0, 2).join("\\n"));',
'}',
'require("./source-map-support").install({',
' retrieveSourceMap: function(name) {',
' if (/\\.generated.js$/.test(name)) count++;',
' return null;',
' }',
'});',
'process.nextTick(foo);',
'process.nextTick(foo);',
'process.nextTick(function() { console.log(count); });',
], [
'Error: this is the error',
/^ at foo \(.*\/.generated.js:4:15\)$/,
'Error: this is the error',
/^ at foo \(.*\/.generated.js:4:15\)$/,
'1', // The retrieval should only be attempted once
]);
});