@jdeighan/coffee-utils 7.0.33 → 7.0.36
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/package.json +1 -1
- package/src/coffee_utils.coffee +55 -1
- package/src/coffee_utils.js +53 -2
- package/src/debug_utils.coffee +2 -2
- package/src/debug_utils.js +2 -2
- package/src/indent_utils.coffee +3 -3
- package/src/indent_utils.js +3 -2
package/package.json
CHANGED
package/src/coffee_utils.coffee
CHANGED
|
@@ -5,6 +5,14 @@ export sep_eq = '='.repeat(42)
|
|
|
5
5
|
`export const undef = undefined`
|
|
6
6
|
LOG = (lArgs...) -> console.log lArgs... # synonym for console.log()
|
|
7
7
|
|
|
8
|
+
export doHaltOnError = false
|
|
9
|
+
|
|
10
|
+
# ---------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
export haltOnError = () ->
|
|
13
|
+
|
|
14
|
+
doHaltOnError = true
|
|
15
|
+
|
|
8
16
|
# ---------------------------------------------------------------------------
|
|
9
17
|
# pass - do nothing
|
|
10
18
|
|
|
@@ -15,8 +23,37 @@ export pass = () ->
|
|
|
15
23
|
|
|
16
24
|
export error = (message) ->
|
|
17
25
|
|
|
26
|
+
if doHaltOnError
|
|
27
|
+
console.trace("ERROR: #{message}")
|
|
28
|
+
process.exit()
|
|
18
29
|
throw new Error(message)
|
|
19
30
|
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
getCallers = (stackTrace, lExclude=[]) ->
|
|
34
|
+
|
|
35
|
+
iter = stackTrace.matchAll(///
|
|
36
|
+
at
|
|
37
|
+
\s+
|
|
38
|
+
(?:
|
|
39
|
+
async
|
|
40
|
+
\s+
|
|
41
|
+
)?
|
|
42
|
+
([^\s(]+)
|
|
43
|
+
///g)
|
|
44
|
+
if !iter
|
|
45
|
+
return ["<unknown>"]
|
|
46
|
+
|
|
47
|
+
lCallers = []
|
|
48
|
+
for lMatches from iter
|
|
49
|
+
[_, caller] = lMatches
|
|
50
|
+
if (caller.indexOf('file://') == 0)
|
|
51
|
+
break
|
|
52
|
+
if caller not in lExclude
|
|
53
|
+
lCallers.push caller
|
|
54
|
+
|
|
55
|
+
return lCallers
|
|
56
|
+
|
|
20
57
|
# ---------------------------------------------------------------------------
|
|
21
58
|
# assert - mimic nodejs's assert
|
|
22
59
|
# return true so we can use it in boolean expressions
|
|
@@ -24,7 +61,24 @@ export error = (message) ->
|
|
|
24
61
|
export assert = (cond, msg) ->
|
|
25
62
|
|
|
26
63
|
if ! cond
|
|
27
|
-
|
|
64
|
+
# try
|
|
65
|
+
# throw new Error()
|
|
66
|
+
# catch e
|
|
67
|
+
# stackTrace = e.stack
|
|
68
|
+
stackTrace = new Error().stack
|
|
69
|
+
lCallers = getCallers(stackTrace, ['assert'])
|
|
70
|
+
|
|
71
|
+
# console.log 'STACK'
|
|
72
|
+
# console.log stackTrace
|
|
73
|
+
console.log '--------------------'
|
|
74
|
+
console.log 'CALL STACK:'
|
|
75
|
+
for caller in lCallers
|
|
76
|
+
console.log " #{caller}"
|
|
77
|
+
console.log '--------------------'
|
|
78
|
+
console.log "ERROR: #{msg} (in #{lCallers[0]}())"
|
|
79
|
+
if doHaltOnError
|
|
80
|
+
process.exit()
|
|
81
|
+
error msg
|
|
28
82
|
return true
|
|
29
83
|
|
|
30
84
|
# ---------------------------------------------------------------------------
|
package/src/coffee_utils.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Generated by CoffeeScript 2.6.1
|
|
2
|
-
// coffee_utils.coffee
|
|
3
|
-
var LOG
|
|
2
|
+
// coffee_utils.coffee
|
|
3
|
+
var LOG, getCallers,
|
|
4
|
+
indexOf = [].indexOf;
|
|
4
5
|
|
|
5
6
|
export var sep_dash = '-'.repeat(42);
|
|
6
7
|
|
|
@@ -12,6 +13,12 @@ LOG = function(...lArgs) {
|
|
|
12
13
|
return console.log(...lArgs); // synonym for console.log()
|
|
13
14
|
};
|
|
14
15
|
|
|
16
|
+
export var doHaltOnError = false;
|
|
17
|
+
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
export var haltOnError = function() {
|
|
20
|
+
return doHaltOnError = true;
|
|
21
|
+
};
|
|
15
22
|
|
|
16
23
|
// ---------------------------------------------------------------------------
|
|
17
24
|
// pass - do nothing
|
|
@@ -20,14 +27,58 @@ export var pass = function() {};
|
|
|
20
27
|
// ---------------------------------------------------------------------------
|
|
21
28
|
// error - throw an error
|
|
22
29
|
export var error = function(message) {
|
|
30
|
+
if (doHaltOnError) {
|
|
31
|
+
console.trace(`ERROR: ${message}`);
|
|
32
|
+
process.exit();
|
|
33
|
+
}
|
|
23
34
|
throw new Error(message);
|
|
24
35
|
};
|
|
25
36
|
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
getCallers = function(stackTrace, lExclude = []) {
|
|
39
|
+
var _, caller, iter, lCallers, lMatches;
|
|
40
|
+
iter = stackTrace.matchAll(/at\s+(?:async\s+)?([^\s(]+)/g);
|
|
41
|
+
if (!iter) {
|
|
42
|
+
return ["<unknown>"];
|
|
43
|
+
}
|
|
44
|
+
lCallers = [];
|
|
45
|
+
for (lMatches of iter) {
|
|
46
|
+
[_, caller] = lMatches;
|
|
47
|
+
if (caller.indexOf('file://') === 0) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
if (indexOf.call(lExclude, caller) < 0) {
|
|
51
|
+
lCallers.push(caller);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return lCallers;
|
|
55
|
+
};
|
|
56
|
+
|
|
26
57
|
// ---------------------------------------------------------------------------
|
|
27
58
|
// assert - mimic nodejs's assert
|
|
28
59
|
// return true so we can use it in boolean expressions
|
|
29
60
|
export var assert = function(cond, msg) {
|
|
61
|
+
var caller, i, lCallers, len, stackTrace;
|
|
30
62
|
if (!cond) {
|
|
63
|
+
// try
|
|
64
|
+
// throw new Error()
|
|
65
|
+
// catch e
|
|
66
|
+
// stackTrace = e.stack
|
|
67
|
+
stackTrace = new Error().stack;
|
|
68
|
+
lCallers = getCallers(stackTrace, ['assert']);
|
|
69
|
+
// console.log 'STACK'
|
|
70
|
+
// console.log stackTrace
|
|
71
|
+
console.log('--------------------');
|
|
72
|
+
console.log('CALL STACK:');
|
|
73
|
+
for (i = 0, len = lCallers.length; i < len; i++) {
|
|
74
|
+
caller = lCallers[i];
|
|
75
|
+
console.log(` ${caller}`);
|
|
76
|
+
}
|
|
77
|
+
console.log('--------------------');
|
|
78
|
+
console.log(`ERROR: ${msg} (in ${lCallers[0]}())`);
|
|
79
|
+
if (doHaltOnError) {
|
|
80
|
+
process.exit();
|
|
81
|
+
}
|
|
31
82
|
error(msg);
|
|
32
83
|
}
|
|
33
84
|
return true;
|
package/src/debug_utils.coffee
CHANGED
|
@@ -176,12 +176,12 @@ export debug = (lArgs...) ->
|
|
|
176
176
|
switch type
|
|
177
177
|
when 'enter'
|
|
178
178
|
log label, hOptions
|
|
179
|
-
if
|
|
179
|
+
if (nArgs==2)
|
|
180
180
|
# --- don't repeat the label
|
|
181
181
|
logItem undef, item, hOptions
|
|
182
182
|
when 'return'
|
|
183
183
|
log label, hOptions
|
|
184
|
-
if
|
|
184
|
+
if (nArgs==2)
|
|
185
185
|
# --- don't repeat the label
|
|
186
186
|
logItem undef, item, hOptions
|
|
187
187
|
when 'string'
|
package/src/debug_utils.js
CHANGED
|
@@ -186,14 +186,14 @@ export var debug = function(...lArgs) {
|
|
|
186
186
|
switch (type) {
|
|
187
187
|
case 'enter':
|
|
188
188
|
log(label, hOptions);
|
|
189
|
-
if (
|
|
189
|
+
if (nArgs === 2) {
|
|
190
190
|
// --- don't repeat the label
|
|
191
191
|
logItem(undef, item, hOptions);
|
|
192
192
|
}
|
|
193
193
|
break;
|
|
194
194
|
case 'return':
|
|
195
195
|
log(label, hOptions);
|
|
196
|
-
if (
|
|
196
|
+
if (nArgs === 2) {
|
|
197
197
|
// --- don't repeat the label
|
|
198
198
|
logItem(undef, item, hOptions);
|
|
199
199
|
}
|
package/src/indent_utils.coffee
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# indent_utils.coffee
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
assert, undef, error, escapeStr,
|
|
4
|
+
assert, undef, error, escapeStr, defined,
|
|
5
5
|
OL, isInteger, isString, isArray, isEmpty, rtrim,
|
|
6
6
|
} from '@jdeighan/coffee-utils'
|
|
7
7
|
import {arrayToBlock, blockToArray} from '@jdeighan/coffee-utils/block'
|
|
@@ -68,7 +68,7 @@ export indented = (input, level=1) ->
|
|
|
68
68
|
|
|
69
69
|
export undented = (text, level=undef) ->
|
|
70
70
|
|
|
71
|
-
if level
|
|
71
|
+
if defined(level) && (level==0)
|
|
72
72
|
return text
|
|
73
73
|
|
|
74
74
|
if isString(text)
|
|
@@ -85,7 +85,7 @@ export undented = (text, level=undef) ->
|
|
|
85
85
|
error "undented(): Not an array or string: #{OL(text)}"
|
|
86
86
|
|
|
87
87
|
# --- determine what to remove from beginning of each line
|
|
88
|
-
if level
|
|
88
|
+
if defined(level)
|
|
89
89
|
assert isInteger(level), "undented(): level must be an integer"
|
|
90
90
|
toRemove = indentation(level)
|
|
91
91
|
else
|
package/src/indent_utils.js
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
undef,
|
|
6
6
|
error,
|
|
7
7
|
escapeStr,
|
|
8
|
+
defined,
|
|
8
9
|
OL,
|
|
9
10
|
isInteger,
|
|
10
11
|
isString,
|
|
@@ -86,7 +87,7 @@ export var indented = function(input, level = 1) {
|
|
|
86
87
|
// - returns same type as text, i.e. either string or array
|
|
87
88
|
export var undented = function(text, level = undef) {
|
|
88
89
|
var i, j, lLines, lMatches, lNewLines, len, len1, line, nToRemove, toRemove;
|
|
89
|
-
if ((level
|
|
90
|
+
if (defined(level) && (level === 0)) {
|
|
90
91
|
return text;
|
|
91
92
|
}
|
|
92
93
|
if (isString(text)) {
|
|
@@ -107,7 +108,7 @@ export var undented = function(text, level = undef) {
|
|
|
107
108
|
error(`undented(): Not an array or string: ${OL(text)}`);
|
|
108
109
|
}
|
|
109
110
|
// --- determine what to remove from beginning of each line
|
|
110
|
-
if (level
|
|
111
|
+
if (defined(level)) {
|
|
111
112
|
assert(isInteger(level), "undented(): level must be an integer");
|
|
112
113
|
toRemove = indentation(level);
|
|
113
114
|
} else {
|