如何使用源映射隐藏来自已转换代码的函数调用?

时间:2013-09-29 02:11:33

标签: javascript source-maps

假设我的语言类似于

print "Hello World"

转化为

var $__Helpers = {
    print: function(s) {
        if (typeof s != 'string')
            throw new TypeError('String expected');
        console.log(s);
    }
};

$__Helpers.print("Hello World");

如果该语言的用户

print 5

$__Helpers.print抛出一个TypeError,说“String expected”。我希望开发人员工具将print 5行显示为此错误的原始调用。我知道如何让我的源地图显示一个看起来像

的调用堆栈
transpiled_script.js:2
original_script.os:1

其中transpiled_script.js:2是调用$__Helpers.print函数的脚本和行号,original_script.os:1是调用print 5的脚本和行号。我想让dev工具忽略对transpiled_script.js的顶级调用(这只是我的转换程序的一个实现细节)并且只显示来自原始脚本的调用(这是他们应该自己调试的部分)脚本)。

我显然无法简单地将transpiled_script.js:2映射到original_script.os:1,因为print内可能会多次调用original_script.os,因此它不是1对1关系。< / p>

有没有办法做到这一点?

(我使用escodegen生成我的源码和我的源码图(escodegen使用Node mozilla / source-map模块),所以有办法告诉escodegen或mozilla / source-map这样做是理想的,但是如果不可能,我可以覆盖escodegen的输出。)

1 个答案:

答案 0 :(得分:3)

您可以分割曲线并打印所需的曲线

var $__Helpers = {
    print: function(s) {
        if (typeof s != 'string'){
            var err = new TypeError('String expected');
            var trace = err.stack.split('\n')
            console.error(trace[0]); // TypeError: string expected
            console.error(trace[2]); // the line who called the function, probably 
            //original_script.os:1, or whatever line number the call was from
            //quit the script

        }
        console.log(s);
    } };
编辑:一个更好的解决方案,就是替换错误的痕迹,而不是抛出它,代码现在看起来像这样:

var $__Helpers = {
    print: function(s) {
        if (typeof s != 'string'){
            var err = new TypeError('String expected: Got'+s);
            err.stack = err.stack.replace(/\n.*transpiled_script\.js.*?\n/g,"\n");
            throw err;

        }
        console.log(s);
    } };

这也适用于嵌套调用中的错误。