mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	This takes stacktrace lines that used to look like this: n@https://chat.zulip.org/static/webpack-bundles/app.2385793af60f0b082ee9.js:1:12680 = webpack:///./static/js/blueslip.js line 241 column 1 dispatch@https://chat.zulip.org/static/webpack-bundles/app.2385793af60f0b082ee9.js:52:37878 = webpack:////srv/zulip-npm-cache/8ea4cd291dd23441aec0f298b77b6ddc0d0a7a56/node_modules/jquery/dist/jquery.js line 5182 column 1 to have the even-numbered lines look like this: = ./static/js/blueslip.js line 241 column 1 dispatch@https://chat.zulip.org/static/webpack-bundles/app.2385793af60f0b082ee9.js:52:37878 = /srv/zulip-npm-cache/8ea4cd291dd23441aec0f298b77b6ddc0d0a7a56/node_modules/jquery/dist/jquery.js line 5182 column 1
		
			
				
	
	
		
			55 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
import re
 | 
						|
import os
 | 
						|
import sourcemap
 | 
						|
 | 
						|
from typing import Dict, List
 | 
						|
 | 
						|
 | 
						|
class SourceMap:
 | 
						|
    '''Map (line, column) pairs from generated to source file.'''
 | 
						|
 | 
						|
    def __init__(self, sourcemap_dirs: List[str]) -> None:
 | 
						|
        self._dirs = sourcemap_dirs
 | 
						|
        self._indices = {}  # type: Dict[str, sourcemap.SourceMapDecoder]
 | 
						|
 | 
						|
    def _index_for(self, minified_src: str) -> sourcemap.SourceMapDecoder:
 | 
						|
        '''Return the source map index for minified_src, loading it if not
 | 
						|
           already loaded.'''
 | 
						|
        if minified_src not in self._indices:
 | 
						|
            for source_dir in self._dirs:
 | 
						|
                filename = os.path.join(source_dir, minified_src + '.map')
 | 
						|
                if os.path.isfile(filename):
 | 
						|
                    with open(filename) as fp:
 | 
						|
                        self._indices[minified_src] = sourcemap.load(fp)
 | 
						|
                        break
 | 
						|
 | 
						|
        return self._indices[minified_src]
 | 
						|
 | 
						|
    def annotate_stacktrace(self, stacktrace: str) -> str:
 | 
						|
        out = ''  # type: str
 | 
						|
        for ln in stacktrace.splitlines():
 | 
						|
            out += ln + '\n'
 | 
						|
            match = re.search(r'/static/(?:webpack-bundles|min)/(.+)(\.[\.0-9a-f]+\.js):(\d+):(\d+)', ln)
 | 
						|
            if match:
 | 
						|
                # Get the appropriate source map for the minified file.
 | 
						|
                minified_src = match.groups()[0] + match.groups()[1]
 | 
						|
                index = self._index_for(minified_src)
 | 
						|
 | 
						|
                gen_line, gen_col = list(map(int, match.groups()[2:4]))
 | 
						|
                # The sourcemap lib is 0-based, so subtract 1 from line and col.
 | 
						|
                try:
 | 
						|
                    result = index.lookup(line=gen_line-1, column=gen_col-1)
 | 
						|
                    display_src = result.src
 | 
						|
                    webpack_prefix = "webpack:///"
 | 
						|
                    if display_src.startswith(webpack_prefix):
 | 
						|
                        display_src = display_src[len(webpack_prefix):]
 | 
						|
                    out += ('       = %s line %d column %d\n' %
 | 
						|
                            (display_src, result.src_line+1, result.src_col+1))
 | 
						|
                except IndexError:
 | 
						|
                    out += '       [Unable to look up in source map]\n'
 | 
						|
 | 
						|
            if ln.startswith('    at'):
 | 
						|
                out += '\n'
 | 
						|
        return out
 |