Files
meteor/tools/source-map-retriever-stack.js
2015-07-09 10:49:57 -07:00

74 lines
2.2 KiB
JavaScript

import sourceMapSupport from 'source-map-support';
// Why this file exists:
// We have two places in the tool where we need to do source maps:
// 1. Loaded isopacks, which use a special custom source map cache
// 2. Transpiled tool code from Babel
//
// In order to avoid crazy bootstrapping, it would be nice to be able to add
// functions to look for source maps, so that we can call
// sourceMapSupport.install as early as possible, and not worry about having
// the right data structures around.
//
// This module maintains a stack of source map retrieval functions, which are
// called in reverse order until one returns a truthy value.
const stack = [];
// Add a function to locate source maps; all of the functions are executed in
// reverse order
export function push(func) {
stack.push(func);
}
function tryAllSourceMapRetrievers(filename) {
for (let i = stack.length - 1; i >= 0; i--) {
const sourceMapData = stack[i](filename);
if (sourceMapData) {
return sourceMapData;
}
}
return null;
}
function wrapCallSite(unwrappedFrame) {
const frame = sourceMapSupport.wrapCallSite(unwrappedFrame);
function wrapGetter(name) {
const origGetter = frame[name];
frame[name] = function(arg) {
// replace a custom location domain that we set for better UX in Chrome
// DevTools (separate domain group) in source maps.
const source = origGetter(arg);
if (!source) {
return source;
}
return source.replace(/(^|\()meteor:\/\/..app\//, '$1');
};
}
wrapGetter('getScriptNameOrSourceURL');
wrapGetter('getEvalOrigin');
return frame;
}
sourceMapSupport.install({
retrieveSourceMap: tryAllSourceMapRetrievers,
// For now, don't fix the source line in uncaught exceptions, because we
// haven't fixed handleUncaughtExceptions in source-map-support to properly
// locate the source files.
handleUncaughtExceptions: false,
wrapCallSite
});
// Default retrievers
// Always fall back to the default in the end
push(sourceMapSupport.retrieveSourceMap);
/* eslint-disable max-len */
push(require('meteor-babel/register').retrieveSourceMap); // #RemoveInProd this line is removed in isopack.js
/* eslint-enable max-len */