11/*!
2- * jsStack v1 .0.1
3- * A simple and easy jQuery plugin for highlighting JavaScript stack traces
4- * License : Apache 2
5- * Author : Stanescu Eduard-Dan ( https://elmah.io)
2+ * jsStack v2 .0.0
3+ * A simple and easy library for highlighting JavaScript stack traces
4+ * License: Apache 2
5+ * Author: https://elmah.io
66 */
7- ( function ( $ ) {
8- 'use strict' ;
9-
10- $ . fn . jsStack = function ( options ) {
117
12- var settings = $ . extend ( {
8+ ( function ( root , factory ) {
9+ if ( typeof define === 'function' && define . amd ) {
10+ // AMD
11+ define ( [ ] , factory ) ;
12+ } else if ( typeof module === 'object' && module . exports ) {
13+ // Node, CommonJS-like
14+ module . exports = factory ( ) ;
15+ } else {
16+ // Browser globals (root is window)
17+ root . jsStack = factory ( ) ;
18+ }
19+ } ( typeof self !== 'undefined' ? self : this , function ( ) {
20+ 'use strict' ;
1321
14- // Default values for classes
22+ function jsStack ( element , options ) {
23+ // Default settings
24+ var settings = Object . assign ( {
1525 method : 'st-methodName' ,
1626 file : 'st-fileName' ,
1727 line : 'st-lineNumber' ,
1828 column : 'st-column'
19-
2029 } , options ) ;
2130
22- return this . each ( function ( ) {
31+ var UNKNOWN_FUNCTION = '<unknown>' ;
32+ var chrome = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) ? \( ? ( (?: f i l e | h t t p | h t t p s ) : .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
33+ gecko = / ^ (?: \s * ( [ ^ @ ] * ) (?: \( ( .* ?) \) ) ? @ ) ? ( \S .* ?) : ( \d + ) (?: : ( \d + ) ) ? \s * $ / i,
34+ node = / ^ \s * a t (?: ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ? \( ? ( .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
35+ other = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) \( ? ( (?: ) .* ?) ? \) ? \s * $ / i;
2336
24- var UNKNOWN_FUNCTION = '<unknown>' ;
25- var chrome = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) ? \( ? ( (?: f i l e | h t t p | h t t p s ) : .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
26- gecko = / ^ (?: \s * ( [ ^ @ ] * ) (?: \( ( .* ?) \) ) ? @ ) ? ( \S .* ?) : ( \d + ) (?: : ( \d + ) ) ? \s * $ / i,
27- node = / ^ \s * a t (?: ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ? \( ? ( .* ?) : ( \d + ) (?: : ( \d + ) ) ? \) ? \s * $ / i,
28- other = / ^ \s * a t (?: (?: (?: A n o n y m o u s f u n c t i o n ) ? | ( (?: \[ o b j e c t o b j e c t \] ) ? \S + (?: \[ a s \S + \] ) ? ) ) ) \( ? ( (?: ) .* ?) ? \) ? \s * $ / i;
29- var stacktrace = escapeHtml ( $ ( this ) . text ( ) ) ,
30- lines = stacktrace . split ( '\n' ) ,
31- stack = '' ,
32- parts ,
33- element ;
37+ var stacktrace = escapeHtml ( element . textContent ) ,
38+ lines = stacktrace . split ( '\n' ) ,
39+ stack = '' ,
40+ parts ,
41+ elementObj ;
3442
35- function template_line ( line , element ) {
36- line = line . replace ( element . file , '<span class="' + settings . file + '">' + element . file + '</span>' )
37- . replace ( element . methodName + ' (' , '<span class="' + settings . method + '">' + element . methodName + '</span> (' )
38- . replace ( ':' + element . lineNumber + ':' + element . column , ':<span class="' + settings . line + '">' + element . lineNumber + '</span>:<span class="' + settings . column + '">' + element . column + '</span>' ) ;
39- line = line . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
43+ function template_line ( line , element ) {
44+ line = line . replace ( element . file , '<span class="' + settings . file + '">' + element . file + '</span>' )
45+ . replace ( element . methodName + ' (' , '<span class="' + settings . method + '">' + element . methodName + '</span> (' )
46+ . replace ( ':' + element . lineNumber + ':' + element . column , ':<span class="' + settings . line + '">' + element . lineNumber + '</span>:<span class="' + settings . column + '">' + element . column + '</span>' ) ;
47+ line = line . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
4048
41- return line ;
42- }
49+ return line ;
50+ }
4351
44- function escapeHtml ( unsafe ) {
45- return unsafe
46- . replace ( / & / g, "&" )
47- . replace ( / < / g, "<" )
48- . replace ( / > / g, ">" )
49- . replace ( / " / g, """ )
50- . replace ( / ' / g, "'" ) ;
51- }
52+ function escapeHtml ( unsafe ) {
53+ return unsafe
54+ . replace ( / & / g, "&" )
55+ . replace ( / < / g, "<" )
56+ . replace ( / > / g, ">" )
57+ . replace ( / " / g, """ )
58+ . replace ( / ' / g, "'" ) ;
59+ }
5260
53- for ( var i = 0 , j = lines . length ; i < j ; ++ i ) {
54- var line = '' ;
61+ for ( var i = 0 , j = lines . length ; i < j ; ++ i ) {
62+ var line = '' ;
5563
56- if ( ( parts = gecko . exec ( lines [ i ] ) ) ) {
57- element = {
58- 'file' : parts [ 3 ] ,
59- 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
60- 'lineNumber' : + parts [ 4 ] ,
61- 'column' : parts [ 5 ] ? + parts [ 5 ] : null
62- } ;
63- line = template_line ( lines [ i ] , element ) ;
64- } else if ( ( parts = chrome . exec ( lines [ i ] ) ) ) {
65- element = {
66- 'file' : parts [ 2 ] ,
67- 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
68- 'lineNumber' : + parts [ 3 ] ,
69- 'column' : parts [ 4 ] ? + parts [ 4 ] : null
70- } ;
71- line = template_line ( lines [ i ] , element ) ;
72- } else if ( ( parts = node . exec ( lines [ i ] ) ) ) {
73- element = {
74- 'file' : parts [ 2 ] ,
75- 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
76- 'lineNumber' : + parts [ 3 ] ,
77- 'column' : parts [ 4 ] ? + parts [ 4 ] : null
78- } ;
79- line = template_line ( lines [ i ] , element ) ;
80- } else if ( ( parts = other . exec ( lines [ i ] ) ) ) {
81- element = {
82- 'file' : parts [ 2 ] ,
83- 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION
84- } ;
85- line = template_line ( lines [ i ] , element ) ;
86- } else {
87- line = lines [ i ] . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
88- }
64+ if ( ( parts = gecko . exec ( lines [ i ] ) ) ) {
65+ elementObj = {
66+ 'file' : parts [ 3 ] ,
67+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
68+ 'lineNumber' : + parts [ 4 ] ,
69+ 'column' : parts [ 5 ] ? + parts [ 5 ] : null
70+ } ;
71+ line = template_line ( lines [ i ] , elementObj ) ;
72+ } else if ( ( parts = chrome . exec ( lines [ i ] ) ) ) {
73+ elementObj = {
74+ 'file' : parts [ 2 ] ,
75+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
76+ 'lineNumber' : + parts [ 3 ] ,
77+ 'column' : parts [ 4 ] ? + parts [ 4 ] : null
78+ } ;
79+ line = template_line ( lines [ i ] , elementObj ) ;
80+ } else if ( ( parts = node . exec ( lines [ i ] ) ) ) {
81+ elementObj = {
82+ 'file' : parts [ 2 ] ,
83+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION ,
84+ 'lineNumber' : + parts [ 3 ] ,
85+ 'column' : parts [ 4 ] ? + parts [ 4 ] : null
86+ } ;
87+ line = template_line ( lines [ i ] , elementObj ) ;
88+ } else if ( ( parts = other . exec ( lines [ i ] ) ) ) {
89+ elementObj = {
90+ 'file' : parts [ 2 ] ,
91+ 'methodName' : parts [ 1 ] || UNKNOWN_FUNCTION
92+ } ;
93+ line = template_line ( lines [ i ] , elementObj ) ;
94+ } else {
95+ line = lines [ i ] . replace ( / & l t ; / g, '<span><</span>' ) . replace ( / & g t ; / g, '<span>></span>' ) ;
96+ }
8997
90- if ( lines . length - 1 == i ) {
91- stack += line ;
92- } else {
93- stack += line + '\n' ;
94- }
98+ if ( lines . length - 1 == i ) {
99+ stack += line ;
100+ } else {
101+ stack += line + '\n' ;
95102 }
103+ }
104+
105+ element . innerHTML = stack ;
106+ }
96107
97- return $ ( this ) . html ( stack ) ;
108+ // Function to initialize the plugin on elements
109+ function initJsStack ( elements , options ) {
110+ elements . forEach ( function ( element ) {
111+ jsStack ( element , options ) ;
98112 } ) ;
99- } ;
113+ }
114+
115+ // Expose the plugin globally
116+ function jsStackLibrary ( selector , options ) {
117+ var elements = document . querySelectorAll ( selector ) ;
118+ initJsStack ( Array . from ( elements ) , options ) ;
119+ }
120+
121+ return jsStackLibrary ;
100122
101- } ( jQuery ) ) ;
123+ } ) ) ;
0 commit comments