@jdeighan/coffee-utils 2.1.2 → 2.1.6

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": "2.1.2",
4
+ "version": "2.1.6",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
@@ -188,6 +188,12 @@ export isFunction = (x) ->
188
188
 
189
189
  # ---------------------------------------------------------------------------
190
190
 
191
+ export isRegExp = (x) ->
192
+
193
+ return x instanceof RegExp
194
+
195
+ # ---------------------------------------------------------------------------
196
+
191
197
  export isInteger = (x) ->
192
198
 
193
199
  if (typeof x == 'number')
@@ -195,6 +195,11 @@ export var isFunction = function(x) {
195
195
  return typeof x === 'function';
196
196
  };
197
197
 
198
+ // ---------------------------------------------------------------------------
199
+ export var isRegExp = function(x) {
200
+ return x instanceof RegExp;
201
+ };
202
+
198
203
  // ---------------------------------------------------------------------------
199
204
  export var isInteger = function(x) {
200
205
  if (typeof x === 'number') {
@@ -17,13 +17,12 @@ arrow = corner + hbar + arrowhead + ' '
17
17
 
18
18
  debugLevel = 0 # controls amount of indentation - we ensure it's never < 0
19
19
 
20
- export debugging = false
21
-
22
- ifMatches = undefined
20
+ lDebugStack = []
23
21
 
24
- # --- turn debugging on when in one of these functions
25
- # when returning from one of these functions, restore previous setting
26
- lDebugFuncs = undefined
22
+ # --- These are saved/restored in lDebugStack
23
+ export debugging = false
24
+ ifMatches = undef
25
+ lDebugFuncs = undef
27
26
 
28
27
  # ---------------------------------------------------------------------------
29
28
 
@@ -34,37 +33,43 @@ export debugIfLineMatches = (regexp=undef) ->
34
33
 
35
34
  # ---------------------------------------------------------------------------
36
35
 
37
- lDebugStack = []
38
-
39
36
  saveDebugEnv = () ->
40
37
 
41
- lDebugStack.push(debugging)
38
+ lDebugStack.push({
39
+ debugging,
40
+ ifMatches,
41
+ lDebugFuncs,
42
+ })
42
43
  return
43
44
 
44
45
  restoreDebugEnv = () ->
45
46
 
46
47
  if (lDebugStack.length == 0)
47
48
  debugging = false
49
+ ifMatches = undef
50
+ lDebugFuncs = undef
48
51
  else
49
- debugging = lDebugStack.pop()
52
+ h = lDebugStack.pop()
53
+ {debugging, ifMatches, lDebugFuncs} = h
54
+
50
55
  return
51
56
 
52
57
  # ---------------------------------------------------------------------------
53
58
 
54
59
  export setDebugging = (x) ->
55
60
 
56
- if (x==true)
57
- # --- save current setting
58
- saveDebugEnv()
59
- debugging = true
60
- else if (x==false)
61
+ if (x==false)
61
62
  restoreDebugEnv()
62
- else if isString(x)
63
- lDebugFuncs = words(x)
64
- else if isArray(x)
65
- lDebugFuncs = x
66
63
  else
67
- croak "setDebugging(): bad parameter #{oneline(x)}"
64
+ # --- save current setting
65
+ saveDebugEnv()
66
+ if (x==true)
67
+ debugging = true
68
+ else if isString(x)
69
+ debugging = false
70
+ lDebugFuncs = words(x)
71
+ else
72
+ croak "setDebugging(): bad parameter #{oneline(x)}"
68
73
  return
69
74
 
70
75
  # ---------------------------------------------------------------------------
@@ -78,6 +83,17 @@ getPrefix = (level) ->
78
83
 
79
84
  # ---------------------------------------------------------------------------
80
85
 
86
+ export resetDebugging = () ->
87
+
88
+ debugging = false
89
+ debugLevel = 0
90
+ ifMatches = undef
91
+ lDebugFuncs = undef
92
+ lDebugStack = []
93
+ return
94
+
95
+ # ---------------------------------------------------------------------------
96
+
81
97
  export debug = (lArgs...) ->
82
98
  # --- either 1 or 2 args
83
99
 
@@ -100,7 +116,7 @@ export debug = (lArgs...) ->
100
116
  # --- determine if we're entering or returning from a function
101
117
  entering = exiting = false
102
118
  curFunction = undef
103
- if (lMatches=str.match(///^
119
+ if (lMatches = str.match(///^
104
120
  \s*
105
121
  enter
106
122
  \s+
@@ -108,7 +124,7 @@ export debug = (lArgs...) ->
108
124
  ///))
109
125
  entering = true
110
126
  curFunction = lMatches[1]
111
- else if (lMatches=str.match(///^
127
+ else if (lMatches = str.match(///^
112
128
  \s*
113
129
  return
114
130
  .*
@@ -119,9 +135,8 @@ export debug = (lArgs...) ->
119
135
  exiting = true
120
136
  curFunction = lMatches[1]
121
137
 
122
- if curFunction && lDebugFuncs && lDebugFuncs.includes(curFunction)
123
- if entering
124
- setDebugging true
138
+ if entering && lDebugFuncs && lDebugFuncs.includes(curFunction)
139
+ setDebugging true
125
140
 
126
141
  if debugging && (not ifMatches? || str.match(ifMatches))
127
142
 
@@ -139,12 +154,12 @@ export debug = (lArgs...) ->
139
154
  else
140
155
  log str, item, {prefix, logItem: true}
141
156
 
142
- if curFunction && lDebugFuncs && lDebugFuncs.includes(curFunction)
143
- if exiting
144
- setDebugging false # revert to previous setting - might still be on
157
+ if exiting && lDebugFuncs && lDebugFuncs.includes(curFunction)
158
+ setDebugging false # revert to previous setting - might still be on
145
159
 
146
- if entering
147
- debugLevel += 1
148
- if exiting && (debugLevel > 0)
149
- debugLevel -= 1
160
+ if debugging
161
+ if entering
162
+ debugLevel += 1
163
+ if exiting && (debugLevel > 0)
164
+ debugLevel -= 1
150
165
  return
@@ -39,13 +39,14 @@ arrow = corner + hbar + arrowhead + ' ';
39
39
 
40
40
  debugLevel = 0; // controls amount of indentation - we ensure it's never < 0
41
41
 
42
+ lDebugStack = [];
43
+
44
+ // --- These are saved/restored in lDebugStack
42
45
  export var debugging = false;
43
46
 
44
- ifMatches = void 0;
47
+ ifMatches = undef;
45
48
 
46
- // --- turn debugging on when in one of these functions
47
- // when returning from one of these functions, restore previous setting
48
- lDebugFuncs = void 0;
49
+ lDebugFuncs = undef;
49
50
 
50
51
  // ---------------------------------------------------------------------------
51
52
  export var debugIfLineMatches = function(regexp = undef) {
@@ -53,34 +54,37 @@ export var debugIfLineMatches = function(regexp = undef) {
53
54
  };
54
55
 
55
56
  // ---------------------------------------------------------------------------
56
- lDebugStack = [];
57
-
58
57
  saveDebugEnv = function() {
59
- lDebugStack.push(debugging);
58
+ lDebugStack.push({debugging, ifMatches, lDebugFuncs});
60
59
  };
61
60
 
62
61
  restoreDebugEnv = function() {
62
+ var h;
63
63
  if (lDebugStack.length === 0) {
64
64
  debugging = false;
65
+ ifMatches = undef;
66
+ lDebugFuncs = undef;
65
67
  } else {
66
- debugging = lDebugStack.pop();
68
+ h = lDebugStack.pop();
69
+ ({debugging, ifMatches, lDebugFuncs} = h);
67
70
  }
68
71
  };
69
72
 
70
73
  // ---------------------------------------------------------------------------
71
74
  export var setDebugging = function(x) {
72
- if (x === true) {
73
- // --- save current setting
74
- saveDebugEnv();
75
- debugging = true;
76
- } else if (x === false) {
75
+ if (x === false) {
77
76
  restoreDebugEnv();
78
- } else if (isString(x)) {
79
- lDebugFuncs = words(x);
80
- } else if (isArray(x)) {
81
- lDebugFuncs = x;
82
77
  } else {
83
- croak(`setDebugging(): bad parameter ${oneline(x)}`);
78
+ // --- save current setting
79
+ saveDebugEnv();
80
+ if (x === true) {
81
+ debugging = true;
82
+ } else if (isString(x)) {
83
+ debugging = false;
84
+ lDebugFuncs = words(x);
85
+ } else {
86
+ croak(`setDebugging(): bad parameter ${oneline(x)}`);
87
+ }
84
88
  }
85
89
  };
86
90
 
@@ -93,6 +97,15 @@ getPrefix = function(level) {
93
97
  return ' '.repeat(level);
94
98
  };
95
99
 
100
+ // ---------------------------------------------------------------------------
101
+ export var resetDebugging = function() {
102
+ debugging = false;
103
+ debugLevel = 0;
104
+ ifMatches = undef;
105
+ lDebugFuncs = undef;
106
+ lDebugStack = [];
107
+ };
108
+
96
109
  // ---------------------------------------------------------------------------
97
110
  export var debug = function(...lArgs) {
98
111
  var curFunction, entering, exiting, item, lMatches, nArgs, prefix, str;
@@ -119,10 +132,8 @@ export var debug = function(...lArgs) {
119
132
  exiting = true;
120
133
  curFunction = lMatches[1];
121
134
  }
122
- if (curFunction && lDebugFuncs && lDebugFuncs.includes(curFunction)) {
123
- if (entering) {
124
- setDebugging(true);
125
- }
135
+ if (entering && lDebugFuncs && lDebugFuncs.includes(curFunction)) {
136
+ setDebugging(true);
126
137
  }
127
138
  if (debugging && ((ifMatches == null) || str.match(ifMatches))) {
128
139
  // --- set the prefix, i.e. indentation to use
@@ -144,15 +155,15 @@ export var debug = function(...lArgs) {
144
155
  });
145
156
  }
146
157
  }
147
- if (curFunction && lDebugFuncs && lDebugFuncs.includes(curFunction)) {
148
- if (exiting) {
149
- setDebugging(false); // revert to previous setting - might still be on
150
- }
151
- }
152
- if (entering) {
153
- debugLevel += 1;
158
+ if (exiting && lDebugFuncs && lDebugFuncs.includes(curFunction)) {
159
+ setDebugging(false); // revert to previous setting - might still be on
154
160
  }
155
- if (exiting && (debugLevel > 0)) {
156
- debugLevel -= 1;
161
+ if (debugging) {
162
+ if (entering) {
163
+ debugLevel += 1;
164
+ }
165
+ if (exiting && (debugLevel > 0)) {
166
+ debugLevel -= 1;
167
+ }
157
168
  }
158
169
  };
@@ -11,7 +11,8 @@ import {
11
11
  } from 'fs'
12
12
 
13
13
  import {
14
- undef, pass, firstLine, rtrim, error,
14
+ undef, pass, firstLine, rtrim, error, nonEmpty,
15
+ isRegExp, isFunction, croak,
15
16
  } from '@jdeighan/coffee-utils'
16
17
  import {log} from '@jdeighan/coffee-utils/log'
17
18
  import {debug} from '@jdeighan/coffee-utils/debug'
@@ -117,6 +118,33 @@ export getParentDir = (dir) ->
117
118
 
118
119
  # ---------------------------------------------------------------------------
119
120
 
121
+ export forEachFile = (dir, cb, filt=undef, level=0) ->
122
+ # --- filt can be a regular expression or a function that gets:
123
+ # (filename, dir, level)
124
+ # callback will get parms (filename, dir, level)
125
+
126
+ lSubDirectories = []
127
+ for ent in readdirSync(dir, {withFileTypes: true})
128
+ if ent.isDirectory()
129
+ lSubDirectories.push ent
130
+ else if ent.isFile()
131
+ if not filt?
132
+ cb(ent.name, dir, level)
133
+ else if isRegExp(filt)
134
+ if ent.name.match(filt)
135
+ cb(ent.name, dir, level)
136
+ else if isFunction(filt)
137
+ if filt(ent.name, dir, level)
138
+ cb(ent.name, dir, level)
139
+ else
140
+ croak "forEachFile(): bad filter", 'filter', filt
141
+ if nonEmpty(lSubDirectories)
142
+ for subdir in lSubDirectories.sort()
143
+ forEachFile(mkpath(dir, subdir.name), cb, filt, level+1)
144
+ return
145
+
146
+ # ---------------------------------------------------------------------------
147
+
120
148
  export pathTo = (fname, dir, direction="down") ->
121
149
 
122
150
  debug "enter pathTo('#{fname}','#{dir}','#{direction}')"
package/src/fs_utils.js CHANGED
@@ -28,7 +28,11 @@ import {
28
28
  pass,
29
29
  firstLine,
30
30
  rtrim,
31
- error
31
+ error,
32
+ nonEmpty,
33
+ isRegExp,
34
+ isFunction,
35
+ croak
32
36
  } from '@jdeighan/coffee-utils';
33
37
 
34
38
  import {
@@ -145,6 +149,45 @@ export var getParentDir = function(dir) {
145
149
  return mkpath(resolve(dir, '..'));
146
150
  };
147
151
 
152
+ // ---------------------------------------------------------------------------
153
+ export var forEachFile = function(dir, cb, filt = undef, level = 0) {
154
+ var ent, i, j, lSubDirectories, len, len1, ref, ref1, subdir;
155
+ // --- filt can be a regular expression or a function that gets:
156
+ // (filename, dir, level)
157
+ // callback will get parms (filename, dir, level)
158
+ lSubDirectories = [];
159
+ ref = readdirSync(dir, {
160
+ withFileTypes: true
161
+ });
162
+ for (i = 0, len = ref.length; i < len; i++) {
163
+ ent = ref[i];
164
+ if (ent.isDirectory()) {
165
+ lSubDirectories.push(ent);
166
+ } else if (ent.isFile()) {
167
+ if (filt == null) {
168
+ cb(ent.name, dir, level);
169
+ } else if (isRegExp(filt)) {
170
+ if (ent.name.match(filt)) {
171
+ cb(ent.name, dir, level);
172
+ } else if (isFunction(filt)) {
173
+ if (filt(ent.name, dir, level)) {
174
+ cb(ent.name, dir, level);
175
+ }
176
+ }
177
+ } else {
178
+ croak("forEachFile(): bad filter", 'filter', filt);
179
+ }
180
+ }
181
+ }
182
+ if (nonEmpty(lSubDirectories)) {
183
+ ref1 = lSubDirectories.sort();
184
+ for (j = 0, len1 = ref1.length; j < len1; j++) {
185
+ subdir = ref1[j];
186
+ forEachFile(mkpath(dir, subdir.name), cb, filt, level + 1);
187
+ }
188
+ }
189
+ };
190
+
148
191
  // ---------------------------------------------------------------------------
149
192
  export var pathTo = function(fname, dir, direction = "down") {
150
193
  var fpath, i, len, ref, subdir;
@@ -3,7 +3,7 @@
3
3
  import {strict as assert} from 'assert'
4
4
  import {
5
5
  undef, error, arrayToString, stringToArray, escapeStr,
6
- oneline, isInteger, isString, isArray, isEmpty,
6
+ oneline, isInteger, isString, isArray, isEmpty, rtrim,
7
7
  } from '@jdeighan/coffee-utils'
8
8
 
9
9
  # ---------------------------------------------------------------------------
@@ -15,8 +15,9 @@ export splitLine = (line) ->
15
15
 
16
16
  assert line?, "splitLine(): line is undef"
17
17
  assert (typeof line == 'string'), "splitLine(): line is not a string"
18
+ line = rtrim(line)
18
19
  lMatches = line.match(/^(\s*)(.*)$/)
19
- return [lMatches[1].length, lMatches[2].trim()]
20
+ return [lMatches[1].length, lMatches[2]]
20
21
 
21
22
  # ---------------------------------------------------------------------------
22
23
  # indentation - return appropriate indentation string for given level
@@ -129,15 +130,13 @@ export tabify = (str, numSpaces=undef) ->
129
130
 
130
131
  export untabify = (str, numSpaces=3) ->
131
132
 
133
+ oneIndent = ' '.repeat(numSpaces)
132
134
  lLines = []
133
135
  for str in stringToArray(str)
134
- lMatches = str.match(/^(\s*)(.*)$/)
136
+ lMatches = str.match(/^(\t*)(.*)$/)
135
137
  [_, prefix, theRest] = lMatches
136
138
  if prefix == ''
137
139
  lLines.push theRest
138
140
  else
139
- n = prefix.length
140
- if (prefix != '\t'.repeat(n))
141
- error "untabify(): not all TABs: prefix='#{escapeStr(prefix)}'"
142
- lLines.push ' '.repeat(n * numSpaces) + theRest
141
+ lLines.push oneIndent.repeat(prefix.length) + theRest
143
142
  return arrayToString(lLines)
@@ -14,7 +14,8 @@ import {
14
14
  isInteger,
15
15
  isString,
16
16
  isArray,
17
- isEmpty
17
+ isEmpty,
18
+ rtrim
18
19
  } from '@jdeighan/coffee-utils';
19
20
 
20
21
  // ---------------------------------------------------------------------------
@@ -25,8 +26,9 @@ export var splitLine = function(line) {
25
26
  var lMatches;
26
27
  assert(line != null, "splitLine(): line is undef");
27
28
  assert(typeof line === 'string', "splitLine(): line is not a string");
29
+ line = rtrim(line);
28
30
  lMatches = line.match(/^(\s*)(.*)$/);
29
- return [lMatches[1].length, lMatches[2].trim()];
31
+ return [lMatches[1].length, lMatches[2]];
30
32
  };
31
33
 
32
34
  // ---------------------------------------------------------------------------
@@ -163,21 +165,18 @@ export var tabify = function(str, numSpaces = undef) {
163
165
  // ---------------------------------------------------------------------------
164
166
  // untabify - convert leading TABs to spaces
165
167
  export var untabify = function(str, numSpaces = 3) {
166
- var _, i, lLines, lMatches, len, n, prefix, ref, theRest;
168
+ var _, i, lLines, lMatches, len, oneIndent, prefix, ref, theRest;
169
+ oneIndent = ' '.repeat(numSpaces);
167
170
  lLines = [];
168
171
  ref = stringToArray(str);
169
172
  for (i = 0, len = ref.length; i < len; i++) {
170
173
  str = ref[i];
171
- lMatches = str.match(/^(\s*)(.*)$/);
174
+ lMatches = str.match(/^(\t*)(.*)$/);
172
175
  [_, prefix, theRest] = lMatches;
173
176
  if (prefix === '') {
174
177
  lLines.push(theRest);
175
178
  } else {
176
- n = prefix.length;
177
- if (prefix !== '\t'.repeat(n)) {
178
- error(`untabify(): not all TABs: prefix='${escapeStr(prefix)}'`);
179
- }
180
- lLines.push(' '.repeat(n * numSpaces) + theRest);
179
+ lLines.push(oneIndent.repeat(prefix.length) + theRest);
181
180
  }
182
181
  }
183
182
  return arrayToString(lLines);