Created
January 27, 2017 12:38
-
-
Save AlexKalinin/5d61d6294492b84e8ba9fb3e41c008f4 to your computer and use it in GitHub Desktop.
This script helps to decode stacktrace places of concatenated and compiled JS file Raw
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CompiledJsBacktracer | |
def initialize(trace_arr, path, original_filename, ancor = '/*UNIQ_ANCOR_D6791*/', context_lines = 200) | |
@trace = trace_arr | |
@path = path | |
@original_fname = original_filename | |
@ancor = ancor | |
@context_lines = context_lines | |
end | |
def process | |
raise 'Please install first js-beautify: `npm install -g js-beautify`' unless js_beautify_installed? | |
brakepoints.each_with_index do |br, idx| | |
line, pos = br | |
new_file_name = "compiled_#{'%03d' % idx}__#{line}_#{pos}.js" | |
new_file_path = File.join @path, new_file_name | |
puts "Processing #{new_file_path}" | |
FileUtils.cp File.join(@path, @original_fname), new_file_path | |
insert_ancor_to_file(new_file_path, line, pos) | |
beautified_name = 'de' + new_file_name | |
beautified_path = File.join(@path, beautified_name) | |
beautify new_file_path, beautified_path | |
parted_name = 'part_of_' + beautified_name | |
parted_path = File.join(@path, parted_name) | |
extract_part beautified_path, parted_path | |
end | |
puts "Ancor was: #{@ancor}" | |
end | |
private | |
# array with arrays: | |
# first - linenumber | |
# second - position in string | |
def brakepoints | |
@trace.map{|e| e.sub(/^.*js:/, '').split(':')} | |
end | |
def beautify(input, output) | |
`js-beautify -f #{input} -o #{output}` | |
end | |
def js_beautify_installed? | |
`which js-beautify`.present? | |
end | |
def insert_ancor_to_file(file_path, line, position) | |
Tempfile.open(".#{File.basename(file_path)}", File.dirname(file_path)) do |tempfile| | |
File.open(file_path).each_with_index do |line_text, line_idx| | |
if line_idx == (line.to_i - 1) | |
tempfile.puts line_text.insert(position.to_i - 1, @ancor) | |
else | |
tempfile.puts line_text | |
end | |
end | |
tempfile.fdatasync | |
tempfile.close | |
FileUtils.mv tempfile.path, file_path | |
end | |
end | |
def extract_part(input, output) | |
ancor_position = get_line_number(input) | |
File.open(input, 'r') do |input_file| | |
File.open(output, 'w') do |output_file| | |
file_num = 0 | |
input_file.each_line do |line| | |
file_num += 1 | |
output_file.puts line if file_num > ancor_position - @context_lines / 2 | |
break if file_num > ancor_position + @context_lines / 2 | |
end | |
output_file.fdatasync | |
output_file.close | |
end | |
end | |
end | |
def get_line_number(file) | |
count = 0 | |
file = File.open(file, "r") do |file| | |
file.each_line do |line| | |
count += 1 | |
return count if line.include? @ancor | |
end | |
end | |
end | |
end | |
arr = [ | |
"e@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:2210", | |
"a@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:3398", | |
"l@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:3449", | |
"l<.instantiateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29035", | |
"y.Mixin._reconcilerInstantiateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16103", | |
"y.Mixin.mountChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16264", | |
"g.Mixin._createContentMarkup@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2357", | |
"g.Mixin.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:1310", | |
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484", | |
"y.Mixin.mountChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16418", | |
"g.Mixin._createContentMarkup@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2357", | |
"g.Mixin.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:1310", | |
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484", | |
"y.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:6523", | |
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484", | |
"y.Mixin._mountChildByNameAtIndex@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17984", | |
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17365", | |
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964", | |
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190", | |
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413", | |
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833", | |
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827", | |
"y._updateRenderedComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9605", | |
"y._performComponentUpdate@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9361", | |
"y.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8635", | |
"y.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:7918", | |
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827", | |
"l<.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29208", | |
"y.Mixin._reconcilerUpdateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16199", | |
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17091", | |
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964", | |
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190", | |
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413", | |
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833", | |
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827", | |
"l<.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29208", | |
"y.Mixin._reconcilerUpdateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16199", | |
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17091", | |
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964", | |
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190", | |
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413", | |
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833", | |
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827", | |
"y._updateRenderedComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9605", | |
"y._performComponentUpdate@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9361", | |
"y.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8635", | |
"y.performUpdateIfNecessary@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8162", | |
"r.performUpdateIfNecessary@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15983", | |
"a@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:11056", | |
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29018", | |
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29018", | |
".perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:12038", | |
"k@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:12221", | |
"o.closeAll@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29653", | |
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29098", | |
"d.batchedUpdates@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:28510", | |
"l@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:11256", | |
"i@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:31274", | |
"u<.enqueueSetState@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:32139", | |
"i.prototype.setState@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:24831", | |
"CustomizableTable</<.value/this._itemsRequest<.success@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:571:29006", | |
"ft.Callbacks/c@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:25:23627", | |
"ft.Callbacks/u.fireWith@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:25:24421", | |
"i@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:26:28170", | |
".send/n/<@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:27:311" | |
] | |
path = '/Users/alexkalinin/prj/company.com/report-gist2/20170126_airbrake/' | |
orig_file_name = 'application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js' | |
CompiledJsBacktracer.new(arr, path, orig_file_name).process |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment