nodexh 2.0.0-pre → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/bin/nodexh +27 -1
- package/lib/main.js +50 -18
- package/lib/main.js.map +2 -2
- package/package.json +6 -6
- package/pnpm-lock.yaml +105 -0
- package/src/main.coffee +42 -10
package/README.md
CHANGED
|
@@ -56,4 +56,9 @@ Use `nodexh path/to/file.js` instead of `node path/to/file.js`, and you're good
|
|
|
56
56
|
* [ ] fix async stacktraces (probably not yet handled correctly; might be issue with `stackman`?)
|
|
57
57
|
* [ ] consider [utf8ize-sourcemaps](https://github.com/twada/utf8ize-sourcemaps) in case there should be
|
|
58
58
|
problems w/ 32bit characters
|
|
59
|
+
* [ ] truncate long lines in context
|
|
60
|
+
* [ ] offer capabilities of NodeXH as API so applications (such as test libraries) can easily retrieve
|
|
61
|
+
source code, display source lines with contexts
|
|
62
|
+
|
|
63
|
+
|
|
59
64
|
|
package/bin/nodexh
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
realpath() {
|
|
4
|
+
# thx to https://github.com/whatwg/html-build/issues/90
|
|
5
|
+
OURPWD=$PWD
|
|
6
|
+
cd "$(dirname "$1")"
|
|
7
|
+
LINK=$(readlink "$(basename "$1")")
|
|
8
|
+
while [ "$LINK" ]; do
|
|
9
|
+
cd "$(dirname "$LINK")"
|
|
10
|
+
LINK=$(readlink "$(basename "$1")")
|
|
11
|
+
done
|
|
12
|
+
REALPATH="$PWD/$(basename "$1")"
|
|
13
|
+
cd "$OURPWD"
|
|
14
|
+
echo "$REALPATH"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
node \
|
|
18
|
+
--require "$(realpath "$0")"/../../lib/main.js \
|
|
19
|
+
--trace-warnings \
|
|
20
|
+
--enable-source-maps \
|
|
21
|
+
--stack-trace-limit=100 \
|
|
22
|
+
--expose-gc \
|
|
23
|
+
"$@"
|
|
24
|
+
# --nouse_idle_notification \
|
|
25
|
+
# --trace_gc \
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
3
29
|
|
package/lib/main.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function() {
|
|
2
2
|
'use strict';
|
|
3
|
-
var CND, FS, PATH,
|
|
3
|
+
var CND, FS, PATH, _get_context, alert, badge, bold, cyan, debug, echo, exit_handler, fetch_mapped_location, get_context, get_error_callsites, get_stacktracey, gold, green, grey, help, info, load_source_map, log, red, reverse, rpr, show_error_with_source_context, show_stacktracey, steel, underline, urge, warn, whisper, white, write_to_stderr, yellow;
|
|
4
4
|
|
|
5
5
|
//###########################################################################################################
|
|
6
6
|
CND = require('cnd');
|
|
@@ -57,7 +57,8 @@
|
|
|
57
57
|
});
|
|
58
58
|
} catch (error1) {
|
|
59
59
|
error = error1;
|
|
60
|
-
warn
|
|
60
|
+
// warn '^7763-3^', "!!!!!!!!!!!!!!!!!", { path, }
|
|
61
|
+
// warn '^7763-3^', "!!!!!!!!!!!!!!!!!", error.message
|
|
61
62
|
return {path, linenr, colnr};
|
|
62
63
|
}
|
|
63
64
|
//.........................................................................................................
|
|
@@ -129,7 +130,8 @@
|
|
|
129
130
|
|
|
130
131
|
//-----------------------------------------------------------------------------------------------------------
|
|
131
132
|
show_error_with_source_context = async function(error, headline) {
|
|
132
|
-
|
|
133
|
+
/* TAINT use proper methods to format with multiple colors */
|
|
134
|
+
var arrowhead, arrowshaft, callsite, callsites, colnr, context_line, fname, fname_txt, i, j, len, len1, linenr, path, ref, ref1, ref2, relpath, width, width1;
|
|
133
135
|
/* From https://github.com/watson/stackman#gotchas: "This module works because V8 (the JavaScript engine
|
|
134
136
|
behind Node.js) allows us to hook into the stack trace generator function before that stack trace is
|
|
135
137
|
generated. It's triggered by accessing the .stack property on the Error object, so please don't do
|
|
@@ -141,7 +143,7 @@
|
|
|
141
143
|
callsites = get_error_callsites(error);
|
|
142
144
|
//.........................................................................................................
|
|
143
145
|
if ((callsites == null) || (callsites.length === 0)) {
|
|
144
|
-
write_to_stderr(CND.red(CND.reverse("error has no associated callsites:")));
|
|
146
|
+
write_to_stderr(CND.red(CND.reverse("^455756^ error has no associated callsites:")));
|
|
145
147
|
write_to_stderr(CND.red(CND.reverse(rpr(error))));
|
|
146
148
|
return null;
|
|
147
149
|
}
|
|
@@ -160,24 +162,39 @@
|
|
|
160
162
|
linenr = callsite.getLineNumber();
|
|
161
163
|
colnr = callsite.getColumnNumber();
|
|
162
164
|
//.......................................................................................................
|
|
163
|
-
if (path.startsWith('internal/')) {
|
|
165
|
+
if ((path.startsWith('node:internal/')) || (path.startsWith('internal/'))) {
|
|
164
166
|
write_to_stderr(arrowhead, grey(`${path} @ ${linenr},${colnr}`));
|
|
165
167
|
continue;
|
|
166
168
|
}
|
|
167
169
|
//.......................................................................................................
|
|
168
170
|
// write_to_stderr()
|
|
169
171
|
// write_to_stderr steel bold reverse ( "#{relpath} ##{linenr}:" ).padEnd 108
|
|
172
|
+
fname = (ref = (ref1 = callsite.getFunctionName()) != null ? ref1 : callsite.getMethodName()) != null ? ref : null;
|
|
170
173
|
({path, linenr, colnr} = (await fetch_mapped_location(path, linenr, colnr)));
|
|
171
174
|
relpath = PATH.relative(process.cwd(), path);
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
175
|
+
if (fname != null) {
|
|
176
|
+
fname_txt = steel(fname);
|
|
177
|
+
width1 = width + (fname_txt.length - fname.length);
|
|
178
|
+
write_to_stderr(arrowhead, gold(`${relpath} @ ${linenr},${colnr}: ${fname_txt}() \x1b[38;05;234m`.padEnd(width1, '—')));
|
|
179
|
+
} else {
|
|
180
|
+
write_to_stderr(arrowhead, gold(`${relpath} @ ${linenr},${colnr}: \x1b[38;05;234m`.padEnd(width, '—')));
|
|
181
|
+
}
|
|
182
|
+
ref2 = (await get_context(path, linenr, colnr, width));
|
|
183
|
+
for (j = 0, len1 = ref2.length; j < len1; j++) {
|
|
184
|
+
context_line = ref2[j];
|
|
176
185
|
write_to_stderr(arrowshaft, context_line);
|
|
177
186
|
}
|
|
178
187
|
}
|
|
179
188
|
alert('^77765-2^', reverse(bold(headline)));
|
|
180
|
-
//
|
|
189
|
+
// urge "^94843^ error.stack:", rpr error.stack
|
|
190
|
+
// urge "^94843^ error.message:", rpr error.message
|
|
191
|
+
// urge "^94843^ error.code:", rpr error.code
|
|
192
|
+
// urge "^94843^ error.name:", rpr error.name
|
|
193
|
+
// urge "^94843^ error.type:", rpr error.type
|
|
194
|
+
// urge "^94843^ error.toString():", rpr error.toString()
|
|
195
|
+
// urge "^94843^ error:", rpr error
|
|
196
|
+
// CATALOGUING = require '../../multimix/lib/cataloguing'
|
|
197
|
+
// urge "^94843^", ( CATALOGUING.all_keys_of error )
|
|
181
198
|
return null;
|
|
182
199
|
};
|
|
183
200
|
|
|
@@ -185,7 +202,10 @@
|
|
|
185
202
|
exit_handler = async function(error, origin) {
|
|
186
203
|
var message, ref, ref1, ref2, type;
|
|
187
204
|
/* TAINT origin never used */
|
|
188
|
-
show_stacktracey
|
|
205
|
+
// show_stacktracey error
|
|
206
|
+
// debug '^4488^', error
|
|
207
|
+
// debug '^4488^', await origin
|
|
208
|
+
// return null
|
|
189
209
|
type = (ref = (ref1 = error.code) != null ? ref1 : error.name) != null ? ref : 'EXCEPTION';
|
|
190
210
|
message = ` ${type}: ` + ((ref2 = error != null ? error.message : void 0) != null ? ref2 : "an unrecoverable condition occurred");
|
|
191
211
|
await show_error_with_source_context(error, message);
|
|
@@ -198,10 +218,9 @@
|
|
|
198
218
|
//###########################################################################################################
|
|
199
219
|
//###########################################################################################################
|
|
200
220
|
//###########################################################################################################
|
|
201
|
-
StackTracey = require('stacktracey');
|
|
202
|
-
|
|
203
221
|
get_stacktracey = function(error) {
|
|
204
|
-
var R, d, i, idx, ref, s, stack;
|
|
222
|
+
var R, StackTracey, d, i, idx, ref, s, stack;
|
|
223
|
+
StackTracey = require('stacktracey');
|
|
205
224
|
stack = (new StackTracey(error)).withSources();
|
|
206
225
|
// stack = stack.clean()
|
|
207
226
|
R = [];
|
|
@@ -232,16 +251,16 @@
|
|
|
232
251
|
ref = get_stacktracey(error);
|
|
233
252
|
for (i = 0, len = ref.length; i < len; i++) {
|
|
234
253
|
d = ref[i];
|
|
235
|
-
echo(CND.steel(`${d.relpath} @ ${d.line}:${d.column}`));
|
|
254
|
+
echo(CND.steel('^44872^ ' + `${d.relpath} @ ${d.line}:${d.column}`));
|
|
236
255
|
/* NOTE errors:
|
|
237
256
|
ENOENT: no such file or directory
|
|
238
257
|
EISDIR: illegal operation on a directory, read
|
|
239
258
|
'Cannot read property 'originalPositionFor' of undefined'
|
|
240
259
|
*/
|
|
241
260
|
if (d.error != null) {
|
|
242
|
-
echo(CND.red((ref1 = d.error.message) != null ? ref1 : "an error occurred"));
|
|
261
|
+
echo(CND.red('^44873^ ' + ((ref1 = d.error.message) != null ? ref1 : "an error occurred")));
|
|
243
262
|
} else {
|
|
244
|
-
echo(CND.yellow(`${rpr(d.source.slice(0, 101))}`));
|
|
263
|
+
echo(CND.yellow('^44874^ ' + `${rpr(d.source.slice(0, 101))}`));
|
|
245
264
|
}
|
|
246
265
|
}
|
|
247
266
|
return null;
|
|
@@ -253,12 +272,25 @@
|
|
|
253
272
|
|
|
254
273
|
//###########################################################################################################
|
|
255
274
|
if (global[Symbol.for('cnd-exception-handler')] == null) {
|
|
275
|
+
null;
|
|
256
276
|
global[Symbol.for('cnd-exception-handler')] = true;
|
|
257
277
|
process.once('uncaughtException', exit_handler);
|
|
258
278
|
process.once('unhandledRejection', exit_handler);
|
|
259
279
|
}
|
|
260
280
|
|
|
261
|
-
|
|
281
|
+
// do =>
|
|
282
|
+
// process.stderr.on 'data', ( data ) => debug "^6863-1^ (stderr.on 'data'):", rpr data
|
|
283
|
+
// process.stdout.on 'data', ( data ) => debug "^6863-2^ (stdout.on 'data'):", rpr data
|
|
284
|
+
// process.stderr.on 'end', => debug "^6863-1^ (stderr.on 'end')"
|
|
285
|
+
// process.stdout.on 'end', => debug "^6863-2^ (stdout.on 'end')"
|
|
286
|
+
// debug '^6456^'
|
|
287
|
+
// echo "^4564^ echo to stdout"
|
|
288
|
+
// warn "^4564^ warn to stderr"
|
|
289
|
+
// process.stderr.write "this goes to stderr\n"
|
|
290
|
+
// process.stdout.write "this goes to stdout\n"
|
|
291
|
+
// process.on 'message', ( message ) -> debug "^6863-3^' (process.on 'message'):", rpr message
|
|
292
|
+
// process.on 'warning', ( warning ) -> debug "^6863-3^' (process.on 'warning'):", rpr warning
|
|
293
|
+
/*
|
|
262
294
|
callsite.getThis() - returns the value of this
|
|
263
295
|
callsite.getTypeName() - returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property.
|
|
264
296
|
callsite.getFunction() - returns the current function
|
package/lib/main.js.map
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
"../src/main.coffee"
|
|
7
7
|
],
|
|
8
8
|
"names": [],
|
|
9
|
-
"mappings": "AAEA;EAAA;AAAA,MAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,
|
|
9
|
+
"mappings": "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",
|
|
10
10
|
"sourcesContent": [
|
|
11
|
-
"\n\n'use strict'\n\n\n############################################################################################################\nCND = require 'cnd'\nrpr = CND.rpr\nbadge = 'nodexh'\nlog = CND.get_logger 'plain', badge\ndebug = CND.get_logger 'debug', badge\ninfo = CND.get_logger 'info', badge\nwarn = CND.get_logger 'warn', badge\nalert = CND.get_logger 'alert', badge\nhelp = CND.get_logger 'help', badge\nurge = CND.get_logger 'urge', badge\nwhisper = CND.get_logger 'whisper', badge\necho = CND.echo.bind CND\n# stackman = ( require 'stackman' )()\nget_error_callsites = require 'error-callsites'\nload_source_map = ( require 'util' ).promisify ( require 'load-source-map' )\nFS = require 'fs'\nPATH = require 'path'\n{ red\n green\n steel\n grey\n cyan\n bold\n gold\n white\n yellow\n reverse\n underline\n bold } = CND\n# types = new ( require '../../intertype' ).Intertype()\n# { isa } = types.export()\n\n#-----------------------------------------------------------------------------------------------------------\nwrite_to_stderr = ( P... ) -> process.stderr.write ' ' + CND.pen P...\n\n#-----------------------------------------------------------------------------------------------------------\nfetch_mapped_location = ( path, linenr, colnr ) ->\n try\n sourcemap = await load_source_map path\n smp = sourcemap.originalPositionFor { line: linenr, column: colnr, }\n catch error\n warn '^7763-3^', \"!!!!!!!!!!!!!!!!!\", error.message\n return { path, linenr, colnr, }\n #.........................................................................................................\n if ( smp? ) and ( smp.source? ) and ( smp.source isnt '' ) and ( smp.line? ) and ( smp.column? )\n mapped_path = PATH.join ( PATH.dirname path ), smp.source\n return { path: mapped_path, linenr: smp.line, colnr: smp.column, }\n #.........................................................................................................\n return { path, linenr, colnr, }\n\n#-----------------------------------------------------------------------------------------------------------\nget_context = ( path, linenr, colnr, width ) ->\n try return ( _get_context path, linenr, colnr, width ) catch error\n throw error unless error.code is 'ENOENT'\n # return [ ( red \"!!! #{rpr error.message} !!!\" ), ]\n return []\n\n#-----------------------------------------------------------------------------------------------------------\n_get_context = ( path, linenr, colnr, width ) ->\n lines = ( FS.readFileSync path, { encoding: 'utf-8' } ).split '\\n'\n delta = 1\n coldelta = 5\n effect = reverse\n first_idx = Math.max 0, linenr - 1 - delta\n last_idx = Math.min lines.length - 1, linenr - 1 + delta\n R = []\n for line, idx in lines[ first_idx .. last_idx ]\n this_linenr = first_idx + idx + 1\n this_linenr_txt = ( this_linenr.toString().padStart 4 ) + '│ '\n if this_linenr isnt linenr\n ### TAINT should adjust overlong context lines as well ###\n R.push \"#{grey this_linenr_txt}#{grey line}\"\n continue\n ### TAINT perform line length adjustment, hiliting in dedicated method ###\n c0 = colnr - 1\n c1 = colnr + coldelta\n hilite = effect line[ c0 ... c1 ]\n line = line[ ... c0 ] + hilite + line[ c1 .. ]\n if c1 > width\n width2 = Math.floor width / 2\n line = '... ' + line[ c1 - width2 .. c1 + hilite.length - ( c1 - c0 ) + width2 ] + ' ...'\n else\n line = line[ .. width ]\n R.push \"#{grey this_linenr_txt}#{cyan line}\"\n # R = R.join '\\n'\n return R\n\n#-----------------------------------------------------------------------------------------------------------\nshow_error_with_source_context = ( error, headline ) ->\n ### From https://github.com/watson/stackman#gotchas: \"This module works because V8 (the JavaScript engine\n behind Node.js) allows us to hook into the stack trace generator function before that stack trace is\n generated. It's triggered by accessing the .stack property on the Error object, so please don't do\n that before parsing the error to stackman, else this will not work!\" ###\n alert '^77765-1^', reverse bold headline\n arrowhead = white '▲'\n arrowshaft = white '│'\n width = process.stdout.columns\n callsites = get_error_callsites error\n #.........................................................................................................\n if ( not callsites? ) or ( callsites.length is 0 )\n write_to_stderr CND.red CND.reverse \"error has no associated callsites:\"\n write_to_stderr CND.red CND.reverse rpr error\n return null\n #.........................................................................................................\n callsites.reverse()\n #.........................................................................................................\n for callsite in callsites\n path = callsite.getFileName()\n #.......................................................................................................\n unless path?\n write_to_stderr grey '—'.repeat 108\n continue\n #.......................................................................................................\n linenr = callsite.getLineNumber()\n colnr = callsite.getColumnNumber()\n #.......................................................................................................\n if path.startsWith 'internal/'\n write_to_stderr arrowhead, grey \"#{path} @ #{linenr},#{colnr}\"\n continue\n #.......................................................................................................\n # write_to_stderr()\n # write_to_stderr steel bold reverse ( \"#{relpath} ##{linenr}:\" ).padEnd 108\n { path\n linenr\n colnr } = await fetch_mapped_location path, linenr, colnr\n relpath = PATH.relative process.cwd(), path\n write_to_stderr arrowhead, gold ( \"#{relpath} @ #{linenr},#{colnr}: \\x1b[38;05;234m\".padEnd width, '—' )\n for context_line in await get_context path, linenr, colnr, width\n write_to_stderr arrowshaft, context_line\n alert '^77765-2^', reverse bold headline\n # if error?.message?\n return null\n\n#-----------------------------------------------------------------------------------------------------------\nexit_handler = ( error, origin ) ->\n ### TAINT origin never used ###\n show_stacktracey error\n type = error.code ? error.name ? 'EXCEPTION'\n message = \" #{type}: \" + ( error?.message ? \"an unrecoverable condition occurred\" )\n await show_error_with_source_context error, message\n setImmediate ( -> process.exit 111 )\n return null\n\n############################################################################################################\n############################################################################################################\n############################################################################################################\nStackTracey = require 'stacktracey'\n\nget_stacktracey = ( error ) ->\n stack = ( new StackTracey error ).withSources()\n # stack = stack.clean()\n R = []\n for idx in [ stack.items.length - 1 .. 0 ] by -1\n d = stack.items[ idx ]\n # debug '^2798^', ( k for k of d )\n s =\n # target_path: d.file\n relpath: d.fileRelative # fileShort\n native: d.native\n # is_nodejs: d.native\n is_other: d.thirdParty\n line: d.line\n column: d.column\n source: d.sourceLine\n error: d.error\n # for k in [ 'sourceLine', 'native', 'file', 'line', 'column', 'calleeShort', 'fileRelative', 'fileShort', 'fileName', 'thirdParty', 'name',]\n # debug k, rpr d[ k ]\n R.push s\n # info '\\n' + stack.asTable()\n return R\n\nshow_stacktracey = ( error ) ->\n for d in get_stacktracey error\n echo CND.steel \"#{d.relpath} @ #{d.line}:#{d.column}\"\n ### NOTE errors:\n ENOENT: no such file or directory\n EISDIR: illegal operation on a directory, read\n 'Cannot read property 'originalPositionFor' of undefined'\n ###\n if d.error? then echo CND.red d.error.message ? \"an error occurred\"\n else echo CND.yellow \"#{rpr d.source[ .. 100 ]}\"\n return null\n\n############################################################################################################\n############################################################################################################\n############################################################################################################\n\n\n############################################################################################################\nunless global[ Symbol.for 'cnd-exception-handler' ]?\n global[ Symbol.for 'cnd-exception-handler' ] = true\n process.once 'uncaughtException', exit_handler\n process.once 'unhandledRejection', exit_handler\n\n###\ncallsite.getThis() - returns the value of this\ncallsite.getTypeName() - returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property.\ncallsite.getFunction() - returns the current function\ncallsite.getFunctionName() - returns the name of the current function, typically its name property. If a name property is not available an attempt will be made to try to infer a name from the function's context.\ncallsite.getMethodName() - returns the name of the property of this or one of its prototypes that holds the current function\ncallsite.getFileName() - if this function was defined in a script returns the name of the script\ncallsite.getLineNumber() - if this function was defined in a script returns the current line number\ncallsite.getColumnNumber() - if this function was defined in a script returns the current column number\ncallsite.getEvalOrigin() - if this function was created using a call to eval returns a CallSite object representing the location where eval was called\ncallsite.isToplevel() - is this a toplevel invocation, that is, is this the global object?\ncallsite.isEval() - does this call take place in code defined by a call to eval?\ncallsite.isNative() - is this call in native V8 code?\ncallsite.isConstructor() - is this a constructor c\n###\n\n"
|
|
11
|
+
"\n\n'use strict'\n\n\n############################################################################################################\nCND = require 'cnd'\nrpr = CND.rpr\nbadge = 'nodexh'\nlog = CND.get_logger 'plain', badge\ndebug = CND.get_logger 'debug', badge\ninfo = CND.get_logger 'info', badge\nwarn = CND.get_logger 'warn', badge\nalert = CND.get_logger 'alert', badge\nhelp = CND.get_logger 'help', badge\nurge = CND.get_logger 'urge', badge\nwhisper = CND.get_logger 'whisper', badge\necho = CND.echo.bind CND\n# stackman = ( require 'stackman' )()\nget_error_callsites = require 'error-callsites'\nload_source_map = ( require 'util' ).promisify ( require 'load-source-map' )\nFS = require 'fs'\nPATH = require 'path'\n{ red\n green\n steel\n grey\n cyan\n bold\n gold\n white\n yellow\n reverse\n underline\n bold } = CND\n# types = new ( require '../../intertype' ).Intertype()\n# { isa } = types.export()\n\n#-----------------------------------------------------------------------------------------------------------\nwrite_to_stderr = ( P... ) -> process.stderr.write ' ' + CND.pen P...\n\n#-----------------------------------------------------------------------------------------------------------\nfetch_mapped_location = ( path, linenr, colnr ) ->\n try\n sourcemap = await load_source_map path\n smp = sourcemap.originalPositionFor { line: linenr, column: colnr, }\n catch error\n # warn '^7763-3^', \"!!!!!!!!!!!!!!!!!\", { path, }\n # warn '^7763-3^', \"!!!!!!!!!!!!!!!!!\", error.message\n return { path, linenr, colnr, }\n #.........................................................................................................\n if ( smp? ) and ( smp.source? ) and ( smp.source isnt '' ) and ( smp.line? ) and ( smp.column? )\n mapped_path = PATH.join ( PATH.dirname path ), smp.source\n return { path: mapped_path, linenr: smp.line, colnr: smp.column, }\n #.........................................................................................................\n return { path, linenr, colnr, }\n\n#-----------------------------------------------------------------------------------------------------------\nget_context = ( path, linenr, colnr, width ) ->\n try return ( _get_context path, linenr, colnr, width ) catch error\n throw error unless error.code is 'ENOENT'\n # return [ ( red \"!!! #{rpr error.message} !!!\" ), ]\n return []\n\n#-----------------------------------------------------------------------------------------------------------\n_get_context = ( path, linenr, colnr, width ) ->\n lines = ( FS.readFileSync path, { encoding: 'utf-8' } ).split '\\n'\n delta = 1\n coldelta = 5\n effect = reverse\n first_idx = Math.max 0, linenr - 1 - delta\n last_idx = Math.min lines.length - 1, linenr - 1 + delta\n R = []\n for line, idx in lines[ first_idx .. last_idx ]\n this_linenr = first_idx + idx + 1\n this_linenr_txt = ( this_linenr.toString().padStart 4 ) + '│ '\n if this_linenr isnt linenr\n ### TAINT should adjust overlong context lines as well ###\n R.push \"#{grey this_linenr_txt}#{grey line}\"\n continue\n ### TAINT perform line length adjustment, hiliting in dedicated method ###\n c0 = colnr - 1\n c1 = colnr + coldelta\n hilite = effect line[ c0 ... c1 ]\n line = line[ ... c0 ] + hilite + line[ c1 .. ]\n if c1 > width\n width2 = Math.floor width / 2\n line = '... ' + line[ c1 - width2 .. c1 + hilite.length - ( c1 - c0 ) + width2 ] + ' ...'\n else\n line = line[ .. width ]\n R.push \"#{grey this_linenr_txt}#{cyan line}\"\n # R = R.join '\\n'\n return R\n\n#-----------------------------------------------------------------------------------------------------------\nshow_error_with_source_context = ( error, headline ) ->\n ### From https://github.com/watson/stackman#gotchas: \"This module works because V8 (the JavaScript engine\n behind Node.js) allows us to hook into the stack trace generator function before that stack trace is\n generated. It's triggered by accessing the .stack property on the Error object, so please don't do\n that before parsing the error to stackman, else this will not work!\" ###\n alert '^77765-1^', reverse bold headline\n arrowhead = white '▲'\n arrowshaft = white '│'\n width = process.stdout.columns\n callsites = get_error_callsites error\n #.........................................................................................................\n if ( not callsites? ) or ( callsites.length is 0 )\n write_to_stderr CND.red CND.reverse \"^455756^ error has no associated callsites:\"\n write_to_stderr CND.red CND.reverse rpr error\n return null\n #.........................................................................................................\n callsites.reverse()\n #.........................................................................................................\n for callsite in callsites\n path = callsite.getFileName()\n #.......................................................................................................\n unless path?\n write_to_stderr grey '—'.repeat 108\n continue\n #.......................................................................................................\n linenr = callsite.getLineNumber()\n colnr = callsite.getColumnNumber()\n #.......................................................................................................\n if ( path.startsWith 'node:internal/' ) or ( path.startsWith 'internal/' )\n write_to_stderr arrowhead, grey \"#{path} @ #{linenr},#{colnr}\"\n continue\n #.......................................................................................................\n # write_to_stderr()\n # write_to_stderr steel bold reverse ( \"#{relpath} ##{linenr}:\" ).padEnd 108\n fname = callsite.getFunctionName() ? callsite.getMethodName() ? null\n { path\n linenr\n colnr } = await fetch_mapped_location path, linenr, colnr\n relpath = PATH.relative process.cwd(), path\n if fname?\n ### TAINT use proper methods to format with multiple colors ###\n fname_txt = steel fname\n width1 = width + ( fname_txt.length - fname.length )\n write_to_stderr arrowhead, gold ( \"#{relpath} @ #{linenr},#{colnr}: #{fname_txt}() \\x1b[38;05;234m\".padEnd width1, '—' )\n else\n write_to_stderr arrowhead, gold ( \"#{relpath} @ #{linenr},#{colnr}: \\x1b[38;05;234m\".padEnd width, '—' )\n for context_line in await get_context path, linenr, colnr, width\n write_to_stderr arrowshaft, context_line\n alert '^77765-2^', reverse bold headline\n # urge \"^94843^ error.stack:\", rpr error.stack\n # urge \"^94843^ error.message:\", rpr error.message\n # urge \"^94843^ error.code:\", rpr error.code\n # urge \"^94843^ error.name:\", rpr error.name\n # urge \"^94843^ error.type:\", rpr error.type\n # urge \"^94843^ error.toString():\", rpr error.toString()\n # urge \"^94843^ error:\", rpr error\n # CATALOGUING = require '../../multimix/lib/cataloguing'\n # urge \"^94843^\", ( CATALOGUING.all_keys_of error )\n return null\n\n#-----------------------------------------------------------------------------------------------------------\nexit_handler = ( error, origin ) ->\n ### TAINT origin never used ###\n # show_stacktracey error\n # debug '^4488^', error\n # debug '^4488^', await origin\n # return null\n type = error.code ? error.name ? 'EXCEPTION'\n message = \" #{type}: \" + ( error?.message ? \"an unrecoverable condition occurred\" )\n await show_error_with_source_context error, message\n setImmediate ( -> process.exit 111 )\n return null\n\n############################################################################################################\n############################################################################################################\n############################################################################################################\n\nget_stacktracey = ( error ) ->\n StackTracey = require 'stacktracey'\n stack = ( new StackTracey error ).withSources()\n # stack = stack.clean()\n R = []\n for idx in [ stack.items.length - 1 .. 0 ] by -1\n d = stack.items[ idx ]\n # debug '^2798^', ( k for k of d )\n s =\n # target_path: d.file\n relpath: d.fileRelative # fileShort\n native: d.native\n # is_nodejs: d.native\n is_other: d.thirdParty\n line: d.line\n column: d.column\n source: d.sourceLine\n error: d.error\n # for k in [ 'sourceLine', 'native', 'file', 'line', 'column', 'calleeShort', 'fileRelative', 'fileShort', 'fileName', 'thirdParty', 'name',]\n # debug k, rpr d[ k ]\n R.push s\n # info '\\n' + stack.asTable()\n return R\n\nshow_stacktracey = ( error ) ->\n for d in get_stacktracey error\n echo CND.steel '^44872^ ' + \"#{d.relpath} @ #{d.line}:#{d.column}\"\n ### NOTE errors:\n ENOENT: no such file or directory\n EISDIR: illegal operation on a directory, read\n 'Cannot read property 'originalPositionFor' of undefined'\n ###\n if d.error? then echo CND.red '^44873^ ' + ( d.error.message ? \"an error occurred\" )\n else echo CND.yellow '^44874^ ' + \"#{rpr d.source[ .. 100 ]}\"\n return null\n\n############################################################################################################\n############################################################################################################\n############################################################################################################\n\n\n############################################################################################################\nunless global[ Symbol.for 'cnd-exception-handler' ]?\n null\n global[ Symbol.for 'cnd-exception-handler' ] = true\n process.once 'uncaughtException', exit_handler\n process.once 'unhandledRejection', exit_handler\n\n # do =>\n # process.stderr.on 'data', ( data ) => debug \"^6863-1^ (stderr.on 'data'):\", rpr data\n # process.stdout.on 'data', ( data ) => debug \"^6863-2^ (stdout.on 'data'):\", rpr data\n # process.stderr.on 'end', => debug \"^6863-1^ (stderr.on 'end')\"\n # process.stdout.on 'end', => debug \"^6863-2^ (stdout.on 'end')\"\n # debug '^6456^'\n # echo \"^4564^ echo to stdout\"\n # warn \"^4564^ warn to stderr\"\n # process.stderr.write \"this goes to stderr\\n\"\n # process.stdout.write \"this goes to stdout\\n\"\n # process.on 'message', ( message ) -> debug \"^6863-3^' (process.on 'message'):\", rpr message\n # process.on 'warning', ( warning ) -> debug \"^6863-3^' (process.on 'warning'):\", rpr warning\n###\ncallsite.getThis() - returns the value of this\ncallsite.getTypeName() - returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property.\ncallsite.getFunction() - returns the current function\ncallsite.getFunctionName() - returns the name of the current function, typically its name property. If a name property is not available an attempt will be made to try to infer a name from the function's context.\ncallsite.getMethodName() - returns the name of the property of this or one of its prototypes that holds the current function\ncallsite.getFileName() - if this function was defined in a script returns the name of the script\ncallsite.getLineNumber() - if this function was defined in a script returns the current line number\ncallsite.getColumnNumber() - if this function was defined in a script returns the current column number\ncallsite.getEvalOrigin() - if this function was created using a call to eval returns a CallSite object representing the location where eval was called\ncallsite.isToplevel() - is this a toplevel invocation, that is, is this the global object?\ncallsite.isEval() - does this call take place in code defined by a call to eval?\ncallsite.isNative() - is this call in native V8 code?\ncallsite.isConstructor() - is this a constructor c\n###\n\n"
|
|
12
12
|
]
|
|
13
13
|
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nodexh",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "a wrapper around the `node` executable for better stacktraces with sourcemaps, sourcecode excerpts",
|
|
5
5
|
"main": "lib/main.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"nodexh": "bin/nodexh"
|
|
8
8
|
},
|
|
9
|
-
"scripts": {
|
|
10
|
-
"build": "coffee --map -o lib -c src"
|
|
11
|
-
},
|
|
12
9
|
"repository": {
|
|
13
10
|
"type": "git",
|
|
14
11
|
"url": "https://github.com/loveencounterflow/nodexh.git"
|
|
@@ -28,7 +25,10 @@
|
|
|
28
25
|
"dependencies": {
|
|
29
26
|
"cnd": "^9.1.0",
|
|
30
27
|
"error-callsites": "^2.0.3",
|
|
31
|
-
"load-source-map": "
|
|
28
|
+
"load-source-map": "3.0.1",
|
|
32
29
|
"stacktracey": "^2.0.14"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "coffee --map -o lib -c src"
|
|
33
33
|
}
|
|
34
|
-
}
|
|
34
|
+
}
|
package/pnpm-lock.yaml
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
lockfileVersion: 5.4
|
|
2
|
+
|
|
3
|
+
specifiers:
|
|
4
|
+
cnd: ^9.1.0
|
|
5
|
+
error-callsites: ^2.0.3
|
|
6
|
+
load-source-map: 3.0.1
|
|
7
|
+
stacktracey: ^2.0.14
|
|
8
|
+
|
|
9
|
+
dependencies:
|
|
10
|
+
cnd: 9.2.2
|
|
11
|
+
error-callsites: 2.0.4
|
|
12
|
+
load-source-map: 3.0.1
|
|
13
|
+
stacktracey: 2.1.8
|
|
14
|
+
|
|
15
|
+
packages:
|
|
16
|
+
|
|
17
|
+
/as-table/1.0.55:
|
|
18
|
+
resolution: {integrity: sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==}
|
|
19
|
+
dependencies:
|
|
20
|
+
printable-characters: 1.0.42
|
|
21
|
+
dev: false
|
|
22
|
+
|
|
23
|
+
/cnd/9.2.2:
|
|
24
|
+
resolution: {integrity: sha512-F+/H+7luk4fZkvN0+MT0I2nwn80YM/EtfMttNUFxENR50XJH4g0KgQevzeyEJ8B6t6l8Tb4Xti6QAksa8DmePA==}
|
|
25
|
+
hasBin: true
|
|
26
|
+
dependencies:
|
|
27
|
+
jsx-number-format: 0.1.4
|
|
28
|
+
dev: false
|
|
29
|
+
|
|
30
|
+
/data-uri-to-buffer/2.0.2:
|
|
31
|
+
resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==}
|
|
32
|
+
dev: false
|
|
33
|
+
|
|
34
|
+
/error-callsites/2.0.4:
|
|
35
|
+
resolution: {integrity: sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==}
|
|
36
|
+
engines: {node: '>=6.x'}
|
|
37
|
+
dev: false
|
|
38
|
+
|
|
39
|
+
/get-source/2.0.12:
|
|
40
|
+
resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
|
|
41
|
+
dependencies:
|
|
42
|
+
data-uri-to-buffer: 2.0.2
|
|
43
|
+
source-map: 0.6.1
|
|
44
|
+
dev: false
|
|
45
|
+
|
|
46
|
+
/jsx-number-format/0.1.4:
|
|
47
|
+
resolution: {integrity: sha512-uPc/Q90XqZoRE7Cu1OLFQB2cSrA2Dy8+okzPOtML8vbagNFDSipbndIPme+q0odBjEhL+wf3WH3Wo52was4Tsg==}
|
|
48
|
+
dev: false
|
|
49
|
+
|
|
50
|
+
/load-source-map/3.0.1:
|
|
51
|
+
resolution: {integrity: sha512-TMYgVXwivT/VeOk0h+chnlhgCclG9xaB8v0Z07gOGDuvE1Vg60fW4NOIPMQ+h64jYYgfgenp0AsdczQWfRAoVw==}
|
|
52
|
+
engines: {node: '>=12'}
|
|
53
|
+
dependencies:
|
|
54
|
+
source-map: 0.8.0-beta.0
|
|
55
|
+
dev: false
|
|
56
|
+
|
|
57
|
+
/lodash.sortby/4.7.0:
|
|
58
|
+
resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==}
|
|
59
|
+
dev: false
|
|
60
|
+
|
|
61
|
+
/printable-characters/1.0.42:
|
|
62
|
+
resolution: {integrity: sha1-Pxjpd6m9jrN/zE/1ZZ176Qhos9g=}
|
|
63
|
+
dev: false
|
|
64
|
+
|
|
65
|
+
/punycode/2.1.1:
|
|
66
|
+
resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
|
|
67
|
+
engines: {node: '>=6'}
|
|
68
|
+
dev: false
|
|
69
|
+
|
|
70
|
+
/source-map/0.6.1:
|
|
71
|
+
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
|
|
72
|
+
engines: {node: '>=0.10.0'}
|
|
73
|
+
dev: false
|
|
74
|
+
|
|
75
|
+
/source-map/0.8.0-beta.0:
|
|
76
|
+
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
|
|
77
|
+
engines: {node: '>= 8'}
|
|
78
|
+
dependencies:
|
|
79
|
+
whatwg-url: 7.1.0
|
|
80
|
+
dev: false
|
|
81
|
+
|
|
82
|
+
/stacktracey/2.1.8:
|
|
83
|
+
resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
|
|
84
|
+
dependencies:
|
|
85
|
+
as-table: 1.0.55
|
|
86
|
+
get-source: 2.0.12
|
|
87
|
+
dev: false
|
|
88
|
+
|
|
89
|
+
/tr46/1.0.1:
|
|
90
|
+
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
|
|
91
|
+
dependencies:
|
|
92
|
+
punycode: 2.1.1
|
|
93
|
+
dev: false
|
|
94
|
+
|
|
95
|
+
/webidl-conversions/4.0.2:
|
|
96
|
+
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
|
|
97
|
+
dev: false
|
|
98
|
+
|
|
99
|
+
/whatwg-url/7.1.0:
|
|
100
|
+
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
|
|
101
|
+
dependencies:
|
|
102
|
+
lodash.sortby: 4.7.0
|
|
103
|
+
tr46: 1.0.1
|
|
104
|
+
webidl-conversions: 4.0.2
|
|
105
|
+
dev: false
|
package/src/main.coffee
CHANGED
|
@@ -45,7 +45,8 @@ fetch_mapped_location = ( path, linenr, colnr ) ->
|
|
|
45
45
|
sourcemap = await load_source_map path
|
|
46
46
|
smp = sourcemap.originalPositionFor { line: linenr, column: colnr, }
|
|
47
47
|
catch error
|
|
48
|
-
warn '^7763-3^', "!!!!!!!!!!!!!!!!!",
|
|
48
|
+
# warn '^7763-3^', "!!!!!!!!!!!!!!!!!", { path, }
|
|
49
|
+
# warn '^7763-3^', "!!!!!!!!!!!!!!!!!", error.message
|
|
49
50
|
return { path, linenr, colnr, }
|
|
50
51
|
#.........................................................................................................
|
|
51
52
|
if ( smp? ) and ( smp.source? ) and ( smp.source isnt '' ) and ( smp.line? ) and ( smp.column? )
|
|
@@ -104,7 +105,7 @@ show_error_with_source_context = ( error, headline ) ->
|
|
|
104
105
|
callsites = get_error_callsites error
|
|
105
106
|
#.........................................................................................................
|
|
106
107
|
if ( not callsites? ) or ( callsites.length is 0 )
|
|
107
|
-
write_to_stderr CND.red CND.reverse "error has no associated callsites:"
|
|
108
|
+
write_to_stderr CND.red CND.reverse "^455756^ error has no associated callsites:"
|
|
108
109
|
write_to_stderr CND.red CND.reverse rpr error
|
|
109
110
|
return null
|
|
110
111
|
#.........................................................................................................
|
|
@@ -120,27 +121,45 @@ show_error_with_source_context = ( error, headline ) ->
|
|
|
120
121
|
linenr = callsite.getLineNumber()
|
|
121
122
|
colnr = callsite.getColumnNumber()
|
|
122
123
|
#.......................................................................................................
|
|
123
|
-
if path.startsWith 'internal/'
|
|
124
|
+
if ( path.startsWith 'node:internal/' ) or ( path.startsWith 'internal/' )
|
|
124
125
|
write_to_stderr arrowhead, grey "#{path} @ #{linenr},#{colnr}"
|
|
125
126
|
continue
|
|
126
127
|
#.......................................................................................................
|
|
127
128
|
# write_to_stderr()
|
|
128
129
|
# write_to_stderr steel bold reverse ( "#{relpath} ##{linenr}:" ).padEnd 108
|
|
130
|
+
fname = callsite.getFunctionName() ? callsite.getMethodName() ? null
|
|
129
131
|
{ path
|
|
130
132
|
linenr
|
|
131
133
|
colnr } = await fetch_mapped_location path, linenr, colnr
|
|
132
134
|
relpath = PATH.relative process.cwd(), path
|
|
133
|
-
|
|
135
|
+
if fname?
|
|
136
|
+
### TAINT use proper methods to format with multiple colors ###
|
|
137
|
+
fname_txt = steel fname
|
|
138
|
+
width1 = width + ( fname_txt.length - fname.length )
|
|
139
|
+
write_to_stderr arrowhead, gold ( "#{relpath} @ #{linenr},#{colnr}: #{fname_txt}() \x1b[38;05;234m".padEnd width1, '—' )
|
|
140
|
+
else
|
|
141
|
+
write_to_stderr arrowhead, gold ( "#{relpath} @ #{linenr},#{colnr}: \x1b[38;05;234m".padEnd width, '—' )
|
|
134
142
|
for context_line in await get_context path, linenr, colnr, width
|
|
135
143
|
write_to_stderr arrowshaft, context_line
|
|
136
144
|
alert '^77765-2^', reverse bold headline
|
|
137
|
-
#
|
|
145
|
+
# urge "^94843^ error.stack:", rpr error.stack
|
|
146
|
+
# urge "^94843^ error.message:", rpr error.message
|
|
147
|
+
# urge "^94843^ error.code:", rpr error.code
|
|
148
|
+
# urge "^94843^ error.name:", rpr error.name
|
|
149
|
+
# urge "^94843^ error.type:", rpr error.type
|
|
150
|
+
# urge "^94843^ error.toString():", rpr error.toString()
|
|
151
|
+
# urge "^94843^ error:", rpr error
|
|
152
|
+
# CATALOGUING = require '../../multimix/lib/cataloguing'
|
|
153
|
+
# urge "^94843^", ( CATALOGUING.all_keys_of error )
|
|
138
154
|
return null
|
|
139
155
|
|
|
140
156
|
#-----------------------------------------------------------------------------------------------------------
|
|
141
157
|
exit_handler = ( error, origin ) ->
|
|
142
158
|
### TAINT origin never used ###
|
|
143
|
-
show_stacktracey error
|
|
159
|
+
# show_stacktracey error
|
|
160
|
+
# debug '^4488^', error
|
|
161
|
+
# debug '^4488^', await origin
|
|
162
|
+
# return null
|
|
144
163
|
type = error.code ? error.name ? 'EXCEPTION'
|
|
145
164
|
message = " #{type}: " + ( error?.message ? "an unrecoverable condition occurred" )
|
|
146
165
|
await show_error_with_source_context error, message
|
|
@@ -150,9 +169,9 @@ exit_handler = ( error, origin ) ->
|
|
|
150
169
|
############################################################################################################
|
|
151
170
|
############################################################################################################
|
|
152
171
|
############################################################################################################
|
|
153
|
-
StackTracey = require 'stacktracey'
|
|
154
172
|
|
|
155
173
|
get_stacktracey = ( error ) ->
|
|
174
|
+
StackTracey = require 'stacktracey'
|
|
156
175
|
stack = ( new StackTracey error ).withSources()
|
|
157
176
|
# stack = stack.clean()
|
|
158
177
|
R = []
|
|
@@ -177,14 +196,14 @@ get_stacktracey = ( error ) ->
|
|
|
177
196
|
|
|
178
197
|
show_stacktracey = ( error ) ->
|
|
179
198
|
for d in get_stacktracey error
|
|
180
|
-
echo CND.steel
|
|
199
|
+
echo CND.steel '^44872^ ' + "#{d.relpath} @ #{d.line}:#{d.column}"
|
|
181
200
|
### NOTE errors:
|
|
182
201
|
ENOENT: no such file or directory
|
|
183
202
|
EISDIR: illegal operation on a directory, read
|
|
184
203
|
'Cannot read property 'originalPositionFor' of undefined'
|
|
185
204
|
###
|
|
186
|
-
if d.error? then echo CND.red d.error.message ? "an error occurred"
|
|
187
|
-
else echo CND.yellow "#{rpr d.source[ .. 100 ]}"
|
|
205
|
+
if d.error? then echo CND.red '^44873^ ' + ( d.error.message ? "an error occurred" )
|
|
206
|
+
else echo CND.yellow '^44874^ ' + "#{rpr d.source[ .. 100 ]}"
|
|
188
207
|
return null
|
|
189
208
|
|
|
190
209
|
############################################################################################################
|
|
@@ -194,10 +213,23 @@ show_stacktracey = ( error ) ->
|
|
|
194
213
|
|
|
195
214
|
############################################################################################################
|
|
196
215
|
unless global[ Symbol.for 'cnd-exception-handler' ]?
|
|
216
|
+
null
|
|
197
217
|
global[ Symbol.for 'cnd-exception-handler' ] = true
|
|
198
218
|
process.once 'uncaughtException', exit_handler
|
|
199
219
|
process.once 'unhandledRejection', exit_handler
|
|
200
220
|
|
|
221
|
+
# do =>
|
|
222
|
+
# process.stderr.on 'data', ( data ) => debug "^6863-1^ (stderr.on 'data'):", rpr data
|
|
223
|
+
# process.stdout.on 'data', ( data ) => debug "^6863-2^ (stdout.on 'data'):", rpr data
|
|
224
|
+
# process.stderr.on 'end', => debug "^6863-1^ (stderr.on 'end')"
|
|
225
|
+
# process.stdout.on 'end', => debug "^6863-2^ (stdout.on 'end')"
|
|
226
|
+
# debug '^6456^'
|
|
227
|
+
# echo "^4564^ echo to stdout"
|
|
228
|
+
# warn "^4564^ warn to stderr"
|
|
229
|
+
# process.stderr.write "this goes to stderr\n"
|
|
230
|
+
# process.stdout.write "this goes to stdout\n"
|
|
231
|
+
# process.on 'message', ( message ) -> debug "^6863-3^' (process.on 'message'):", rpr message
|
|
232
|
+
# process.on 'warning', ( warning ) -> debug "^6863-3^' (process.on 'warning'):", rpr warning
|
|
201
233
|
###
|
|
202
234
|
callsite.getThis() - returns the value of this
|
|
203
235
|
callsite.getTypeName() - returns the type of this as a string. This is the name of the function stored in the constructor field of this, if available, otherwise the object's [[Class]] internal property.
|