@jdeighan/coffee-utils 7.0.74 → 8.0.1
Sign up to get free protection for your applications and to get access to all the features.
- package/package.json +1 -1
- package/src/block_utils.coffee +4 -1
- package/src/block_utils.js +6 -0
- package/src/coffee_utils.coffee +16 -2
- package/src/coffee_utils.js +19 -2
- package/src/fs_utils.coffee +27 -10
- package/src/fs_utils.js +36 -10
package/package.json
CHANGED
package/src/block_utils.coffee
CHANGED
@@ -4,7 +4,7 @@ import fs from 'fs'
|
|
4
4
|
import readline from 'readline'
|
5
5
|
|
6
6
|
import {
|
7
|
-
assert, defined, isEmpty, isString, nonEmpty, error, rtrim,
|
7
|
+
undef, assert, defined, isEmpty, isString, isArray, nonEmpty, error, rtrim,
|
8
8
|
} from '@jdeighan/coffee-utils'
|
9
9
|
|
10
10
|
# ---------------------------------------------------------------------------
|
@@ -29,6 +29,9 @@ export blockToArray = (block) ->
|
|
29
29
|
|
30
30
|
export arrayToBlock = (lLines) ->
|
31
31
|
|
32
|
+
if (lLines == undef)
|
33
|
+
return ''
|
34
|
+
assert isArray(lLines), "lLines is not an array"
|
32
35
|
lLines = lLines.filter((line) => defined(line));
|
33
36
|
if lLines.length == 0
|
34
37
|
return ''
|
package/src/block_utils.js
CHANGED
@@ -5,10 +5,12 @@ import fs from 'fs';
|
|
5
5
|
import readline from 'readline';
|
6
6
|
|
7
7
|
import {
|
8
|
+
undef,
|
8
9
|
assert,
|
9
10
|
defined,
|
10
11
|
isEmpty,
|
11
12
|
isString,
|
13
|
+
isArray,
|
12
14
|
nonEmpty,
|
13
15
|
error,
|
14
16
|
rtrim
|
@@ -35,6 +37,10 @@ export var blockToArray = function(block) {
|
|
35
37
|
// ---------------------------------------------------------------------------
|
36
38
|
// arrayToBlock - block will have no trailing whitespace
|
37
39
|
export var arrayToBlock = function(lLines) {
|
40
|
+
if (lLines === undef) {
|
41
|
+
return '';
|
42
|
+
}
|
43
|
+
assert(isArray(lLines), "lLines is not an array");
|
38
44
|
lLines = lLines.filter((line) => {
|
39
45
|
return defined(line);
|
40
46
|
});
|
package/src/coffee_utils.coffee
CHANGED
@@ -135,6 +135,16 @@ export isString = (x) ->
|
|
135
135
|
|
136
136
|
# ---------------------------------------------------------------------------
|
137
137
|
|
138
|
+
export isNonEmptyString = (x) ->
|
139
|
+
|
140
|
+
if typeof x != 'string' && x ! instanceof String
|
141
|
+
return false
|
142
|
+
if x.match(/^\s*$/)
|
143
|
+
return false
|
144
|
+
return true
|
145
|
+
|
146
|
+
# ---------------------------------------------------------------------------
|
147
|
+
|
138
148
|
export isBoolean = (x) ->
|
139
149
|
|
140
150
|
return typeof x == 'boolean'
|
@@ -269,13 +279,17 @@ export isInteger = (x) ->
|
|
269
279
|
|
270
280
|
# ---------------------------------------------------------------------------
|
271
281
|
|
272
|
-
export isUniqueList = (lItems) ->
|
282
|
+
export isUniqueList = (lItems, func=undef) ->
|
273
283
|
|
274
284
|
if ! lItems?
|
275
285
|
return true # empty list is unique
|
286
|
+
if defined(func)
|
287
|
+
assert isFunction(func), "Not a function: #{OL(func)}"
|
276
288
|
h = {}
|
277
289
|
for item in lItems
|
278
|
-
if
|
290
|
+
if defined(func) && !func(item)
|
291
|
+
return false
|
292
|
+
if defined(h[item])
|
279
293
|
return false
|
280
294
|
h[item] = 1
|
281
295
|
return true
|
package/src/coffee_utils.js
CHANGED
@@ -128,6 +128,17 @@ export var isString = function(x) {
|
|
128
128
|
return typeof x === 'string' || x instanceof String;
|
129
129
|
};
|
130
130
|
|
131
|
+
// ---------------------------------------------------------------------------
|
132
|
+
export var isNonEmptyString = function(x) {
|
133
|
+
if (typeof x !== 'string' && !(x instanceof String)) {
|
134
|
+
return false;
|
135
|
+
}
|
136
|
+
if (x.match(/^\s*$/)) {
|
137
|
+
return false;
|
138
|
+
}
|
139
|
+
return true;
|
140
|
+
};
|
141
|
+
|
131
142
|
// ---------------------------------------------------------------------------
|
132
143
|
export var isBoolean = function(x) {
|
133
144
|
return typeof x === 'boolean';
|
@@ -270,15 +281,21 @@ export var isInteger = function(x) {
|
|
270
281
|
};
|
271
282
|
|
272
283
|
// ---------------------------------------------------------------------------
|
273
|
-
export var isUniqueList = function(lItems) {
|
284
|
+
export var isUniqueList = function(lItems, func = undef) {
|
274
285
|
var h, i, item, len;
|
275
286
|
if (lItems == null) {
|
276
287
|
return true; // empty list is unique
|
277
288
|
}
|
289
|
+
if (defined(func)) {
|
290
|
+
assert(isFunction(func), `Not a function: ${OL(func)}`);
|
291
|
+
}
|
278
292
|
h = {};
|
279
293
|
for (i = 0, len = lItems.length; i < len; i++) {
|
280
294
|
item = lItems[i];
|
281
|
-
if (
|
295
|
+
if (defined(func) && !func(item)) {
|
296
|
+
return false;
|
297
|
+
}
|
298
|
+
if (defined(h[item])) {
|
282
299
|
return false;
|
283
300
|
}
|
284
301
|
h[item] = 1;
|
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, defined, rtrim, error, isEmpty, nonEmpty,
|
10
|
-
isString, isArray, isRegExp, isFunction, croak, OL,
|
10
|
+
isString, isArray, isHash, 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'
|
@@ -268,7 +268,13 @@ export forEachFile = (dir, cb, filt=undef, level=0) ->
|
|
268
268
|
|
269
269
|
# ---------------------------------------------------------------------------
|
270
270
|
|
271
|
-
export pathTo = (fname, searchDir,
|
271
|
+
export pathTo = (fname, searchDir, hOptions={}) ->
|
272
|
+
|
273
|
+
{direction, relative} = hOptions
|
274
|
+
if isEmpty(direction)
|
275
|
+
direction = 'down'
|
276
|
+
if isEmpty(relative)
|
277
|
+
relative = false
|
272
278
|
|
273
279
|
debug "enter pathTo()", fname, searchDir, direction
|
274
280
|
if ! searchDir
|
@@ -276,6 +282,8 @@ export pathTo = (fname, searchDir, direction="down") ->
|
|
276
282
|
assert fs.existsSync(searchDir), "Dir #{searchDir} does not exist"
|
277
283
|
filepath = mkpath(searchDir, fname)
|
278
284
|
if fs.existsSync(filepath)
|
285
|
+
if relative
|
286
|
+
filepath = "./#{fname}"
|
279
287
|
debug "return from pathTo() - file exists", filepath
|
280
288
|
return filepath
|
281
289
|
|
@@ -285,17 +293,26 @@ export pathTo = (fname, searchDir, direction="down") ->
|
|
285
293
|
for subdir in getSubDirs(searchDir)
|
286
294
|
dirpath = mkpath(searchDir, subdir)
|
287
295
|
debug "check #{subdir}"
|
288
|
-
if defined(fpath = pathTo(fname, dirpath))
|
296
|
+
if defined(fpath = pathTo(fname, dirpath, hOptions))
|
297
|
+
if relative
|
298
|
+
fpath = fpath.replace('./', "./#{subdir}/")
|
289
299
|
debug "return from pathTo()", fpath
|
290
300
|
return fpath
|
291
301
|
else if (direction == 'up')
|
302
|
+
nLevels = 0
|
292
303
|
while defined(dirPath = getParentDir(searchDir))
|
304
|
+
nLevels += 1
|
293
305
|
debug "check #{dirPath}"
|
294
|
-
|
295
|
-
debug "check for #{
|
296
|
-
if fs.existsSync(
|
297
|
-
|
298
|
-
|
306
|
+
fpath = mkpath(dirPath, fname)
|
307
|
+
debug "check for #{fpath}"
|
308
|
+
if fs.existsSync(fpath)
|
309
|
+
if relative
|
310
|
+
fpath = "../".repeat(nLevels) + fname
|
311
|
+
debug "return from pathTo()", fpath
|
312
|
+
return fpath
|
313
|
+
else
|
314
|
+
debug "return from pathTo()", fpath
|
315
|
+
return fpath
|
299
316
|
searchDir = dirPath
|
300
317
|
else
|
301
318
|
error "pathTo(): Invalid direction '#{direction}'"
|
@@ -309,12 +326,12 @@ export allPathsTo = (fname, searchDir) ->
|
|
309
326
|
|
310
327
|
if ! searchDir
|
311
328
|
searchDir = process.cwd()
|
312
|
-
path = pathTo(fname, searchDir, "up")
|
329
|
+
path = pathTo(fname, searchDir, {direction: "up"})
|
313
330
|
if path?
|
314
331
|
lPaths = [path] # --- build an array of paths
|
315
332
|
# --- search upward for files, but return ordered top down
|
316
333
|
while (h = pathlib.parse(path)) \
|
317
|
-
&& (path = pathTo(fname, pathlib.resolve(h.dir, '..'), "up"))
|
334
|
+
&& (path = pathTo(fname, pathlib.resolve(h.dir, '..'), {direction: "up"}))
|
318
335
|
lPaths.unshift path
|
319
336
|
return lPaths
|
320
337
|
else
|
package/src/fs_utils.js
CHANGED
@@ -21,6 +21,7 @@ import {
|
|
21
21
|
nonEmpty,
|
22
22
|
isString,
|
23
23
|
isArray,
|
24
|
+
isHash,
|
24
25
|
isRegExp,
|
25
26
|
isFunction,
|
26
27
|
croak,
|
@@ -326,8 +327,15 @@ export var forEachFile = function(dir, cb, filt = undef, level = 0) {
|
|
326
327
|
};
|
327
328
|
|
328
329
|
// ---------------------------------------------------------------------------
|
329
|
-
export var pathTo = function(fname, searchDir,
|
330
|
-
var dirPath, dirpath, filepath, fpath, i, len, ref, subdir;
|
330
|
+
export var pathTo = function(fname, searchDir, hOptions = {}) {
|
331
|
+
var dirPath, direction, dirpath, filepath, fpath, i, len, nLevels, ref, relative, subdir;
|
332
|
+
({direction, relative} = hOptions);
|
333
|
+
if (isEmpty(direction)) {
|
334
|
+
direction = 'down';
|
335
|
+
}
|
336
|
+
if (isEmpty(relative)) {
|
337
|
+
relative = false;
|
338
|
+
}
|
331
339
|
debug("enter pathTo()", fname, searchDir, direction);
|
332
340
|
if (!searchDir) {
|
333
341
|
searchDir = process.cwd();
|
@@ -335,6 +343,9 @@ export var pathTo = function(fname, searchDir, direction = "down") {
|
|
335
343
|
assert(fs.existsSync(searchDir), `Dir ${searchDir} does not exist`);
|
336
344
|
filepath = mkpath(searchDir, fname);
|
337
345
|
if (fs.existsSync(filepath)) {
|
346
|
+
if (relative) {
|
347
|
+
filepath = `./${fname}`;
|
348
|
+
}
|
338
349
|
debug("return from pathTo() - file exists", filepath);
|
339
350
|
return filepath;
|
340
351
|
}
|
@@ -346,19 +357,30 @@ export var pathTo = function(fname, searchDir, direction = "down") {
|
|
346
357
|
subdir = ref[i];
|
347
358
|
dirpath = mkpath(searchDir, subdir);
|
348
359
|
debug(`check ${subdir}`);
|
349
|
-
if (defined(fpath = pathTo(fname, dirpath))) {
|
360
|
+
if (defined(fpath = pathTo(fname, dirpath, hOptions))) {
|
361
|
+
if (relative) {
|
362
|
+
fpath = fpath.replace('./', `./${subdir}/`);
|
363
|
+
}
|
350
364
|
debug("return from pathTo()", fpath);
|
351
365
|
return fpath;
|
352
366
|
}
|
353
367
|
}
|
354
368
|
} else if (direction === 'up') {
|
369
|
+
nLevels = 0;
|
355
370
|
while (defined(dirPath = getParentDir(searchDir))) {
|
371
|
+
nLevels += 1;
|
356
372
|
debug(`check ${dirPath}`);
|
357
|
-
|
358
|
-
debug(`check for ${
|
359
|
-
if (fs.existsSync(
|
360
|
-
|
361
|
-
|
373
|
+
fpath = mkpath(dirPath, fname);
|
374
|
+
debug(`check for ${fpath}`);
|
375
|
+
if (fs.existsSync(fpath)) {
|
376
|
+
if (relative) {
|
377
|
+
fpath = "../".repeat(nLevels) + fname;
|
378
|
+
debug("return from pathTo()", fpath);
|
379
|
+
return fpath;
|
380
|
+
} else {
|
381
|
+
debug("return from pathTo()", fpath);
|
382
|
+
return fpath;
|
383
|
+
}
|
362
384
|
}
|
363
385
|
searchDir = dirPath;
|
364
386
|
}
|
@@ -375,11 +397,15 @@ export var allPathsTo = function(fname, searchDir) {
|
|
375
397
|
if (!searchDir) {
|
376
398
|
searchDir = process.cwd();
|
377
399
|
}
|
378
|
-
path = pathTo(fname, searchDir,
|
400
|
+
path = pathTo(fname, searchDir, {
|
401
|
+
direction: "up"
|
402
|
+
});
|
379
403
|
if (path != null) {
|
380
404
|
lPaths = [path]; // --- build an array of paths
|
381
405
|
// --- search upward for files, but return ordered top down
|
382
|
-
while ((h = pathlib.parse(path)) && (path = pathTo(fname, pathlib.resolve(h.dir, '..'),
|
406
|
+
while ((h = pathlib.parse(path)) && (path = pathTo(fname, pathlib.resolve(h.dir, '..'), {
|
407
|
+
direction: "up"
|
408
|
+
}))) {
|
383
409
|
lPaths.unshift(path);
|
384
410
|
}
|
385
411
|
return lPaths;
|