@jdeighan/coffee-utils 11.0.48 → 12.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "11.0.48",
4
+ "version": "12.0.0",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
package/src/block.coffee CHANGED
@@ -138,91 +138,3 @@ export joinBlocks = (lBlocks...) ->
138
138
  if nonEmpty(block)
139
139
  lNonEmptyBlocks.push block
140
140
  return lNonEmptyBlocks.join('\n')
141
-
142
- # ---------------------------------------------------------------------------
143
-
144
- ```
145
- export async function forEachLine(filepath, func) {
146
-
147
- const fileStream = fs.createReadStream(filepath);
148
- const rl = readline.createInterface({
149
- input: fileStream,
150
- crlfDelay: Infinity
151
- });
152
-
153
- // Note: we use the crlfDelay option to recognize all instances of CR LF
154
- // ('\r\n') in input.txt as a single line break.
155
-
156
- var lineNum = 0
157
- for await (const line of rl) {
158
- lineNum += 1
159
- // Each line will be successively available here as 'line'
160
- if (func(line, lineNum)) {
161
- rl.close(); // close if true return value
162
- return;
163
- }
164
- }
165
- } // forEachLine()
166
- ```
167
- # ---------------------------------------------------------------------------
168
-
169
- export forEachBlock = (filepath, func, regexp = /^-{16,}$/) ->
170
-
171
- lLines = []
172
- firstLineNum = 1
173
- earlyExit = false
174
-
175
- callback = (line, lineNum) ->
176
- if (line.match(regexp))
177
- if result = func(lLines.join('\n'), firstLineNum, line)
178
- if (result == true)
179
- earlyExit = true
180
- return true
181
- else if result?
182
- croak "forEachBlock() - callback returned '#{result}'"
183
- lLines = []
184
- firstLineNum = lineNum+1
185
- else
186
- lLines.push line
187
- return
188
-
189
- await forEachLine filepath, callback
190
- if ! earlyExit
191
- func(lLines.join('\n'), firstLineNum)
192
- return
193
-
194
- # ---------------------------------------------------------------------------
195
-
196
- export forEachSetOfBlocks = (filepath, func,
197
- block_regexp = /^-{16,}$/,
198
- set_regexp = /^={16,}$/) ->
199
-
200
- lBlocks = []
201
- lLines = []
202
- firstLineNum = 1
203
- earlyExit = false
204
-
205
- callback = (line, lineNum) ->
206
- if (line.match(set_regexp))
207
- lBlocks.push(lLines.join('\n'))
208
- lLines = []
209
- if result = func(lBlocks, firstLineNum, line)
210
- if (result == true)
211
- earlyExit = true
212
- return true
213
- else if result?
214
- croak "forEachSetOfBlocks() - callback returned '#{result}'"
215
- lBlocks = []
216
- firstLineNum = lineNum+1
217
- else if (line.match(block_regexp))
218
- lBlocks.push(lLines.join('\n'))
219
- lLines = []
220
- else
221
- lLines.push line
222
- return
223
-
224
- await forEachLine filepath, callback
225
- if ! earlyExit
226
- lBlocks.push(lLines.join('\n'))
227
- func(lBlocks, firstLineNum)
228
- return
package/src/block.js CHANGED
@@ -185,93 +185,3 @@ export var joinBlocks = function(...lBlocks) {
185
185
  }
186
186
  return lNonEmptyBlocks.join('\n');
187
187
  };
188
-
189
-
190
- export async function forEachLine(filepath, func) {
191
-
192
- const fileStream = fs.createReadStream(filepath);
193
- const rl = readline.createInterface({
194
- input: fileStream,
195
- crlfDelay: Infinity
196
- });
197
-
198
- // Note: we use the crlfDelay option to recognize all instances of CR LF
199
- // ('\r\n') in input.txt as a single line break.
200
-
201
- var lineNum = 0
202
- for await (const line of rl) {
203
- lineNum += 1
204
- // Each line will be successively available here as 'line'
205
- if (func(line, lineNum)) {
206
- rl.close(); // close if true return value
207
- return;
208
- }
209
- }
210
- } // forEachLine()
211
- // ---------------------------------------------------------------------------
212
- ;
213
-
214
- // ---------------------------------------------------------------------------
215
- export var forEachBlock = async function(filepath, func, regexp = /^-{16,}$/) {
216
- var callback, earlyExit, firstLineNum, lLines;
217
- lLines = [];
218
- firstLineNum = 1;
219
- earlyExit = false;
220
- callback = function(line, lineNum) {
221
- var result;
222
- if (line.match(regexp)) {
223
- if (result = func(lLines.join('\n'), firstLineNum, line)) {
224
- if (result === true) {
225
- earlyExit = true;
226
- return true;
227
- } else if (result != null) {
228
- croak(`forEachBlock() - callback returned '${result}'`);
229
- }
230
- }
231
- lLines = [];
232
- firstLineNum = lineNum + 1;
233
- } else {
234
- lLines.push(line);
235
- }
236
- };
237
- await forEachLine(filepath, callback);
238
- if (!earlyExit) {
239
- func(lLines.join('\n'), firstLineNum);
240
- }
241
- };
242
-
243
- // ---------------------------------------------------------------------------
244
- export var forEachSetOfBlocks = async function(filepath, func, block_regexp = /^-{16,}$/, set_regexp = /^={16,}$/) {
245
- var callback, earlyExit, firstLineNum, lBlocks, lLines;
246
- lBlocks = [];
247
- lLines = [];
248
- firstLineNum = 1;
249
- earlyExit = false;
250
- callback = function(line, lineNum) {
251
- var result;
252
- if (line.match(set_regexp)) {
253
- lBlocks.push(lLines.join('\n'));
254
- lLines = [];
255
- if (result = func(lBlocks, firstLineNum, line)) {
256
- if (result === true) {
257
- earlyExit = true;
258
- return true;
259
- } else if (result != null) {
260
- croak(`forEachSetOfBlocks() - callback returned '${result}'`);
261
- }
262
- }
263
- lBlocks = [];
264
- firstLineNum = lineNum + 1;
265
- } else if (line.match(block_regexp)) {
266
- lBlocks.push(lLines.join('\n'));
267
- lLines = [];
268
- } else {
269
- lLines.push(line);
270
- }
271
- };
272
- await forEachLine(filepath, callback);
273
- if (!earlyExit) {
274
- lBlocks.push(lLines.join('\n'));
275
- func(lBlocks, firstLineNum);
276
- }
277
- };
package/src/fs.coffee CHANGED
@@ -3,6 +3,7 @@
3
3
  import pathlib from 'path'
4
4
  import urllib from 'url'
5
5
  import fs from 'fs'
6
+ import readline from 'readline'
6
7
  import NReadLines from 'n-readlines'
7
8
 
8
9
  import {assert, croak, LOG, fromTAML} from '@jdeighan/base-utils'
@@ -128,30 +129,94 @@ export getFullPath = (filepath) ->
128
129
 
129
130
  # ---------------------------------------------------------------------------
130
131
 
131
- export forEachLineInFile = (filepath, func) ->
132
+ export forEachLine = (filepath, func) ->
132
133
 
133
134
  reader = new NReadLines(filepath)
134
135
  nLines = 0
135
136
 
136
137
  while (buffer = reader.next())
137
138
  nLines += 1
138
- # --- text is split on \n chars, we also need to remove \r chars
139
+ # --- text is split on \n chars,
140
+ # we also need to remove \r chars
139
141
  line = buffer.toString().replace(/\r/g, '')
140
- if func(line, nLines) == 'EOF'
142
+ if func(line, nLines)
141
143
  reader.close() # allow premature termination
142
144
  return
143
145
 
146
+ # ---------------------------------------------------------------------------
147
+
148
+ export forEachBlock = (filepath, func, regexp = /^-{16,}$/) ->
149
+
150
+ lLines = []
151
+ firstLineNum = 1
152
+ earlyExit = false
153
+
154
+ callback = (line, lineNum) ->
155
+ if (line.match(regexp))
156
+ if result = func(lLines.join('\n'), firstLineNum, line)
157
+ if (result == true)
158
+ earlyExit = true
159
+ return true
160
+ else if defined(result)
161
+ croak "forEachBlock() - callback returned '#{result}'"
162
+ lLines = []
163
+ firstLineNum = lineNum+1
164
+ else
165
+ lLines.push line
166
+ return
167
+
168
+ forEachLine filepath, callback
169
+ if ! earlyExit
170
+ func(lLines.join('\n'), firstLineNum)
171
+ return
172
+
173
+ # ---------------------------------------------------------------------------
174
+
175
+ export forEachSetOfBlocks = (filepath, func,
176
+ block_regexp = /^-{16,}$/,
177
+ set_regexp = /^={16,}$/) ->
178
+
179
+ lBlocks = []
180
+ lLines = []
181
+ firstLineNum = 1
182
+ earlyExit = false
183
+
184
+ callback = (line, lineNum) ->
185
+ if (line.match(set_regexp))
186
+ lBlocks.push(lLines.join('\n'))
187
+ lLines = []
188
+ if result = func(lBlocks, firstLineNum, line)
189
+ if (result == true)
190
+ earlyExit = true
191
+ return true
192
+ else if result?
193
+ croak "forEachSetOfBlocks() - callback returned '#{result}'"
194
+ lBlocks = []
195
+ firstLineNum = lineNum+1
196
+ else if (line.match(block_regexp))
197
+ lBlocks.push(lLines.join('\n'))
198
+ lLines = []
199
+ else
200
+ lLines.push line
201
+ return
202
+
203
+ forEachLine filepath, callback
204
+ if ! earlyExit
205
+ lBlocks.push(lLines.join('\n'))
206
+ func(lBlocks, firstLineNum)
207
+ return
208
+
144
209
  # ---------------------------------------------------------------------------
145
210
  # slurp - read an entire file into a string
146
211
 
147
212
  export slurp = (filepath, maxLines=undef) ->
148
213
 
149
- if maxLines?
214
+ if defined(maxLines)
150
215
  lLines = []
151
- forEachLineInFile filepath, (line, nLines) ->
216
+ forEachLine filepath, (line, nLines) ->
152
217
  lLines.push line
153
- return if nLines >= maxLines then 'EOF' else undef
154
- contents = lLines.join("\n")
218
+ return (nLines >= maxLines)
219
+ contents = arrayToBlock(lLines)
155
220
  else
156
221
  filepath = filepath.replace(/\//g, "\\")
157
222
  contents = fs.readFileSync(filepath, 'utf8').toString()
@@ -418,26 +483,6 @@ export parseSource = (source) ->
418
483
  dbgReturn "parseSource", hSourceInfo
419
484
  return hSourceInfo
420
485
 
421
- # ---------------------------------------------------------------------------
422
- # backup - back up a file
423
-
424
- # --- If report is true, missing source files are not an error
425
- # but both missing source files and successful copies
426
- # are reported via LOG
427
-
428
- export backup = (file, from, to, report=false) ->
429
- src = mkpath(from, file)
430
- dest = mkpath(to, file)
431
-
432
- if report
433
- if fs.existsSync(src)
434
- LOG "OK #{file}"
435
- fs.copyFileSync(src, dest)
436
- else
437
- LOG "MISSING #{src}"
438
- else
439
- fs.copyFileSync(src, dest)
440
-
441
486
  # ---------------------------------------------------------------------------
442
487
  # slurpTAML - read TAML from a file
443
488
 
package/src/fs.js CHANGED
@@ -8,6 +8,8 @@ import urllib from 'url';
8
8
 
9
9
  import fs from 'fs';
10
10
 
11
+ import readline from 'readline';
12
+
11
13
  import NReadLines from 'n-readlines';
12
14
 
13
15
  import {
@@ -160,35 +162,97 @@ export var getFullPath = function(filepath) {
160
162
  };
161
163
 
162
164
  // ---------------------------------------------------------------------------
163
- export var forEachLineInFile = function(filepath, func) {
165
+ export var forEachLine = function(filepath, func) {
164
166
  var buffer, line, nLines, reader;
165
167
  reader = new NReadLines(filepath);
166
168
  nLines = 0;
167
169
  while ((buffer = reader.next())) {
168
170
  nLines += 1;
169
- // --- text is split on \n chars, we also need to remove \r chars
171
+ // --- text is split on \n chars,
172
+ // we also need to remove \r chars
170
173
  line = buffer.toString().replace(/\r/g, '');
171
- if (func(line, nLines) === 'EOF') {
174
+ if (func(line, nLines)) {
172
175
  reader.close(); // allow premature termination
173
176
  }
174
177
  }
175
178
  };
176
179
 
180
+ // ---------------------------------------------------------------------------
181
+ export var forEachBlock = function(filepath, func, regexp = /^-{16,}$/) {
182
+ var callback, earlyExit, firstLineNum, lLines;
183
+ lLines = [];
184
+ firstLineNum = 1;
185
+ earlyExit = false;
186
+ callback = function(line, lineNum) {
187
+ var result;
188
+ if (line.match(regexp)) {
189
+ if (result = func(lLines.join('\n'), firstLineNum, line)) {
190
+ if (result === true) {
191
+ earlyExit = true;
192
+ return true;
193
+ } else if (defined(result)) {
194
+ croak(`forEachBlock() - callback returned '${result}'`);
195
+ }
196
+ }
197
+ lLines = [];
198
+ firstLineNum = lineNum + 1;
199
+ } else {
200
+ lLines.push(line);
201
+ }
202
+ };
203
+ forEachLine(filepath, callback);
204
+ if (!earlyExit) {
205
+ func(lLines.join('\n'), firstLineNum);
206
+ }
207
+ };
208
+
209
+ // ---------------------------------------------------------------------------
210
+ export var forEachSetOfBlocks = function(filepath, func, block_regexp = /^-{16,}$/, set_regexp = /^={16,}$/) {
211
+ var callback, earlyExit, firstLineNum, lBlocks, lLines;
212
+ lBlocks = [];
213
+ lLines = [];
214
+ firstLineNum = 1;
215
+ earlyExit = false;
216
+ callback = function(line, lineNum) {
217
+ var result;
218
+ if (line.match(set_regexp)) {
219
+ lBlocks.push(lLines.join('\n'));
220
+ lLines = [];
221
+ if (result = func(lBlocks, firstLineNum, line)) {
222
+ if (result === true) {
223
+ earlyExit = true;
224
+ return true;
225
+ } else if (result != null) {
226
+ croak(`forEachSetOfBlocks() - callback returned '${result}'`);
227
+ }
228
+ }
229
+ lBlocks = [];
230
+ firstLineNum = lineNum + 1;
231
+ } else if (line.match(block_regexp)) {
232
+ lBlocks.push(lLines.join('\n'));
233
+ lLines = [];
234
+ } else {
235
+ lLines.push(line);
236
+ }
237
+ };
238
+ forEachLine(filepath, callback);
239
+ if (!earlyExit) {
240
+ lBlocks.push(lLines.join('\n'));
241
+ func(lBlocks, firstLineNum);
242
+ }
243
+ };
244
+
177
245
  // ---------------------------------------------------------------------------
178
246
  // slurp - read an entire file into a string
179
247
  export var slurp = function(filepath, maxLines = undef) {
180
248
  var contents, lLines;
181
- if (maxLines != null) {
249
+ if (defined(maxLines)) {
182
250
  lLines = [];
183
- forEachLineInFile(filepath, function(line, nLines) {
251
+ forEachLine(filepath, function(line, nLines) {
184
252
  lLines.push(line);
185
- if (nLines >= maxLines) {
186
- return 'EOF';
187
- } else {
188
- return undef;
189
- }
253
+ return nLines >= maxLines;
190
254
  });
191
- contents = lLines.join("\n");
255
+ contents = arrayToBlock(lLines);
192
256
  } else {
193
257
  filepath = filepath.replace(/\//g, "\\");
194
258
  contents = fs.readFileSync(filepath, 'utf8').toString();
@@ -492,28 +556,6 @@ export var parseSource = function(source) {
492
556
  return hSourceInfo;
493
557
  };
494
558
 
495
- // ---------------------------------------------------------------------------
496
- // backup - back up a file
497
-
498
- // --- If report is true, missing source files are not an error
499
- // but both missing source files and successful copies
500
- // are reported via LOG
501
- export var backup = function(file, from, to, report = false) {
502
- var dest, src;
503
- src = mkpath(from, file);
504
- dest = mkpath(to, file);
505
- if (report) {
506
- if (fs.existsSync(src)) {
507
- LOG(`OK ${file}`);
508
- return fs.copyFileSync(src, dest);
509
- } else {
510
- return LOG(`MISSING ${src}`);
511
- }
512
- } else {
513
- return fs.copyFileSync(src, dest);
514
- }
515
- };
516
-
517
559
  // ---------------------------------------------------------------------------
518
560
  // slurpTAML - read TAML from a file
519
561
  export var slurpTAML = function(filepath) {
package/temp.txt ADDED
@@ -0,0 +1 @@
1
+ this is text