nodexh 3.2.0 → 4.0.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.
Files changed (3) hide show
  1. package/lib/main.js +12 -192
  2. package/package.json +2 -4
  3. package/src/main.coffee +8 -145
package/lib/main.js CHANGED
@@ -1,202 +1,23 @@
1
1
  (function() {
2
2
  'use strict';
3
- var FS, GUY, PATH, _exit_handler, _get_context, alert, blue, bold, cyan, debug, echo, exit_handler, fetch_mapped_location, get_context, get_error_callsites, gold, green, grey, inspect, lime, load_source_map, log, modules_path_color, orange, outside_path_color, own_path_color, plum, red, reverse, rpr, show_error_with_source_context, steel, underline, white, write_to_stderr, yellow;
3
+ var SFMODULES, exit_handler, format_stack, write_to_stderr;
4
4
 
5
5
  //###########################################################################################################
6
- GUY = require('guy');
6
+ // blue # Слава Україні
7
+ // yellow # Слава Україні
8
+ SFMODULES = require('bricabrac-single-file-modules');
7
9
 
8
- ({alert, debug} = GUY.trm.get_loggers('NODEXH'));
9
-
10
- ({rpr, inspect, echo, log} = GUY.trm);
11
-
12
- get_error_callsites = require('error-callsites');
13
-
14
- load_source_map = (require('util')).promisify(require('load-source-map'));
15
-
16
- FS = require('fs');
17
-
18
- PATH = require('path');
19
-
20
- ({red, green, steel, cyan, bold, lime, gold, white, plum, orange, blue, yellow, reverse, underline, bold} = GUY.trm); // Слава Україні // Слава Україні
21
-
22
- grey = GUY.trm.BASE1;
23
-
24
- //-----------------------------------------------------------------------------------------------------------
25
- modules_path_color = function(...P) {
26
- return reverse(bold(orange('', ...P, '')));
27
- };
28
-
29
- outside_path_color = function(...P) {
30
- return reverse(bold(plum('', ...P, '')));
31
- };
32
-
33
- own_path_color = function(...P) {
34
- return reverse(bold(lime('', ...P, '')));
35
- };
10
+ ({format_stack} = SFMODULES.unstable.require_format_stack());
36
11
 
37
12
  //-----------------------------------------------------------------------------------------------------------
38
- write_to_stderr = function(...P) {
39
- return process.stderr.write(' ' + (GUY.trm.pen(...P)) + '\n');
40
- };
41
-
42
- //-----------------------------------------------------------------------------------------------------------
43
- fetch_mapped_location = async function(path, linenr, colnr) {
44
- var error, mapped_path, smp, sourcemap;
45
- try {
46
- sourcemap = (await load_source_map(path));
47
- smp = sourcemap.originalPositionFor({
48
- line: linenr,
49
- column: colnr
50
- });
51
- } catch (error1) {
52
- error = error1;
53
- return {path, linenr, colnr};
54
- }
55
- //.........................................................................................................
56
- if ((smp != null) && (smp.source != null) && (smp.source !== '') && (smp.line != null) && (smp.column != null)) {
57
- mapped_path = PATH.join(PATH.dirname(path), smp.source);
58
- return {
59
- path: mapped_path,
60
- linenr: smp.line,
61
- colnr: smp.column
62
- };
63
- }
64
- //.........................................................................................................
65
- return {path, linenr, colnr};
66
- };
67
-
68
- //-----------------------------------------------------------------------------------------------------------
69
- get_context = function(path, linenr, colnr, width) {
70
- var error;
71
- try {
72
- return _get_context(path, linenr, colnr, width);
73
- } catch (error1) {
74
- error = error1;
75
- if (error.code !== 'ENOENT') {
76
- throw error;
77
- }
78
- }
79
- return [];
80
- };
81
-
82
- //-----------------------------------------------------------------------------------------------------------
83
- _get_context = function(path, linenr, colnr, width) {
84
- /* TAINT perform line length adjustment, hiliting in dedicated method */
85
- var R, c0, c1, coldelta, delta, effect, first_idx, hilite, i, idx, last_idx, len, line, lines, ref, this_linenr, this_linenr_txt, width2;
86
- lines = (FS.readFileSync(path, {
87
- encoding: 'utf-8'
88
- })).split('\n');
89
- delta = 1;
90
- coldelta = 5;
91
- effect = reverse;
92
- first_idx = Math.max(0, linenr - 1 - delta);
93
- last_idx = Math.min(lines.length - 1, linenr - 1 + delta);
94
- R = [];
95
- ref = lines.slice(first_idx, +last_idx + 1 || 9e9);
96
- for (idx = i = 0, len = ref.length; i < len; idx = ++i) {
97
- line = ref[idx];
98
- this_linenr = first_idx + idx + 1;
99
- this_linenr_txt = (this_linenr.toString().padStart(4)) + '│ ';
100
- if (this_linenr !== linenr) {
101
- /* TAINT should adjust overlong context lines as well */
102
- R.push(`${grey(this_linenr_txt)}${grey(line)}`);
103
- continue;
104
- }
105
- c0 = colnr - 1;
106
- c1 = colnr + coldelta;
107
- hilite = effect(line.slice(c0, c1));
108
- line = line.slice(0, c0) + hilite + line.slice(c1);
109
- if (c1 > width) {
110
- width2 = Math.floor(width / 2);
111
- line = '... ' + line.slice(c1 - width2, +(c1 + hilite.length - (c1 - c0) + width2) + 1 || 9e9) + ' ...';
112
- } else {
113
- line = line.slice(0, +width + 1 || 9e9);
114
- }
115
- R.push(`${grey(this_linenr_txt)}${cyan(line)}`);
116
- }
117
- return R;
118
- };
119
-
120
- //-----------------------------------------------------------------------------------------------------------
121
- show_error_with_source_context = async function(error, headline) {
122
- /* TAINT use proper methods to format with multiple colors */
123
- var arrowhead, arrowshaft, callsite, callsites, colnr, context_line, fname, fname_txt, i, j, len, len1, linenr, path, path_color, ref, ref1, ref2, relpath, width, width1;
124
- alert('^77765-1^', reverse(bold(headline)));
125
- arrowhead = white('▲');
126
- arrowshaft = white('│');
127
- width = process.stdout.columns;
128
- callsites = get_error_callsites(error);
129
- //.........................................................................................................
130
- if ((callsites == null) || (callsites.length === 0)) {
131
- write_to_stderr(red(reverse("^455756^ error has no associated callsites:")));
132
- write_to_stderr(red(reverse(rpr(error))));
133
- return null;
134
- }
135
- //.........................................................................................................
136
- callsites.reverse();
137
- //.........................................................................................................
138
- for (i = 0, len = callsites.length; i < len; i++) {
139
- callsite = callsites[i];
140
- path = callsite.getFileName();
141
- //.......................................................................................................
142
- if (path == null) {
143
- write_to_stderr(grey('—'.repeat(108)));
144
- continue;
145
- }
146
- //.......................................................................................................
147
- linenr = callsite.getLineNumber();
148
- colnr = callsite.getColumnNumber();
149
- //.......................................................................................................
150
- if ((path.startsWith('node:')) || (path.startsWith('internal/'))) {
151
- write_to_stderr(arrowhead, grey(`${path} @ ${linenr},${colnr}`));
152
- continue;
153
- }
154
- //.......................................................................................................
155
- fname = (ref = (ref1 = callsite.getFunctionName()) != null ? ref1 : callsite.getMethodName()) != null ? ref : null;
156
- ({path, linenr, colnr} = (await fetch_mapped_location(path, linenr, colnr)));
157
- relpath = PATH.relative(process.cwd(), path);
158
- //.......................................................................................................
159
- switch (true) {
160
- case /\/node_modules\//.test(path):
161
- path_color = modules_path_color;
162
- break;
163
- case relpath.startsWith('../'):
164
- path_color = outside_path_color;
165
- break;
166
- default:
167
- path_color = own_path_color;
168
- }
169
- //.......................................................................................................
170
- if (fname != null) {
171
- fname_txt = steel(fname);
172
- width1 = width + (fname_txt.length - fname.length);
173
- write_to_stderr(arrowhead, path_color(`${relpath} @ ${linenr},${colnr}: ${fname_txt}() \x1b[38;05;234m`.padEnd(width1, '—')));
174
- } else {
175
- write_to_stderr(arrowhead, path_color(`${relpath} @ ${linenr},${colnr}: \x1b[38;05;234m`.padEnd(width, '—')));
176
- }
177
- ref2 = (await get_context(path, linenr, colnr, width));
178
- for (j = 0, len1 = ref2.length; j < len1; j++) {
179
- context_line = ref2[j];
180
- write_to_stderr(arrowshaft, context_line);
181
- }
182
- }
183
- alert('^77765-2^', reverse(bold(headline)));
184
- return null;
185
- };
186
-
187
- //-----------------------------------------------------------------------------------------------------------
188
- _exit_handler = async function(error, origin) {
189
- /* TAINT origin never used */
190
- var message, ref, ref1, ref2, type;
191
- type = (ref = (ref1 = error.code) != null ? ref1 : error.name) != null ? ref : 'EXCEPTION';
192
- message = ` ${type}: ` + ((ref2 = error != null ? error.message : void 0) != null ? ref2 : "an unrecoverable condition occurred");
193
- await show_error_with_source_context(error, message);
194
- return null;
13
+ write_to_stderr = function(text) {
14
+ return process.stderr.write(text + '\n');
195
15
  };
196
16
 
197
17
  //-----------------------------------------------------------------------------------------------------------
198
- exit_handler = async function(error, origin) {
199
- await _exit_handler(error, origin);
18
+ exit_handler = function(error, origin) {
19
+ // _exit_handler error, origin
20
+ write_to_stderr(format_stack(error));
200
21
  setImmediate((function() {
201
22
  return process.exit(111);
202
23
  }));
@@ -212,9 +33,8 @@
212
33
  }
213
34
 
214
35
  //###########################################################################################################
215
- module.exports = {exit_handler, _exit_handler};
36
+ module.exports = {exit_handler};
216
37
 
217
38
  }).call(this);
218
39
 
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21haW4uY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQUE7QUFBQSxNQUFBLEVBQUEsRUFBQSxHQUFBLEVBQUEsSUFBQSxFQUFBLGFBQUEsRUFBQSxZQUFBLEVBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxJQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsRUFBQSxJQUFBLEVBQUEsWUFBQSxFQUFBLHFCQUFBLEVBQUEsV0FBQSxFQUFBLG1CQUFBLEVBQUEsSUFBQSxFQUFBLEtBQUEsRUFBQSxJQUFBLEVBQUEsT0FBQSxFQUFBLElBQUEsRUFBQSxlQUFBLEVBQUEsR0FBQSxFQUFBLGtCQUFBLEVBQUEsTUFBQSxFQUFBLGtCQUFBLEVBQUEsY0FBQSxFQUFBLElBQUEsRUFBQSxHQUFBLEVBQUEsT0FBQSxFQUFBLEdBQUEsRUFBQSw4QkFBQSxFQUFBLEtBQUEsRUFBQSxTQUFBLEVBQUEsS0FBQSxFQUFBLGVBQUEsRUFBQSxNQUFBOzs7RUFJQSxHQUFBLEdBQTRCLE9BQUEsQ0FBUSxLQUFSOztFQUM1QixDQUFBLENBQUUsS0FBRixFQUNFLEtBREYsQ0FBQSxHQUM0QixHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVIsQ0FBb0IsUUFBcEIsQ0FENUI7O0VBRUEsQ0FBQSxDQUFFLEdBQUYsRUFDRSxPQURGLEVBRUUsSUFGRixFQUdFLEdBSEYsQ0FBQSxHQUc0QixHQUFHLENBQUMsR0FIaEM7O0VBSUEsbUJBQUEsR0FBNEIsT0FBQSxDQUFRLGlCQUFSOztFQUM1QixlQUFBLEdBQTRCLENBQUUsT0FBQSxDQUFRLE1BQVIsQ0FBRixDQUFrQixDQUFDLFNBQW5CLENBQStCLE9BQUEsQ0FBUSxpQkFBUixDQUEvQjs7RUFDNUIsRUFBQSxHQUE0QixPQUFBLENBQVEsSUFBUjs7RUFDNUIsSUFBQSxHQUE0QixPQUFBLENBQVEsTUFBUjs7RUFDNUIsQ0FBQSxDQUFFLEdBQUYsRUFDRSxLQURGLEVBRUUsS0FG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QyxPQUFBLEdBQVUsRUFBQSxDQUFBLENBQUksSUFBSixDQUFBLEVBQUEsQ0FBQSxHQUFlLGtFQUFtQixxQ0FBbkI7SUFDekIsTUFBTSw4QkFBQSxDQUErQixLQUEvQixFQUFzQyxPQUF0QztBQUNOLFdBQU87RUFMTyxFQS9JaEI7OztFQXVKQSxZQUFBLEdBQWUsTUFBQSxRQUFBLENBQUUsS0FBRixFQUFTLE1BQVQsQ0FBQTtJQUNiLE1BQU0sYUFBQSxDQUFjLEtBQWQsRUFBcUIsTUFBckI7SUFDTixZQUFBLENBQWEsQ0FBRSxRQUFBLENBQUEsQ0FBQTthQUFHLE9BQU8sQ0FBQyxJQUFSLENBQWEsR0FBYjtJQUFILENBQUYsQ0FBYjtBQUNBLFdBQU87RUFITSxFQXZKZjs7O0VBK0pBLElBQU8sbURBQVA7SUFDRTtJQUNBLE1BQU0sQ0FBRSxNQUFNLENBQUMsR0FBUCxDQUFXLHVCQUFYLENBQUYsQ0FBTixHQUErQztJQUMvQyxPQUFPLENBQUMsSUFBUixDQUFhLG1CQUFiLEVBQW1DLFlBQW5DO0lBQ0EsT0FBTyxDQUFDLElBQVIsQ0FBYSxvQkFBYixFQUFtQyxZQUFuQyxFQUpGO0dBL0pBOzs7RUF1S0EsTUFBTSxDQUFDLE9BQVAsR0FBaUIsQ0FBRSxZQUFGLEVBQWdCLGFBQWhCO0FBdktqQiIsInNvdXJjZXNDb250ZW50IjpbIlxuJ3VzZSBzdHJpY3QnXG5cblxuIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5HVVkgICAgICAgICAgICAgICAgICAgICAgID0gcmVxdWlyZSAnZ3V5J1xueyBhbGVydFxuICBkZWJ1ZyAgIH0gICAgICAgICAgICAgICA9IEdVWS50cm0uZ2V0X2xvZ2dlcnMgJ05PREVYSCdcbnsgcnByXG4gIGluc3BlY3RcbiAgZWNob1xuICBsb2cgICAgIH0gICAgICAgICAgICAgICA9IEdVWS50cm1cbmdldF9lcnJvcl9jYWxsc2l0ZXMgICAgICAgPSByZXF1aXJlICdlcnJvci1jYWxsc2l0ZXMnXG5sb2FkX3NvdXJjZV9tYXAgICAgICAgICAgID0gKCByZXF1aXJlICd1dGlsJyApLnByb21pc2lmeSAoIHJlcXVpcmUgJ2xvYWQtc291cmNlLW1hcCcgKVxuRlMgICAgICAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUgJ2ZzJ1xuUEFUSCAgICAgICAgICAgICAgICAgICAgICA9IHJlcXVpcmUgJ3BhdGgnXG57IHJlZFxuICBncmVlblxuICBzdGVlbFxuICBjeWFuXG4gIGJvbGRcbiAgbGltZVxuICBnb2xkXG4gIHdoaXRlXG4gIHBsdW1cbiAgb3JhbmdlXG4gIGJsdWUgICAgIyDQodC70LDQstCwINCj0LrRgNCw0ZfQvdGWXG4gIHllbGxvdyAgIyDQodC70LDQstCwINCj0LrRgNCw0ZfQvdGWXG4gIHJldmVyc2VcbiAgdW5kZXJsaW5lXG4gIGJvbGQgfSAgICAgICAgICAgICAgICAgID0gR1VZLnRybVxuZ3JleSAgICAgICAgICAgICAgICAgICAgICA9IEdVWS50cm0uQkFTRTFcblxuXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbm1vZHVsZXNfcGF0aF9jb2xvciAgPSAoIFAuLi4gKSAtPiByZXZlcnNlIGJvbGQgb3JhbmdlICcnLCBQLi4uLCAnJ1xub3V0c2lkZV9wYXRoX2NvbG9yICA9ICggUC4uLiApIC0+IHJldmVyc2UgYm9sZCBwbHVtICAgJycsIFAuLi4sICcnXG5vd25fcGF0aF9jb2xvciAgICAgID0gKCBQLi4uICkgLT4gcmV2ZXJzZSBib2xkIGxpbWUgICAnJywgUC4uLiwgJydcblxuIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG53cml0ZV90b19zdGRlcnIgPSAoIFAuLi4gKSAtPiBwcm9jZXNzLnN0ZGVyci53cml0ZSAnICcgKyAoIEdVWS50cm0ucGVuIFAuLi4gKSArICdcXG4nXG5cbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZmV0Y2hfbWFwcGVkX2xvY2F0aW9uID0gKCBwYXRoLCBsaW5lbnIsIGNvbG5yICkgLT5cbiAgdHJ5XG4gICAgc291cmNlbWFwID0gYXdhaXQgbG9hZF9zb3VyY2VfbWFwIHBhdGhcbiAgICBzbXAgICAgICAgPSBzb3VyY2VtYXAub3JpZ2luYWxQb3NpdGlvbkZvciB7IGxpbmU6IGxpbmVuciwgY29sdW1uOiBjb2xuciwgfVxuICBjYXRjaCBlcnJvclxuICAgIHJldHVybiB7IHBhdGgsIGxpbmVuciwgY29sbnIsIH1cbiAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBpZiAoIHNtcD8gKSBhbmQgKCBzbXAuc291cmNlPyApIGFuZCAoIHNtcC5zb3VyY2UgaXNudCAnJyApIGFuZCAoIHNtcC5saW5lPyApIGFuZCAoIHNtcC5jb2x1bW4/IClcbiAgICBtYXBwZWRfcGF0aCA9IFBBVEguam9pbiAoIFBBVEguZGlybmFtZSBwYXRoICksIHNtcC5zb3VyY2VcbiAgICByZXR1cm4geyBwYXRoOiBtYXBwZWRfcGF0aCwgbGluZW5yOiBzbXAubGluZSwgY29sbnI6IHNtcC5jb2x1bW4sIH1cbiAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICByZXR1cm4geyBwYXRoLCBsaW5lbnIsIGNvbG5yLCB9XG5cbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZ2V0X2NvbnRleHQgPSAoIHBhdGgsIGxpbmVuciwgY29sbnIsIHdpZHRoICkgLT5cbiAgdHJ5IHJldHVybiAoIF9nZXRfY29udGV4dCBwYXRoLCBsaW5lbnIsIGNvbG5yLCB3aWR0aCApIGNhdGNoIGVycm9yXG4gICAgdGhyb3cgZXJyb3IgdW5sZXNzIGVycm9yLmNvZGUgaXMgJ0VOT0VOVCdcbiAgcmV0dXJuIFtdXG5cbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuX2dldF9jb250ZXh0ID0gKCBwYXRoLCBsaW5lbnIsIGNvbG5yLCB3aWR0aCApIC0+XG4gIGxpbmVzICAgICA9ICggRlMucmVhZEZpbGVTeW5jIHBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSApLnNwbGl0ICdcXG4nXG4gIGRlbHRhICAgICA9IDFcbiAgY29sZGVsdGEgID0gNVxuICBlZmZlY3QgICAgPSByZXZlcnNlXG4gIGZpcnN0X2lkeCA9IE1hdGgubWF4IDAsIGxpbmVuciAtIDEgLSBkZWx0YVxuICBsYXN0X2lkeCAgPSBNYXRoLm1pbiBsaW5lcy5sZW5ndGggLSAxLCBsaW5lbnIgLSAxICsgZGVsdGFcbiAgUiAgICAgICAgID0gW11cbiAgZm9yIGxpbmUsIGlkeCBpbiBsaW5lc1sgZmlyc3RfaWR4IC4uIGxhc3RfaWR4IF1cbiAgICB0aGlzX2xpbmVuciAgICAgPSBmaXJzdF9pZHggKyBpZHggKyAxXG4gICAgdGhpc19saW5lbnJfdHh0ID0gKCB0aGlzX2xpbmVuci50b1N0cmluZygpLnBhZFN0YXJ0IDQgKSArICfilIIgJ1xuICAgIGlmIHRoaXNfbGluZW5yIGlzbnQgbGluZW5yXG4gICAgICAjIyMgVEFJTlQgc2hvdWxkIGFkanVzdCBvdmVybG9uZyBjb250ZXh0IGxpbmVzIGFzIHdlbGwgIyMjXG4gICAgICBSLnB1c2ggIFwiI3tncmV5IHRoaXNfbGluZW5yX3R4dH0je2dyZXkgbGluZX1cIlxuICAgICAgY29udGludWVcbiAgICAjIyMgVEFJTlQgcGVyZm9ybSBsaW5lIGxlbmd0aCBhZGp1c3RtZW50LCBoaWxpdGluZyBpbiBkZWRpY2F0ZWQgbWV0aG9kICMjI1xuICAgIGMwICAgICAgPSBjb2xuciAtIDFcbiAgICBjMSAgICAgID0gY29sbnIgKyBjb2xkZWx0YVxuICAgIGhpbGl0ZSAgPSBlZmZlY3QgbGluZVsgYzAgLi4uIGMxIF1cbiAgICBsaW5lICAgID0gbGluZVsgLi4uIGMwIF0gKyBoaWxpdGUgKyBsaW5lWyBjMSAuLiBdXG4gICAgaWYgYzEgPiB3aWR0aFxuICAgICAgd2lkdGgyICA9IE1hdGguZmxvb3Igd2lkdGggLyAyXG4gICAgICBsaW5lICAgID0gJy4uLiAnICsgbGluZVsgYzEgLSB3aWR0aDIgLi4gYzEgKyBoaWxpdGUubGVuZ3RoIC0gKCBjMSAtIGMwICkgKyB3aWR0aDIgXSArICcgLi4uJ1xuICAgIGVsc2VcbiAgICAgIGxpbmUgID0gbGluZVsgLi4gd2lkdGggXVxuICAgIFIucHVzaCAgXCIje2dyZXkgdGhpc19saW5lbnJfdHh0fSN7Y3lhbiBsaW5lfVwiXG4gIHJldHVybiBSXG5cbiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuc2hvd19lcnJvcl93aXRoX3NvdXJjZV9jb250ZXh0ID0gKCBlcnJvciwgaGVhZGxpbmUgKSAtPlxuICBhbGVydCAnXjc3NzY1LTFeJywgcmV2ZXJzZSBib2xkIGhlYWRsaW5lXG4gIGFycm93aGVhZCAgID0gd2hpdGUgJ+KWsidcbiAgYXJyb3dzaGFmdCAgPSB3aGl0ZSAn4pSCJ1xuICB3aWR0aCAgICAgICA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnNcbiAgY2FsbHNpdGVzICAgPSBnZXRfZXJyb3JfY2FsbHNpdGVzIGVycm9yXG4gICMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgaWYgKCBub3QgY2FsbHNpdGVzPyApIG9yICggY2FsbHNpdGVzLmxlbmd0aCBpcyAwIClcbiAgICB3cml0ZV90b19zdGRlcnIgcmVkIHJldmVyc2UgXCJeNDU1NzU2XiBlcnJvciBoYXMgbm8gYXNzb2NpYXRlZCBjYWxsc2l0ZXM6XCJcbiAgICB3cml0ZV90b19zdGRlcnIgcmVkIHJldmVyc2UgcnByIGVycm9yXG4gICAgcmV0dXJuIG51bGxcbiAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBjYWxsc2l0ZXMucmV2ZXJzZSgpXG4gICMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgZm9yIGNhbGxzaXRlIGluIGNhbGxzaXRlc1xuICAgIHBhdGggPSBjYWxsc2l0ZS5nZXRGaWxlTmFtZSgpXG4gICAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgICB1bmxlc3MgcGF0aD9cbiAgICAgIHdyaXRlX3RvX3N0ZGVyciBncmV5ICfigJQnLnJlcGVhdCAxMDhcbiAgICAgIGNvbnRpbnVlXG4gICAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgICBsaW5lbnIgICAgICA9IGNhbGxzaXRlLmdldExpbmVOdW1iZXIoKVxuICAgIGNvbG5yICAgICAgID0gY2FsbHNpdGUuZ2V0Q29sdW1uTnVtYmVyKClcbiAgICAjLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAgIGlmICggcGF0aC5zdGFydHNXaXRoICdub2RlOicgKSBvciAoIHBhdGguc3RhcnRzV2l0aCAnaW50ZXJuYWwvJyApXG4gICAgICB3cml0ZV90b19zdGRlcnIgYXJyb3doZWFkLCBncmV5IFwiI3twYXRofSBAICN7bGluZW5yfSwje2NvbG5yfVwiXG4gICAgICBjb250aW51ZVxuICAgICMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gICAgZm5hbWUgPSBjYWxsc2l0ZS5nZXRGdW5jdGlvbk5hbWUoKSA/IGNhbGxzaXRlLmdldE1ldGhvZE5hbWUoKSA/IG51bGxcbiAgICB7IHBhdGhcbiAgICAgIGxpbmVuclxuICAgICAgY29sbnIgICB9ID0gYXdhaXQgZmV0Y2hfbWFwcGVkX2xvY2F0aW9uIHBhdGgsIGxpbmVuciwgY29sbnJcbiAgICByZWxwYXRoICAgICA9IFBBVEgucmVsYXRpdmUgcHJvY2Vzcy5jd2QoKSwgcGF0aFxuICAgICMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gICAgc3dpdGNoIHRydWVcbiAgICAgIHdoZW4gKCAvXFwvbm9kZV9tb2R1bGVzXFwvLy50ZXN0IHBhdGggKSB0aGVuICBwYXRoX2NvbG9yID0gbW9kdWxlc19wYXRoX2NvbG9yXG4gICAgICB3aGVuICggcmVscGF0aC5zdGFydHNXaXRoICcuLi8nICAgICApIHRoZW4gIHBhdGhfY29sb3IgPSBvdXRzaWRlX3BhdGhfY29sb3JcbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9jb2xvciA9IG93bl9wYXRoX2NvbG9yXG4gICAgIy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgICBpZiBmbmFtZT9cbiAgICAgICMjIyBUQUlOVCB1c2UgcHJvcGVyIG1ldGhvZHMgdG8gZm9ybWF0IHdpdGggbXVsdGlwbGUgY29sb3JzICMjI1xuICAgICAgZm5hbWVfdHh0ID0gc3RlZWwgZm5hbWVcbiAgICAgIHdpZHRoMSAgICA9IHdpZHRoICsgKCBmbmFtZV90eHQubGVuZ3RoIC0gZm5hbWUubGVuZ3RoIClcbiAgICAgIHdyaXRlX3RvX3N0ZGVyciBhcnJvd2hlYWQsIHBhdGhfY29sb3IgKCBcIiN7cmVscGF0aH0gQCAje2xpbmVucn0sI3tjb2xucn06ICN7Zm5hbWVfdHh0fSgpIFxceDFiWzM4OzA1OzIzNG1cIi5wYWRFbmQgd2lkdGgxLCAn4oCUJyApXG4gICAgZWxzZVxuICAgICAgd3JpdGVfdG9fc3RkZXJyIGFycm93aGVhZCwgcGF0aF9jb2xvciAoIFwiI3tyZWxwYXRofSBAICN7bGluZW5yfSwje2NvbG5yfTogXFx4MWJbMzg7MDU7MjM0bVwiLnBhZEVuZCB3aWR0aCwgJ+KAlCcgKVxuICAgIGZvciBjb250ZXh0X2xpbmUgaW4gYXdhaXQgZ2V0X2NvbnRleHQgcGF0aCwgbGluZW5yLCBjb2xuciwgd2lkdGhcbiAgICAgIHdyaXRlX3RvX3N0ZGVyciBhcnJvd3NoYWZ0LCBjb250ZXh0X2xpbmVcbiAgYWxlcnQgJ143Nzc2NS0yXicsIHJldmVyc2UgYm9sZCBoZWFkbGluZVxuICByZXR1cm4gbnVsbFxuXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbl9leGl0X2hhbmRsZXIgPSAoIGVycm9yLCBvcmlnaW4gKSAtPlxuICAjIyMgVEFJTlQgb3JpZ2luIG5ldmVyIHVzZWQgIyMjXG4gIHR5cGUgICAgPSBlcnJvci5jb2RlID8gZXJyb3IubmFtZSA/ICdFWENFUFRJT04nXG4gIG1lc3NhZ2UgPSBcIiAje3R5cGV9OiBcIiArICggZXJyb3I/Lm1lc3NhZ2UgPyBcImFuIHVucmVjb3ZlcmFibGUgY29uZGl0aW9uIG9jY3VycmVkXCIgKVxuICBhd2FpdCBzaG93X2Vycm9yX3dpdGhfc291cmNlX2NvbnRleHQgZXJyb3IsIG1lc3NhZ2VcbiAgcmV0dXJuIG51bGxcblxuIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leGl0X2hhbmRsZXIgPSAoIGVycm9yLCBvcmlnaW4gKSAtPlxuICBhd2FpdCBfZXhpdF9oYW5kbGVyIGVycm9yLCBvcmlnaW5cbiAgc2V0SW1tZWRpYXRlICggLT4gcHJvY2Vzcy5leGl0IDExMSApXG4gIHJldHVybiBudWxsXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbnVubGVzcyBnbG9iYWxbIFN5bWJvbC5mb3IgJ2NuZC1leGNlcHRpb24taGFuZGxlcicgXT9cbiAgbnVsbFxuICBnbG9iYWxbIFN5bWJvbC5mb3IgJ2NuZC1leGNlcHRpb24taGFuZGxlcicgXSA9IHRydWVcbiAgcHJvY2Vzcy5vbmNlICd1bmNhdWdodEV4Y2VwdGlvbicsICBleGl0X2hhbmRsZXJcbiAgcHJvY2Vzcy5vbmNlICd1bmhhbmRsZWRSZWplY3Rpb24nLCBleGl0X2hhbmRsZXJcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm1vZHVsZS5leHBvcnRzID0geyBleGl0X2hhbmRsZXIsIF9leGl0X2hhbmRsZXIsIH1cblxuIl19
220
- //# sourceURL=../src/main.coffee
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21haW4uY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBO0VBQUE7QUFBQSxNQUFBLFNBQUEsRUFBQSxZQUFBLEVBQUEsWUFBQSxFQUFBLGVBQUE7Ozs7O0VBTUEsU0FBQSxHQUE0QixPQUFBLENBQVEsK0JBQVI7O0VBQzVCLENBQUEsQ0FBRSxZQUFGLENBQUEsR0FBNEIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBbkIsQ0FBQSxDQUE1QixFQVBBOzs7RUFVQSxlQUFBLEdBQWtCLFFBQUEsQ0FBRSxJQUFGLENBQUE7V0FBWSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQWYsQ0FBcUIsSUFBQSxHQUFPLElBQTVCO0VBQVosRUFWbEI7OztFQWFBLFlBQUEsR0FBZSxRQUFBLENBQUUsS0FBRixFQUFTLE1BQVQsQ0FBQSxFQUFBOztJQUViLGVBQUEsQ0FBZ0IsWUFBQSxDQUFhLEtBQWIsQ0FBaEI7SUFDQSxZQUFBLENBQWEsQ0FBRSxRQUFBLENBQUEsQ0FBQTthQUFHLE9BQU8sQ0FBQyxJQUFSLENBQWEsR0FBYjtJQUFILENBQUYsQ0FBYjtBQUNBLFdBQU87RUFKTSxFQWJmOzs7RUFzQkEsSUFBTyxtREFBUDtJQUNFO0lBQ0EsTUFBTSxDQUFFLE1BQU0sQ0FBQyxHQUFQLENBQVcsdUJBQVgsQ0FBRixDQUFOLEdBQStDO0lBQy9DLE9BQU8sQ0FBQyxJQUFSLENBQWEsbUJBQWIsRUFBbUMsWUFBbkM7SUFDQSxPQUFPLENBQUMsSUFBUixDQUFhLG9CQUFiLEVBQW1DLFlBQW5DLEVBSkY7R0F0QkE7OztFQThCQSxNQUFNLENBQUMsT0FBUCxHQUFpQixDQUFFLFlBQUY7QUE5QmpCIiwic291cmNlc0NvbnRlbnQiOlsiXG4ndXNlIHN0cmljdCdcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgYmx1ZSAgICAjINCh0LvQsNCy0LAg0KPQutGA0LDRl9C90ZZcbiMgeWVsbG93ICAjINCh0LvQsNCy0LAg0KPQutGA0LDRl9C90ZZcblNGTU9EVUxFUyAgICAgICAgICAgICAgICAgPSByZXF1aXJlICdicmljYWJyYWMtc2luZ2xlLWZpbGUtbW9kdWxlcydcbnsgZm9ybWF0X3N0YWNrLCAgICAgICAgIH0gPSBTRk1PRFVMRVMudW5zdGFibGUucmVxdWlyZV9mb3JtYXRfc3RhY2soKVxuXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbndyaXRlX3RvX3N0ZGVyciA9ICggdGV4dCApIC0+IHByb2Nlc3Muc3RkZXJyLndyaXRlIHRleHQgKyAnXFxuJ1xuXG4jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmV4aXRfaGFuZGxlciA9ICggZXJyb3IsIG9yaWdpbiApIC0+XG4gICMgX2V4aXRfaGFuZGxlciBlcnJvciwgb3JpZ2luXG4gIHdyaXRlX3RvX3N0ZGVyciBmb3JtYXRfc3RhY2sgZXJyb3JcbiAgc2V0SW1tZWRpYXRlICggLT4gcHJvY2Vzcy5leGl0IDExMSApXG4gIHJldHVybiBudWxsXG5cblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbnVubGVzcyBnbG9iYWxbIFN5bWJvbC5mb3IgJ2NuZC1leGNlcHRpb24taGFuZGxlcicgXT9cbiAgbnVsbFxuICBnbG9iYWxbIFN5bWJvbC5mb3IgJ2NuZC1leGNlcHRpb24taGFuZGxlcicgXSA9IHRydWVcbiAgcHJvY2Vzcy5vbmNlICd1bmNhdWdodEV4Y2VwdGlvbicsICBleGl0X2hhbmRsZXJcbiAgcHJvY2Vzcy5vbmNlICd1bmhhbmRsZWRSZWplY3Rpb24nLCBleGl0X2hhbmRsZXJcblxuXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbm1vZHVsZS5leHBvcnRzID0geyBleGl0X2hhbmRsZXIsIH1cblxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodexh",
3
- "version": "3.2.0",
3
+ "version": "4.0.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": {
@@ -23,9 +23,7 @@
23
23
  },
24
24
  "homepage": "https://github.com/loveencounterflow/nodexh",
25
25
  "dependencies": {
26
- "error-callsites": "^2.0.3",
27
- "guy": "^13.7.1",
28
- "load-source-map": "3.0.1"
26
+ "bricabrac-single-file-modules": "^0.6.0"
29
27
  },
30
28
  "scripts": {
31
29
  "build": "coffee --map -o lib -c src"
package/src/main.coffee CHANGED
@@ -3,155 +3,18 @@
3
3
 
4
4
 
5
5
  ############################################################################################################
6
- GUY = require 'guy'
7
- { alert
8
- debug } = GUY.trm.get_loggers 'NODEXH'
9
- { rpr
10
- inspect
11
- echo
12
- log } = GUY.trm
13
- get_error_callsites = require 'error-callsites'
14
- load_source_map = ( require 'util' ).promisify ( require 'load-source-map' )
15
- FS = require 'fs'
16
- PATH = require 'path'
17
- { red
18
- green
19
- steel
20
- cyan
21
- bold
22
- lime
23
- gold
24
- white
25
- plum
26
- orange
27
- blue # Слава Україні
28
- yellow # Слава Україні
29
- reverse
30
- underline
31
- bold } = GUY.trm
32
- grey = GUY.trm.BASE1
33
-
34
-
35
- #-----------------------------------------------------------------------------------------------------------
36
- modules_path_color = ( P... ) -> reverse bold orange '', P..., ''
37
- outside_path_color = ( P... ) -> reverse bold plum '', P..., ''
38
- own_path_color = ( P... ) -> reverse bold lime '', P..., ''
39
-
40
- #-----------------------------------------------------------------------------------------------------------
41
- write_to_stderr = ( P... ) -> process.stderr.write ' ' + ( GUY.trm.pen P... ) + '\n'
42
-
43
- #-----------------------------------------------------------------------------------------------------------
44
- fetch_mapped_location = ( path, linenr, colnr ) ->
45
- try
46
- sourcemap = await load_source_map path
47
- smp = sourcemap.originalPositionFor { line: linenr, column: colnr, }
48
- catch error
49
- return { path, linenr, colnr, }
50
- #.........................................................................................................
51
- if ( smp? ) and ( smp.source? ) and ( smp.source isnt '' ) and ( smp.line? ) and ( smp.column? )
52
- mapped_path = PATH.join ( PATH.dirname path ), smp.source
53
- return { path: mapped_path, linenr: smp.line, colnr: smp.column, }
54
- #.........................................................................................................
55
- return { path, linenr, colnr, }
6
+ # blue # Слава Україні
7
+ # yellow # Слава Україні
8
+ SFMODULES = require 'bricabrac-single-file-modules'
9
+ { format_stack, } = SFMODULES.unstable.require_format_stack()
56
10
 
57
11
  #-----------------------------------------------------------------------------------------------------------
58
- get_context = ( path, linenr, colnr, width ) ->
59
- try return ( _get_context path, linenr, colnr, width ) catch error
60
- throw error unless error.code is 'ENOENT'
61
- return []
62
-
63
- #-----------------------------------------------------------------------------------------------------------
64
- _get_context = ( path, linenr, colnr, width ) ->
65
- lines = ( FS.readFileSync path, { encoding: 'utf-8' } ).split '\n'
66
- delta = 1
67
- coldelta = 5
68
- effect = reverse
69
- first_idx = Math.max 0, linenr - 1 - delta
70
- last_idx = Math.min lines.length - 1, linenr - 1 + delta
71
- R = []
72
- for line, idx in lines[ first_idx .. last_idx ]
73
- this_linenr = first_idx + idx + 1
74
- this_linenr_txt = ( this_linenr.toString().padStart 4 ) + '│ '
75
- if this_linenr isnt linenr
76
- ### TAINT should adjust overlong context lines as well ###
77
- R.push "#{grey this_linenr_txt}#{grey line}"
78
- continue
79
- ### TAINT perform line length adjustment, hiliting in dedicated method ###
80
- c0 = colnr - 1
81
- c1 = colnr + coldelta
82
- hilite = effect line[ c0 ... c1 ]
83
- line = line[ ... c0 ] + hilite + line[ c1 .. ]
84
- if c1 > width
85
- width2 = Math.floor width / 2
86
- line = '... ' + line[ c1 - width2 .. c1 + hilite.length - ( c1 - c0 ) + width2 ] + ' ...'
87
- else
88
- line = line[ .. width ]
89
- R.push "#{grey this_linenr_txt}#{cyan line}"
90
- return R
91
-
92
- #-----------------------------------------------------------------------------------------------------------
93
- show_error_with_source_context = ( error, headline ) ->
94
- alert '^77765-1^', reverse bold headline
95
- arrowhead = white '▲'
96
- arrowshaft = white '│'
97
- width = process.stdout.columns
98
- callsites = get_error_callsites error
99
- #.........................................................................................................
100
- if ( not callsites? ) or ( callsites.length is 0 )
101
- write_to_stderr red reverse "^455756^ error has no associated callsites:"
102
- write_to_stderr red reverse rpr error
103
- return null
104
- #.........................................................................................................
105
- callsites.reverse()
106
- #.........................................................................................................
107
- for callsite in callsites
108
- path = callsite.getFileName()
109
- #.......................................................................................................
110
- unless path?
111
- write_to_stderr grey '—'.repeat 108
112
- continue
113
- #.......................................................................................................
114
- linenr = callsite.getLineNumber()
115
- colnr = callsite.getColumnNumber()
116
- #.......................................................................................................
117
- if ( path.startsWith 'node:' ) or ( path.startsWith 'internal/' )
118
- write_to_stderr arrowhead, grey "#{path} @ #{linenr},#{colnr}"
119
- continue
120
- #.......................................................................................................
121
- fname = callsite.getFunctionName() ? callsite.getMethodName() ? null
122
- { path
123
- linenr
124
- colnr } = await fetch_mapped_location path, linenr, colnr
125
- relpath = PATH.relative process.cwd(), path
126
- #.......................................................................................................
127
- switch true
128
- when ( /\/node_modules\//.test path ) then path_color = modules_path_color
129
- when ( relpath.startsWith '../' ) then path_color = outside_path_color
130
- else path_color = own_path_color
131
- #.......................................................................................................
132
- if fname?
133
- ### TAINT use proper methods to format with multiple colors ###
134
- fname_txt = steel fname
135
- width1 = width + ( fname_txt.length - fname.length )
136
- write_to_stderr arrowhead, path_color ( "#{relpath} @ #{linenr},#{colnr}: #{fname_txt}() \x1b[38;05;234m".padEnd width1, '—' )
137
- else
138
- write_to_stderr arrowhead, path_color ( "#{relpath} @ #{linenr},#{colnr}: \x1b[38;05;234m".padEnd width, '—' )
139
- for context_line in await get_context path, linenr, colnr, width
140
- write_to_stderr arrowshaft, context_line
141
- alert '^77765-2^', reverse bold headline
142
- return null
143
-
144
- #-----------------------------------------------------------------------------------------------------------
145
- _exit_handler = ( error, origin ) ->
146
- ### TAINT origin never used ###
147
- type = error.code ? error.name ? 'EXCEPTION'
148
- message = " #{type}: " + ( error?.message ? "an unrecoverable condition occurred" )
149
- await show_error_with_source_context error, message
150
- return null
12
+ write_to_stderr = ( text ) -> process.stderr.write text + '\n'
151
13
 
152
14
  #-----------------------------------------------------------------------------------------------------------
153
15
  exit_handler = ( error, origin ) ->
154
- await _exit_handler error, origin
16
+ # _exit_handler error, origin
17
+ write_to_stderr format_stack error
155
18
  setImmediate ( -> process.exit 111 )
156
19
  return null
157
20
 
@@ -166,5 +29,5 @@ unless global[ Symbol.for 'cnd-exception-handler' ]?
166
29
 
167
30
 
168
31
  ############################################################################################################
169
- module.exports = { exit_handler, _exit_handler, }
32
+ module.exports = { exit_handler, }
170
33