1
1
import loopProtect from 'loop-protect' ;
2
2
import { Hook , Decode , Encode } from 'console-feed' ;
3
+ import StackTrace from 'stacktrace-js' ;
3
4
import evaluateExpression from './evaluateExpression' ;
4
5
5
6
// should postMessage user the dispatcher? does the parent window need to
@@ -14,6 +15,10 @@ const htmlOffset = 12;
14
15
// const editorOrigin = 'http://localhost:8000';
15
16
// so this works??
16
17
// maybe i have to pass the parent window??? idk man
18
+ // console.log(window.location);
19
+ window . objectUrls [ window . location . href ] = '/index.html' ;
20
+ const blobPath = window . location . href . split ( '/' ) . pop ( ) ;
21
+ window . objectPaths [ blobPath ] = 'index.html' ;
17
22
18
23
window . loopProtect = loopProtect ;
19
24
@@ -83,8 +88,7 @@ window.onerror = function onError(msg, source, lineNumber, columnNo, error) {
83
88
data = error . stack . replaceAll ( url , window . objectUrls [ url ] ) ;
84
89
}
85
90
} ) ;
86
- if ( data . match ( 'about:srcdoc' ) ) {
87
- data = data . replaceAll ( 'about:srcdoc' , 'index.html' ) ;
91
+ if ( data . match ( 'index.html' ) ) {
88
92
data = data . replace ( `:${ lineNumber } :` , `:${ lineNumber - htmlOffset } :` ) ;
89
93
}
90
94
editor . postMessage (
@@ -109,31 +113,38 @@ window.onerror = function onError(msg, source, lineNumber, columnNo, error) {
109
113
// catch rejected promises
110
114
window . onunhandledrejection = function onUnhandledRejection ( event ) {
111
115
if ( event . reason && event . reason . message && event . reason . stack ) {
112
- const urls = Object . keys ( window . objectUrls ) ;
113
- let data = event . reason . stack ;
114
- urls . forEach ( ( url ) => {
115
- if ( event . reason . stack . match ( url ) ) {
116
- data = event . reason . stack . replaceAll ( url , window . objectUrls [ url ] ) ;
117
- }
116
+ StackTrace . fromError ( event . reason ) . then ( ( stackLines ) => {
117
+ let data = `${ event . reason . name } : ${ event . reason . message } ` ;
118
+ stackLines . forEach ( ( stackLine ) => {
119
+ const { fileName, functionName, lineNumber, columnNumber } = stackLine ;
120
+ const resolvedFileName = window . objectUrls [ fileName ] || fileName ;
121
+ const resolvedFuncName = functionName || '(anonymous function)' ;
122
+ let line ;
123
+ if ( lineNumber && columnNumber ) {
124
+ line = `\n at ${ resolvedFuncName } (${ resolvedFileName } :${ lineNumber } :${ columnNumber } )` ;
125
+ } else {
126
+ line = `\n at ${ resolvedFuncName } (${ resolvedFileName } )` ;
127
+ }
128
+ data = data . concat ( line ) ;
129
+ } ) ;
130
+ editor . postMessage (
131
+ {
132
+ source : 'sketch' ,
133
+ messages : [
134
+ {
135
+ log : [
136
+ {
137
+ method : 'error' ,
138
+ data : [ data ] ,
139
+ id : Date . now ( ) . toString ( )
140
+ }
141
+ ]
142
+ }
143
+ ]
144
+ } ,
145
+ editorOrigin
146
+ ) ;
118
147
} ) ;
119
- data = data . replaceAll ( 'about:srcdoc' , 'index.html' ) ;
120
- editor . postMessage (
121
- {
122
- source : 'sketch' ,
123
- messages : [
124
- {
125
- log : [
126
- {
127
- method : 'error' ,
128
- data : [ data ] ,
129
- id : Date . now ( ) . toString ( )
130
- }
131
- ]
132
- }
133
- ]
134
- } ,
135
- editorOrigin
136
- ) ;
137
148
}
138
149
} ;
139
150
0 commit comments