@jdeighan/coffee-utils 4.1.34 → 5.0.1

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "4.1.34",
4
+ "version": "5.0.1",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
@@ -15,9 +15,9 @@
15
15
  "./stack": "./src/call_stack.js",
16
16
  "./debug": "./src/debug_utils.js",
17
17
  "./svelte": "./src/svelte_utils.js",
18
- "./test": "./src/UnitTester.js",
19
18
  "./store": "./src/DataStores.js",
20
19
  "./taml": "./src/taml.js",
20
+ "./templib": "./src/templib.js",
21
21
  "./package.json": "./package.json"
22
22
  },
23
23
  "engines": {
@@ -29,7 +29,7 @@
29
29
  "scripts": {
30
30
  "build": "cls && rm -f ./src/*.js && coffee -c ./src",
31
31
  "pretest": "cls && cielo -qfc ./test && coffee -c .",
32
- "test": "ava ./test/*.test.js",
32
+ "test": "npx ava ./test/*.test.js",
33
33
  "prefinaltest": "npm run pretest",
34
34
  "finaltest": "cross-env FINALTEST=yes ava ./test/*.test.js"
35
35
  },
@@ -47,10 +47,12 @@
47
47
  },
48
48
  "homepage": "https://github.com/johndeighan/coffee-utils#readme",
49
49
  "dependencies": {
50
- "ava": "^3.15.0",
51
50
  "cross-env": "^7.0.3",
52
51
  "js-yaml": "^4.1.0",
53
52
  "readline-sync": "^1.4.10",
54
- "svelte": "^3.46.3"
53
+ "svelte": "^3.46.4"
54
+ },
55
+ "devDependencies": {
56
+ "@jdeighan/unit-tester": "^1.0.4"
55
57
  }
56
58
  }
@@ -11,6 +11,7 @@ import {log} from '@jdeighan/coffee-utils/log'
11
11
  import {
12
12
  withExt, slurp, barf, newerDestFileExists,
13
13
  } from '@jdeighan/coffee-utils/fs'
14
+ import {untabify} from '@jdeighan/coffee-utils/indent'
14
15
 
15
16
  # ---------------------------------------------------------------------------
16
17
 
package/src/DataStores.js CHANGED
@@ -30,6 +30,10 @@ import {
30
30
  newerDestFileExists
31
31
  } from '@jdeighan/coffee-utils/fs';
32
32
 
33
+ import {
34
+ untabify
35
+ } from '@jdeighan/coffee-utils/indent';
36
+
33
37
  // ---------------------------------------------------------------------------
34
38
  export var WritableDataStore = class WritableDataStore {
35
39
  constructor(value = undef) {
@@ -6,7 +6,6 @@ import readline from 'readline'
6
6
  import {
7
7
  assert, isEmpty, isString, nonEmpty, error, isComment, rtrim,
8
8
  } from '@jdeighan/coffee-utils'
9
- import {log} from '@jdeighan/coffee-utils/log'
10
9
 
11
10
  # ---------------------------------------------------------------------------
12
11
  # blockToArray - split a block into lines
@@ -14,10 +14,6 @@ import {
14
14
  rtrim
15
15
  } from '@jdeighan/coffee-utils';
16
16
 
17
- import {
18
- log
19
- } from '@jdeighan/coffee-utils/log';
20
-
21
17
  // ---------------------------------------------------------------------------
22
18
  // blockToArray - split a block into lines
23
19
  export var blockToArray = function(block) {
@@ -1,7 +1,5 @@
1
1
  # coffee_utils.coffee
2
2
 
3
- import {log} from '@jdeighan/coffee-utils/log'
4
-
5
3
  export sep_dash = '-'.repeat(42)
6
4
  export sep_eq = '='.repeat(42)
7
5
  `export const undef = undefined`
@@ -32,13 +30,15 @@ export assert = (cond, msg) ->
32
30
 
33
31
  export croak = (err, label, obj) ->
34
32
 
35
- message = if (typeof err == 'object') then err.message else err
36
- log "ERROR (croak): #{message}"
37
- log label, obj
38
- if (typeof err == 'object')
39
- throw err
40
- else
41
- throw new Error(message)
33
+ curmsg = if isString(err) then err else err.message
34
+ newmsg = """
35
+ ERROR (croak): #{curmsg}
36
+ #{label}:
37
+ #{JSON.stringify(obj)}
38
+ """
39
+
40
+ # --- re-throw the error
41
+ throw new Error(newmsg)
42
42
 
43
43
  # ---------------------------------------------------------------------------
44
44
 
@@ -227,7 +227,7 @@ export uniq = (lItems) ->
227
227
 
228
228
  export warn = (message) ->
229
229
 
230
- log "WARNING: #{message}"
230
+ say "WARNING: #{message}"
231
231
 
232
232
  # ---------------------------------------------------------------------------
233
233
  # hashToStr - stringify a hash
@@ -301,24 +301,17 @@ export deepCopy = (obj) ->
301
301
  # ---------------------------------------------------------------------------
302
302
  # escapeStr - escape newlines, TAB chars, etc.
303
303
 
304
- export escapeStr = (str, hEscape=undef) ->
304
+ export hDefEsc = {
305
+ "\n": '®'
306
+ "\t": '→'
307
+ " ": '˳'
308
+ }
305
309
 
306
- if ! isString(str)
307
- croak "escapeStr(): not a string", str, 'STRING'
308
- if hEscape?
309
- lParts = for ch in str.split('')
310
- if hEscape[ch]?
311
- hEscape[ch]
312
- else
313
- ch
314
- else
315
- lParts = for ch in str.split('')
316
- if ch == '\n'
317
- '\\n'
318
- else if ch == '\t'
319
- '\\t'
320
- else
321
- ch
310
+ export escapeStr = (str, hEscape=hDefEsc) ->
311
+
312
+ assert isString(str), "escapeStr(): not a string"
313
+ lParts = for ch in str.split('')
314
+ if hEscape[ch]? then hEscape[ch] else ch
322
315
  return lParts.join('')
323
316
 
324
317
  # ---------------------------------------------------------------------------
@@ -2,10 +2,6 @@
2
2
  // coffee_utils.coffee
3
3
  var commentRegExp;
4
4
 
5
- import {
6
- log
7
- } from '@jdeighan/coffee-utils/log';
8
-
9
5
  export var sep_dash = '-'.repeat(42);
10
6
 
11
7
  export var sep_eq = '='.repeat(42);
@@ -33,15 +29,13 @@ export var assert = function(cond, msg) {
33
29
  // ---------------------------------------------------------------------------
34
30
  // croak - throws an error after possibly printing useful info
35
31
  export var croak = function(err, label, obj) {
36
- var message;
37
- message = (typeof err === 'object') ? err.message : err;
38
- log(`ERROR (croak): ${message}`);
39
- log(label, obj);
40
- if (typeof err === 'object') {
41
- throw err;
42
- } else {
43
- throw new Error(message);
44
- }
32
+ var curmsg, newmsg;
33
+ curmsg = isString(err) ? err : err.message;
34
+ newmsg = `ERROR (croak): ${curmsg}
35
+ ${label}:
36
+ ${JSON.stringify(obj)}`;
37
+ // --- re-throw the error
38
+ throw new Error(newmsg);
45
39
  };
46
40
 
47
41
  // ---------------------------------------------------------------------------
@@ -229,7 +223,7 @@ export var uniq = function(lItems) {
229
223
  // ---------------------------------------------------------------------------
230
224
  // warn - issue a warning
231
225
  export var warn = function(message) {
232
- return log(`WARNING: ${message}`);
226
+ return say(`WARNING: ${message}`);
233
227
  };
234
228
 
235
229
  // ---------------------------------------------------------------------------
@@ -298,44 +292,29 @@ export var deepCopy = function(obj) {
298
292
 
299
293
  // ---------------------------------------------------------------------------
300
294
  // escapeStr - escape newlines, TAB chars, etc.
301
- export var escapeStr = function(str, hEscape = undef) {
295
+ export var hDefEsc = {
296
+ "\n": '®',
297
+ "\t": '→',
298
+ " ": '˳'
299
+ };
300
+
301
+ export var escapeStr = function(str, hEscape = hDefEsc) {
302
302
  var ch, lParts;
303
- if (!isString(str)) {
304
- croak("escapeStr(): not a string", str, 'STRING');
305
- }
306
- if (hEscape != null) {
307
- lParts = (function() {
308
- var i, len, ref, results;
309
- ref = str.split('');
310
- results = [];
311
- for (i = 0, len = ref.length; i < len; i++) {
312
- ch = ref[i];
313
- if (hEscape[ch] != null) {
314
- results.push(hEscape[ch]);
315
- } else {
316
- results.push(ch);
317
- }
318
- }
319
- return results;
320
- })();
321
- } else {
322
- lParts = (function() {
323
- var i, len, ref, results;
324
- ref = str.split('');
325
- results = [];
326
- for (i = 0, len = ref.length; i < len; i++) {
327
- ch = ref[i];
328
- if (ch === '\n') {
329
- results.push('\\n');
330
- } else if (ch === '\t') {
331
- results.push('\\t');
332
- } else {
333
- results.push(ch);
334
- }
303
+ assert(isString(str), "escapeStr(): not a string");
304
+ lParts = (function() {
305
+ var i, len, ref, results;
306
+ ref = str.split('');
307
+ results = [];
308
+ for (i = 0, len = ref.length; i < len; i++) {
309
+ ch = ref[i];
310
+ if (hEscape[ch] != null) {
311
+ results.push(hEscape[ch]);
312
+ } else {
313
+ results.push(ch);
335
314
  }
336
- return results;
337
- })();
338
- }
315
+ }
316
+ return results;
317
+ })();
339
318
  return lParts.join('');
340
319
  };
341
320
 
@@ -1,14 +1,18 @@
1
1
  # debug_utils.coffee
2
2
 
3
3
  import {
4
- assert, undef, error, croak, warn, isString, isFunction, isBoolean,
4
+ assert, error, croak, warn, isString, isFunction, isBoolean,
5
5
  oneline, escapeStr, isNumber, isArray, words,
6
6
  } from '@jdeighan/coffee-utils'
7
7
  import {blockToArray} from '@jdeighan/coffee-utils/block'
8
- import {log, setLogger} from '@jdeighan/coffee-utils/log'
8
+ import {untabify} from '@jdeighan/coffee-utils/indent'
9
9
  import {slurp} from '@jdeighan/coffee-utils/fs'
10
10
  import {CallStack} from '@jdeighan/coffee-utils/stack'
11
+ import {
12
+ log, setStringifier, orderedStringify,
13
+ } from '@jdeighan/coffee-utils/log'
11
14
 
15
+ undef = undefined
12
16
  vbar = '│' # unicode 2502
13
17
  hbar = '─' # unicode 2500
14
18
  corner = '└' # unicode 2514
@@ -18,7 +22,6 @@ indent = vbar + ' '
18
22
  arrow = corner + hbar + arrowhead + ' '
19
23
 
20
24
  debugLevel = 0 # controls amount of indentation - we ensure it's never < 0
21
- stdLogger = false
22
25
 
23
26
  # --- These are saved/restored on the call stack
24
27
  export debugging = false
@@ -34,7 +37,7 @@ export resetDebugging = (funcDoDebug=undef, funcDoLog=undef) ->
34
37
  debugLevel = 0
35
38
  stack.reset()
36
39
  shouldDebug = (funcName, curDebugging) -> curDebugging
37
- shouldLog = (str) -> debugging
40
+ shouldLog = (str) -> debugging || process.env.DEBUG
38
41
  if funcDoDebug
39
42
  setDebugging funcDoDebug, funcDoLog
40
43
  return
@@ -91,32 +94,17 @@ setEnv = (hEnv) ->
91
94
  return
92
95
 
93
96
  # ---------------------------------------------------------------------------
97
+ # --- 2 possible signatures:
98
+ # (item) - just log out the string
99
+ # (item, hOptions) - log out the object, with a label
94
100
 
95
- export useStdLogger = (flag=true) ->
96
-
97
- stdLogger = flag
98
- return
99
-
100
- # ---------------------------------------------------------------------------
101
-
102
- logger = (lArgs...) ->
101
+ logger = (item, hOptions=undef) ->
103
102
 
104
- if stdLogger
105
- log lArgs...
106
- else
107
- orgLogger = setLogger(console.log)
108
- log lArgs...
109
- setLogger(orgLogger)
103
+ log item, hOptions
110
104
  return
111
105
 
112
106
  # ---------------------------------------------------------------------------
113
107
 
114
- stripArrow = (prefix) ->
115
-
116
- return prefix.replace(arrow, ' ')
117
-
118
- # ---------------------------------------------------------------------------
119
-
120
108
  getPrefix = (level) ->
121
109
 
122
110
  if (level < 0)
@@ -182,7 +170,7 @@ export debug = (lArgs...) ->
182
170
  curFunc = lMatches[1]
183
171
  hInfo = stack.returnFrom(curFunc)
184
172
 
185
- if debugging && shouldLog(str)
173
+ if shouldLog(str)
186
174
 
187
175
  # --- set the prefix, i.e. indentation to use
188
176
  if returning
@@ -194,12 +182,15 @@ export debug = (lArgs...) ->
194
182
  prefix = indent.repeat(debugLevel)
195
183
 
196
184
  if (nArgs==1)
197
- logger str, item, {prefix}
185
+ logger str, {
186
+ prefix: prefix
187
+ }
198
188
  else
199
- logger str, item, {
200
- prefix,
201
- logItem: true,
202
- itemPrefix: stripArrow(prefix),
189
+ itemPrefix = prefix.replace(arrow, ' ')
190
+ logger item, {
191
+ label: str
192
+ prefix: prefix
193
+ itemPrefix
203
194
  }
204
195
 
205
196
  # --- Adjust debug level
@@ -1,10 +1,9 @@
1
1
  // Generated by CoffeeScript 2.6.1
2
2
  // debug_utils.coffee
3
- var arrow, arrowhead, corner, curEnv, debugLevel, envSaysDebug, getPrefix, hbar, indent, logger, reMethod, setEnv, shouldDebug, shouldLog, stack, stdLogger, stripArrow, vbar;
3
+ var arrow, arrowhead, corner, curEnv, debugLevel, envSaysDebug, getPrefix, hbar, indent, logger, reMethod, setEnv, shouldDebug, shouldLog, stack, undef, vbar;
4
4
 
5
5
  import {
6
6
  assert,
7
- undef,
8
7
  error,
9
8
  croak,
10
9
  warn,
@@ -23,9 +22,8 @@ import {
23
22
  } from '@jdeighan/coffee-utils/block';
24
23
 
25
24
  import {
26
- log,
27
- setLogger
28
- } from '@jdeighan/coffee-utils/log';
25
+ untabify
26
+ } from '@jdeighan/coffee-utils/indent';
29
27
 
30
28
  import {
31
29
  slurp
@@ -35,6 +33,14 @@ import {
35
33
  CallStack
36
34
  } from '@jdeighan/coffee-utils/stack';
37
35
 
36
+ import {
37
+ log,
38
+ setStringifier,
39
+ orderedStringify
40
+ } from '@jdeighan/coffee-utils/log';
41
+
42
+ undef = void 0;
43
+
38
44
  vbar = '│'; // unicode 2502
39
45
 
40
46
  hbar = '─'; // unicode 2500
@@ -49,7 +55,6 @@ arrow = corner + hbar + arrowhead + ' ';
49
55
 
50
56
  debugLevel = 0; // controls amount of indentation - we ensure it's never < 0
51
57
 
52
- stdLogger = false;
53
58
 
54
59
  // --- These are saved/restored on the call stack
55
60
  export var debugging = false;
@@ -67,7 +72,7 @@ export var resetDebugging = function(funcDoDebug = undef, funcDoLog = undef) {
67
72
  return curDebugging;
68
73
  };
69
74
  shouldLog = function(str) {
70
- return debugging;
75
+ return debugging || process.env.DEBUG;
71
76
  };
72
77
  if (funcDoDebug) {
73
78
  setDebugging(funcDoDebug, funcDoLog);
@@ -123,25 +128,11 @@ setEnv = function(hEnv) {
123
128
  };
124
129
 
125
130
  // ---------------------------------------------------------------------------
126
- export var useStdLogger = function(flag = true) {
127
- stdLogger = flag;
128
- };
129
-
130
- // ---------------------------------------------------------------------------
131
- logger = function(...lArgs) {
132
- var orgLogger;
133
- if (stdLogger) {
134
- log(...lArgs);
135
- } else {
136
- orgLogger = setLogger(console.log);
137
- log(...lArgs);
138
- setLogger(orgLogger);
139
- }
140
- };
141
-
142
- // ---------------------------------------------------------------------------
143
- stripArrow = function(prefix) {
144
- return prefix.replace(arrow, ' ');
131
+ // --- 2 possible signatures:
132
+ // (item) - just log out the string
133
+ // (item, hOptions) - log out the object, with a label
134
+ logger = function(item, hOptions = undef) {
135
+ log(item, hOptions);
145
136
  };
146
137
 
147
138
  // ---------------------------------------------------------------------------
@@ -166,7 +157,7 @@ envSaysDebug = function(curFunc) {
166
157
 
167
158
  // ---------------------------------------------------------------------------
168
159
  export var debug = function(...lArgs) {
169
- var curFunc, entering, hInfo, item, lMatches, nArgs, prefix, returning, str;
160
+ var curFunc, entering, hInfo, item, itemPrefix, lMatches, nArgs, prefix, returning, str;
170
161
  // --- either 1 or 2 args
171
162
 
172
163
  // --- We always need to manipulate the stack when we encounter
@@ -194,7 +185,7 @@ export var debug = function(...lArgs) {
194
185
  curFunc = lMatches[1];
195
186
  hInfo = stack.returnFrom(curFunc);
196
187
  }
197
- if (debugging && shouldLog(str)) {
188
+ if (shouldLog(str)) {
198
189
  // --- set the prefix, i.e. indentation to use
199
190
  if (returning) {
200
191
  if (debugLevel === 0) {
@@ -206,12 +197,15 @@ export var debug = function(...lArgs) {
206
197
  prefix = indent.repeat(debugLevel);
207
198
  }
208
199
  if (nArgs === 1) {
209
- logger(str, item, {prefix});
200
+ logger(str, {
201
+ prefix: prefix
202
+ });
210
203
  } else {
211
- logger(str, item, {
212
- prefix,
213
- logItem: true,
214
- itemPrefix: stripArrow(prefix)
204
+ itemPrefix = prefix.replace(arrow, ' ');
205
+ logger(item, {
206
+ label: str,
207
+ prefix: prefix,
208
+ itemPrefix
215
209
  });
216
210
  }
217
211
  }
@@ -117,19 +117,17 @@ export tabify = (str, numSpaces=undef) ->
117
117
 
118
118
  lLines = []
119
119
  for str in blockToArray(str)
120
- lMatches = str.match(/^(\s*)(.*)$/)
121
- [_, prefix, theRest] = lMatches
122
- if prefix == ''
120
+ [_, prefix, theRest] = str.match(/^(\s*)(.*)$/)
121
+ prefixLen = prefix.length
122
+ if prefixLen == 0
123
123
  lLines.push theRest
124
124
  else
125
- n = prefix.length
126
125
  if (prefix.indexOf('\t') != -1)
127
126
  error "tabify(): leading TAB characters not allowed"
128
- if ! numSpaces?
129
- numSpaces = n
130
- if (n % numSpaces != 0)
131
- error "tabify(): Invalid # of leading space chars"
132
- lLines.push '\t'.repeat(n / numSpaces) + theRest
127
+ if numSpaces == undef
128
+ numSpaces = prefixLen
129
+ assert (prefixLen % numSpaces == 0), "Bad prefix"
130
+ lLines.push '\t'.repeat(prefixLen) + theRest
133
131
  return arrayToBlock(lLines)
134
132
 
135
133
  # ---------------------------------------------------------------------------
@@ -137,27 +137,24 @@ export var undented = function(text, level = undef) {
137
137
  // if numSpaces is not defined, then the first line
138
138
  // that contains at least one space sets it
139
139
  export var tabify = function(str, numSpaces = undef) {
140
- var _, i, lLines, lMatches, len, n, prefix, ref, theRest;
140
+ var _, i, lLines, len, prefix, prefixLen, ref, theRest;
141
141
  lLines = [];
142
142
  ref = blockToArray(str);
143
143
  for (i = 0, len = ref.length; i < len; i++) {
144
144
  str = ref[i];
145
- lMatches = str.match(/^(\s*)(.*)$/);
146
- [_, prefix, theRest] = lMatches;
147
- if (prefix === '') {
145
+ [_, prefix, theRest] = str.match(/^(\s*)(.*)$/);
146
+ prefixLen = prefix.length;
147
+ if (prefixLen === 0) {
148
148
  lLines.push(theRest);
149
149
  } else {
150
- n = prefix.length;
151
150
  if (prefix.indexOf('\t') !== -1) {
152
151
  error("tabify(): leading TAB characters not allowed");
153
152
  }
154
- if (numSpaces == null) {
155
- numSpaces = n;
156
- }
157
- if (n % numSpaces !== 0) {
158
- error("tabify(): Invalid # of leading space chars");
153
+ if (numSpaces === undef) {
154
+ numSpaces = prefixLen;
159
155
  }
160
- lLines.push('\t'.repeat(n / numSpaces) + theRest);
156
+ assert(prefixLen % numSpaces === 0, "Bad prefix");
157
+ lLines.push('\t'.repeat(prefixLen) + theRest);
161
158
  }
162
159
  }
163
160
  return arrayToBlock(lLines);