nodexh 3.2.0 → 4.0.0
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/lib/main.js +12 -192
- package/package.json +2 -4
- package/src/main.coffee +8 -145
package/lib/main.js
CHANGED
|
@@ -1,202 +1,23 @@
|
|
|
1
1
|
(function() {
|
|
2
2
|
'use strict';
|
|
3
|
-
var
|
|
3
|
+
var SFMODULES, exit_handler, format_stack, write_to_stderr;
|
|
4
4
|
|
|
5
5
|
//###########################################################################################################
|
|
6
|
-
|
|
6
|
+
// blue # Слава Україні
|
|
7
|
+
// yellow # Слава Україні
|
|
8
|
+
SFMODULES = require('bricabrac-single-file-modules');
|
|
7
9
|
|
|
8
|
-
({
|
|
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(
|
|
39
|
-
return process.stderr.write(
|
|
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 =
|
|
199
|
-
|
|
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
|
|
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
|
+
"version": "4.0.0",
|
|
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
|
-
"
|
|
27
|
-
"guy": "^13.7.1",
|
|
28
|
-
"load-source-map": "3.0.1"
|
|
26
|
+
"bricabrac-single-file-modules": "^0.5.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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
{
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
32
|
+
module.exports = { exit_handler, }
|
|
170
33
|
|