1
1
/*!
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
6
6
*/
7
- ( function ( $ ) {
8
- 'use strict' ;
9
-
10
- $ . fn . jsStack = function ( options ) {
11
7
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' ;
13
21
14
- // Default values for classes
22
+ function jsStack ( element , options ) {
23
+ // Default settings
24
+ var settings = Object . assign ( {
15
25
method : 'st-methodName' ,
16
26
file : 'st-fileName' ,
17
27
line : 'st-lineNumber' ,
18
28
column : 'st-column'
19
-
20
29
} , options ) ;
21
30
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;
23
36
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 ;
34
42
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>' ) ;
40
48
41
- return line ;
42
- }
49
+ return line ;
50
+ }
43
51
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
+ }
52
60
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 = '' ;
55
63
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
+ }
89
97
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' ;
95
102
}
103
+ }
104
+
105
+ element . innerHTML = stack ;
106
+ }
96
107
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 ) ;
98
112
} ) ;
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 ;
100
122
101
- } ( jQuery ) ) ;
123
+ } ) ) ;
0 commit comments