@jdeighan/coffee-utils 7.0.20 → 7.0.23
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 +13 -0
- package/src/coffee_utils.js +17 -0
- package/src/fs_utils.coffee +39 -16
- package/src/fs_utils.js +45 -16
package/package.json
CHANGED
package/src/coffee_utils.coffee
CHANGED
@@ -202,6 +202,19 @@ export isInteger = (x) ->
|
|
202
202
|
|
203
203
|
# ---------------------------------------------------------------------------
|
204
204
|
|
205
|
+
export isUniqueList = (lItems) ->
|
206
|
+
|
207
|
+
if ! lItems?
|
208
|
+
return true # empty list is unique
|
209
|
+
h = {}
|
210
|
+
for item in lItems
|
211
|
+
if h[item]
|
212
|
+
return false
|
213
|
+
h[item] = 1
|
214
|
+
return true
|
215
|
+
|
216
|
+
# ---------------------------------------------------------------------------
|
217
|
+
|
205
218
|
export uniq = (lItems) ->
|
206
219
|
|
207
220
|
return [...new Set(lItems)]
|
package/src/coffee_utils.js
CHANGED
@@ -202,6 +202,23 @@ export var isInteger = function(x) {
|
|
202
202
|
}
|
203
203
|
};
|
204
204
|
|
205
|
+
// ---------------------------------------------------------------------------
|
206
|
+
export var isUniqueList = function(lItems) {
|
207
|
+
var h, i, item, len;
|
208
|
+
if (lItems == null) {
|
209
|
+
return true; // empty list is unique
|
210
|
+
}
|
211
|
+
h = {};
|
212
|
+
for (i = 0, len = lItems.length; i < len; i++) {
|
213
|
+
item = lItems[i];
|
214
|
+
if (h[item]) {
|
215
|
+
return false;
|
216
|
+
}
|
217
|
+
h[item] = 1;
|
218
|
+
}
|
219
|
+
return true;
|
220
|
+
};
|
221
|
+
|
205
222
|
// ---------------------------------------------------------------------------
|
206
223
|
export var uniq = function(lItems) {
|
207
224
|
return [...new Set(lItems)];
|
package/src/fs_utils.coffee
CHANGED
@@ -7,7 +7,7 @@ import NReadLines from 'n-readlines'
|
|
7
7
|
|
8
8
|
import {
|
9
9
|
assert, undef, pass, rtrim, error, isEmpty, nonEmpty,
|
10
|
-
isString, isArray, isRegExp, isFunction, croak,
|
10
|
+
isString, isArray, isRegExp, isFunction, croak, OL,
|
11
11
|
} from '@jdeighan/coffee-utils'
|
12
12
|
import {log, LOG} from '@jdeighan/coffee-utils/log'
|
13
13
|
import {debug} from '@jdeighan/coffee-utils/debug'
|
@@ -62,7 +62,12 @@ export isFile = (fullpath) ->
|
|
62
62
|
|
63
63
|
export isDir = (fullpath) ->
|
64
64
|
|
65
|
-
|
65
|
+
try
|
66
|
+
obj = fs.lstatSync(fullpath)
|
67
|
+
if !obj? then return false
|
68
|
+
return obj.isDirectory()
|
69
|
+
catch
|
70
|
+
return false
|
66
71
|
|
67
72
|
# ---------------------------------------------------------------------------
|
68
73
|
|
@@ -73,6 +78,16 @@ export isSimpleFileName = (path) ->
|
|
73
78
|
|
74
79
|
# ---------------------------------------------------------------------------
|
75
80
|
|
81
|
+
export fileStub = (path) ->
|
82
|
+
|
83
|
+
assert isString(path), "fileExt(): path not a string"
|
84
|
+
if lMatches = path.match(/^(.*)\.[A-Za-z0-9_]+$/)
|
85
|
+
return lMatches[1]
|
86
|
+
else
|
87
|
+
return ''
|
88
|
+
|
89
|
+
# ---------------------------------------------------------------------------
|
90
|
+
|
76
91
|
export fileExt = (path) ->
|
77
92
|
|
78
93
|
assert isString(path), "fileExt(): path not a string"
|
@@ -343,34 +358,42 @@ export parseSource = (source) ->
|
|
343
358
|
# --- returns {
|
344
359
|
# dir
|
345
360
|
# filename
|
361
|
+
# fullpath
|
346
362
|
# stub
|
347
363
|
# ext
|
348
364
|
# }
|
349
365
|
# --- NOTE: source may be a file URL, e.g. import.meta.url
|
350
366
|
|
351
367
|
debug "enter parseSource()"
|
352
|
-
assert isString(source)
|
368
|
+
assert isString(source),\
|
369
|
+
"parseSource(): source not a string: #{OL(source)}"
|
353
370
|
if source == 'unit test'
|
354
371
|
croak "A source of 'unit test' is deprecated"
|
355
372
|
if source.match(/^file\:\/\//)
|
356
373
|
source = urllib.fileURLToPath(source)
|
357
374
|
|
358
|
-
|
359
|
-
if hInfo.dir
|
360
|
-
dir = mkpath(hInfo.dir) # change \ to /
|
375
|
+
if isDir(source)
|
361
376
|
hSourceInfo = {
|
362
|
-
dir
|
363
|
-
fullpath:
|
364
|
-
filename: hInfo.base
|
365
|
-
stub: hInfo.name
|
366
|
-
ext: hInfo.ext
|
377
|
+
dir: source
|
378
|
+
fullpath: source
|
367
379
|
}
|
368
380
|
else
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
381
|
+
hInfo = pathlib.parse(source)
|
382
|
+
if hInfo.dir
|
383
|
+
dir = mkpath(hInfo.dir) # change \ to /
|
384
|
+
hSourceInfo = {
|
385
|
+
dir
|
386
|
+
fullpath: mkpath(dir, hInfo.base)
|
387
|
+
filename: hInfo.base
|
388
|
+
stub: hInfo.name
|
389
|
+
ext: hInfo.ext
|
390
|
+
}
|
391
|
+
else
|
392
|
+
hSourceInfo = {
|
393
|
+
filename: hInfo.base
|
394
|
+
stub: hInfo.name
|
395
|
+
ext: hInfo.ext
|
396
|
+
}
|
374
397
|
debug "return from parseSource()", hSourceInfo
|
375
398
|
return hSourceInfo
|
376
399
|
|
package/src/fs_utils.js
CHANGED
@@ -22,7 +22,8 @@ import {
|
|
22
22
|
isArray,
|
23
23
|
isRegExp,
|
24
24
|
isFunction,
|
25
|
-
croak
|
25
|
+
croak,
|
26
|
+
OL
|
26
27
|
} from '@jdeighan/coffee-utils';
|
27
28
|
|
28
29
|
import {
|
@@ -84,7 +85,16 @@ export var isFile = function(fullpath) {
|
|
84
85
|
|
85
86
|
// ---------------------------------------------------------------------------
|
86
87
|
export var isDir = function(fullpath) {
|
87
|
-
|
88
|
+
var obj;
|
89
|
+
try {
|
90
|
+
obj = fs.lstatSync(fullpath);
|
91
|
+
if (obj == null) {
|
92
|
+
return false;
|
93
|
+
}
|
94
|
+
return obj.isDirectory();
|
95
|
+
} catch (error1) {
|
96
|
+
return false;
|
97
|
+
}
|
88
98
|
};
|
89
99
|
|
90
100
|
// ---------------------------------------------------------------------------
|
@@ -94,6 +104,17 @@ export var isSimpleFileName = function(path) {
|
|
94
104
|
return !h.root && !h.dir && h.base;
|
95
105
|
};
|
96
106
|
|
107
|
+
// ---------------------------------------------------------------------------
|
108
|
+
export var fileStub = function(path) {
|
109
|
+
var lMatches;
|
110
|
+
assert(isString(path), "fileExt(): path not a string");
|
111
|
+
if (lMatches = path.match(/^(.*)\.[A-Za-z0-9_]+$/)) {
|
112
|
+
return lMatches[1];
|
113
|
+
} else {
|
114
|
+
return '';
|
115
|
+
}
|
116
|
+
};
|
117
|
+
|
97
118
|
// ---------------------------------------------------------------------------
|
98
119
|
export var fileExt = function(path) {
|
99
120
|
var lMatches;
|
@@ -405,34 +426,42 @@ export var parseSource = function(source) {
|
|
405
426
|
// --- returns {
|
406
427
|
// dir
|
407
428
|
// filename
|
429
|
+
// fullpath
|
408
430
|
// stub
|
409
431
|
// ext
|
410
432
|
// }
|
411
433
|
// --- NOTE: source may be a file URL, e.g. import.meta.url
|
412
434
|
debug("enter parseSource()");
|
413
|
-
assert(isString(source),
|
435
|
+
assert(isString(source), `parseSource(): source not a string: ${OL(source)}`);
|
414
436
|
if (source === 'unit test') {
|
415
437
|
croak("A source of 'unit test' is deprecated");
|
416
438
|
}
|
417
439
|
if (source.match(/^file\:\/\//)) {
|
418
440
|
source = urllib.fileURLToPath(source);
|
419
441
|
}
|
420
|
-
|
421
|
-
if (hInfo.dir) {
|
422
|
-
dir = mkpath(hInfo.dir); // change \ to /
|
442
|
+
if (isDir(source)) {
|
423
443
|
hSourceInfo = {
|
424
|
-
dir,
|
425
|
-
fullpath:
|
426
|
-
filename: hInfo.base,
|
427
|
-
stub: hInfo.name,
|
428
|
-
ext: hInfo.ext
|
444
|
+
dir: source,
|
445
|
+
fullpath: source
|
429
446
|
};
|
430
447
|
} else {
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
448
|
+
hInfo = pathlib.parse(source);
|
449
|
+
if (hInfo.dir) {
|
450
|
+
dir = mkpath(hInfo.dir); // change \ to /
|
451
|
+
hSourceInfo = {
|
452
|
+
dir,
|
453
|
+
fullpath: mkpath(dir, hInfo.base),
|
454
|
+
filename: hInfo.base,
|
455
|
+
stub: hInfo.name,
|
456
|
+
ext: hInfo.ext
|
457
|
+
};
|
458
|
+
} else {
|
459
|
+
hSourceInfo = {
|
460
|
+
filename: hInfo.base,
|
461
|
+
stub: hInfo.name,
|
462
|
+
ext: hInfo.ext
|
463
|
+
};
|
464
|
+
}
|
436
465
|
}
|
437
466
|
debug("return from parseSource()", hSourceInfo);
|
438
467
|
return hSourceInfo;
|