@jdeighan/coffee-utils 14.0.36 → 14.0.38
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 +4 -4
- package/src/fs.coffee +99 -30
- package/src/fs.js +121 -40
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jdeighan/coffee-utils",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "14.0.
|
|
4
|
+
"version": "14.0.38",
|
|
5
5
|
"description": "A set of utility functions for CoffeeScript",
|
|
6
6
|
"main": "coffee_utils.js",
|
|
7
7
|
"exports": {
|
|
@@ -45,14 +45,14 @@
|
|
|
45
45
|
},
|
|
46
46
|
"homepage": "https://github.com/johndeighan/coffee-utils#readme",
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@jdeighan/base-utils": "^4.0.
|
|
48
|
+
"@jdeighan/base-utils": "^4.0.26",
|
|
49
49
|
"cross-env": "^7.0.3",
|
|
50
50
|
"n-readlines": "^1.0.1",
|
|
51
51
|
"readline-sync": "^1.4.10",
|
|
52
|
-
"svelte": "^3.
|
|
52
|
+
"svelte": "^3.58.0"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@jdeighan/unit-tester": "^3.0.
|
|
55
|
+
"@jdeighan/unit-tester": "^3.0.44",
|
|
56
56
|
"ava": "^5.2.0"
|
|
57
57
|
}
|
|
58
58
|
}
|
package/src/fs.coffee
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
# fs.coffee
|
|
2
2
|
|
|
3
|
+
import os from 'os'
|
|
3
4
|
import pathlib from 'path'
|
|
4
5
|
import urllib from 'url'
|
|
5
6
|
import fs from 'fs'
|
|
7
|
+
import {
|
|
8
|
+
readFile, writeFile, rm,
|
|
9
|
+
} from 'node:fs/promises'
|
|
10
|
+
import {execSync} from 'node:child_process'
|
|
6
11
|
import readline from 'readline'
|
|
7
12
|
import NReadLines from 'n-readlines'
|
|
8
13
|
|
|
@@ -16,6 +21,68 @@ import {LOG, LOGVALUE} from '@jdeighan/base-utils/log'
|
|
|
16
21
|
import {dbg, dbgEnter, dbgReturn} from '@jdeighan/base-utils/debug'
|
|
17
22
|
import {fromTAML} from '@jdeighan/base-utils/taml'
|
|
18
23
|
|
|
24
|
+
# ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
export mkpath = (lParts...) =>
|
|
27
|
+
|
|
28
|
+
# --- Ignore empty parts
|
|
29
|
+
lNewParts = []
|
|
30
|
+
for part in lParts
|
|
31
|
+
if nonEmpty(part)
|
|
32
|
+
lNewParts.push part
|
|
33
|
+
|
|
34
|
+
newPath = lNewParts.join('/').replaceAll('\\', '/')
|
|
35
|
+
if lMatches = newPath.match(/^([A-Z])\:(.*)$/)
|
|
36
|
+
[_, drive, rest] = lMatches
|
|
37
|
+
return "#{drive.toLowerCase()}:#{rest}"
|
|
38
|
+
else
|
|
39
|
+
return newPath
|
|
40
|
+
|
|
41
|
+
# ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
export mkdir = (dirpath) =>
|
|
44
|
+
|
|
45
|
+
try
|
|
46
|
+
fs.mkdirSync dirpath
|
|
47
|
+
catch err
|
|
48
|
+
if (err.code == 'EEXIST')
|
|
49
|
+
console.log 'Directory exists. Please choose another name'
|
|
50
|
+
else
|
|
51
|
+
console.log err
|
|
52
|
+
process.exit 1
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
# ---------------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
export rmdir = (dirpath) =>
|
|
58
|
+
|
|
59
|
+
await rm dirpath, {recursive: true}
|
|
60
|
+
return
|
|
61
|
+
|
|
62
|
+
# ---------------------------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
export rmfile = (filepath) =>
|
|
65
|
+
|
|
66
|
+
await rm filepath
|
|
67
|
+
return
|
|
68
|
+
|
|
69
|
+
# --------------------------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
export execCmd = (cmdLine) =>
|
|
72
|
+
|
|
73
|
+
execSync cmdLine, {}, (error, stdout, stderr) =>
|
|
74
|
+
if (error)
|
|
75
|
+
LOG "ERROR in #{cmdLine}: #{error.code}"
|
|
76
|
+
process.exit 1
|
|
77
|
+
return stdout
|
|
78
|
+
|
|
79
|
+
# ---------------------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
export cloneRepo = (user, repo, dir) =>
|
|
82
|
+
|
|
83
|
+
git_repo = "https://github.com/#{user}/#{repo}.git"
|
|
84
|
+
return execCmd "git clone #{git_repo} #{dir}"
|
|
85
|
+
|
|
19
86
|
# ---------------------------------------------------------------------------
|
|
20
87
|
# mydir() - pass argument import.meta.url and it will return
|
|
21
88
|
# the directory your file is in
|
|
@@ -29,6 +96,12 @@ export mydir = (url) =>
|
|
|
29
96
|
|
|
30
97
|
# ---------------------------------------------------------------------------
|
|
31
98
|
|
|
99
|
+
export homeDir = () =>
|
|
100
|
+
|
|
101
|
+
return mkpath(os.homedir())
|
|
102
|
+
|
|
103
|
+
# ---------------------------------------------------------------------------
|
|
104
|
+
|
|
32
105
|
export projRoot = (url) =>
|
|
33
106
|
|
|
34
107
|
dir = mydir(url)
|
|
@@ -108,23 +181,6 @@ export fileExt = (path) =>
|
|
|
108
181
|
|
|
109
182
|
# ---------------------------------------------------------------------------
|
|
110
183
|
|
|
111
|
-
export mkpath = (lParts...) =>
|
|
112
|
-
|
|
113
|
-
# --- Ignore empty parts
|
|
114
|
-
lNewParts = []
|
|
115
|
-
for part in lParts
|
|
116
|
-
if nonEmpty(part)
|
|
117
|
-
lNewParts.push part
|
|
118
|
-
|
|
119
|
-
newPath = lNewParts.join('/').replace(/\\/g, '/')
|
|
120
|
-
if lMatches = newPath.match(/^([A-Z])\:(.*)$/)
|
|
121
|
-
[_, drive, rest] = lMatches
|
|
122
|
-
return "#{drive.toLowerCase()}:#{rest}"
|
|
123
|
-
else
|
|
124
|
-
return newPath
|
|
125
|
-
|
|
126
|
-
# ---------------------------------------------------------------------------
|
|
127
|
-
|
|
128
184
|
export getFullPath = (filepath) =>
|
|
129
185
|
|
|
130
186
|
return mkpath(pathlib.resolve(filepath))
|
|
@@ -230,10 +286,11 @@ export forEachSetOfBlocks = (filepath, func,
|
|
|
230
286
|
return
|
|
231
287
|
|
|
232
288
|
# ---------------------------------------------------------------------------
|
|
233
|
-
# slurp - read
|
|
289
|
+
# slurp - read a file into a string
|
|
234
290
|
|
|
235
|
-
export slurp = (filepath,
|
|
291
|
+
export slurp = (filepath, hOptions={}) =>
|
|
236
292
|
|
|
293
|
+
{maxLines, format} = getOptions(hOptions)
|
|
237
294
|
if defined(maxLines)
|
|
238
295
|
lLines = []
|
|
239
296
|
forEachLineInFile filepath, (line, nLines) ->
|
|
@@ -243,20 +300,33 @@ export slurp = (filepath, maxLines=undef) =>
|
|
|
243
300
|
else
|
|
244
301
|
filepath = filepath.replace(/\//g, "\\")
|
|
245
302
|
contents = fs.readFileSync(filepath, 'utf8').toString()
|
|
246
|
-
|
|
303
|
+
switch format
|
|
304
|
+
when 'TAML'
|
|
305
|
+
return fromTAML(contents)
|
|
306
|
+
when 'JSON'
|
|
307
|
+
return JSON.parse(contents)
|
|
308
|
+
else
|
|
309
|
+
assert notdefined(format), "Unknown format: #{format}"
|
|
310
|
+
return contents
|
|
247
311
|
|
|
248
312
|
# ---------------------------------------------------------------------------
|
|
249
313
|
# barf - write a string to a file
|
|
250
314
|
|
|
251
|
-
export barf = (filepath, contents) =>
|
|
315
|
+
export barf = (filepath, contents='', hOptions={}) =>
|
|
252
316
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
317
|
+
{format} = getOptions(hOptions)
|
|
318
|
+
switch format
|
|
319
|
+
when 'TAML'
|
|
320
|
+
contents = toTAML(contents)
|
|
321
|
+
when 'JSON'
|
|
322
|
+
contents = JSON.stringify(contents, null, 3)
|
|
323
|
+
else
|
|
324
|
+
assert notdefined(format), "Unknown format: #{format}"
|
|
325
|
+
if isArray(contents)
|
|
326
|
+
contents = toBlock(contents)
|
|
327
|
+
else if ! isString(contents)
|
|
328
|
+
croak "barf(): Invalid contents"
|
|
329
|
+
contents = rtrim(contents) + "\n"
|
|
260
330
|
fs.writeFileSync(filepath, contents, {encoding: 'utf8'})
|
|
261
331
|
return
|
|
262
332
|
|
|
@@ -499,5 +569,4 @@ export parseSource = (source) =>
|
|
|
499
569
|
|
|
500
570
|
export slurpTAML = (filepath) =>
|
|
501
571
|
|
|
502
|
-
|
|
503
|
-
return fromTAML(contents)
|
|
572
|
+
return slurp(filepath, {format: 'TAML'})
|
package/src/fs.js
CHANGED
|
@@ -2,12 +2,24 @@
|
|
|
2
2
|
// fs.coffee
|
|
3
3
|
var isSystemDir;
|
|
4
4
|
|
|
5
|
+
import os from 'os';
|
|
6
|
+
|
|
5
7
|
import pathlib from 'path';
|
|
6
8
|
|
|
7
9
|
import urllib from 'url';
|
|
8
10
|
|
|
9
11
|
import fs from 'fs';
|
|
10
12
|
|
|
13
|
+
import {
|
|
14
|
+
readFile,
|
|
15
|
+
writeFile,
|
|
16
|
+
rm
|
|
17
|
+
} from 'node:fs/promises';
|
|
18
|
+
|
|
19
|
+
import {
|
|
20
|
+
execSync
|
|
21
|
+
} from 'node:child_process';
|
|
22
|
+
|
|
11
23
|
import readline from 'readline';
|
|
12
24
|
|
|
13
25
|
import NReadLines from 'n-readlines';
|
|
@@ -51,6 +63,72 @@ import {
|
|
|
51
63
|
fromTAML
|
|
52
64
|
} from '@jdeighan/base-utils/taml';
|
|
53
65
|
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
export var mkpath = (...lParts) => {
|
|
68
|
+
var _, drive, i, lMatches, lNewParts, len, newPath, part, rest;
|
|
69
|
+
// --- Ignore empty parts
|
|
70
|
+
lNewParts = [];
|
|
71
|
+
for (i = 0, len = lParts.length; i < len; i++) {
|
|
72
|
+
part = lParts[i];
|
|
73
|
+
if (nonEmpty(part)) {
|
|
74
|
+
lNewParts.push(part);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
newPath = lNewParts.join('/').replaceAll('\\', '/');
|
|
78
|
+
if (lMatches = newPath.match(/^([A-Z])\:(.*)$/)) {
|
|
79
|
+
[_, drive, rest] = lMatches;
|
|
80
|
+
return `${drive.toLowerCase()}:${rest}`;
|
|
81
|
+
} else {
|
|
82
|
+
return newPath;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
export var mkdir = (dirpath) => {
|
|
88
|
+
var err;
|
|
89
|
+
try {
|
|
90
|
+
fs.mkdirSync(dirpath);
|
|
91
|
+
} catch (error1) {
|
|
92
|
+
err = error1;
|
|
93
|
+
if (err.code === 'EEXIST') {
|
|
94
|
+
console.log('Directory exists. Please choose another name');
|
|
95
|
+
} else {
|
|
96
|
+
console.log(err);
|
|
97
|
+
}
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
export var rmdir = async(dirpath) => {
|
|
104
|
+
await rm(dirpath, {
|
|
105
|
+
recursive: true
|
|
106
|
+
});
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
export var rmfile = async(filepath) => {
|
|
111
|
+
await rm(filepath);
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// --------------------------------------------------------------------------
|
|
115
|
+
export var execCmd = (cmdLine) => {
|
|
116
|
+
execSync(cmdLine, {}, (error, stdout, stderr) => {
|
|
117
|
+
if (error) {
|
|
118
|
+
LOG(`ERROR in ${cmdLine}: ${error.code}`);
|
|
119
|
+
return process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
return stdout;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// ---------------------------------------------------------------------------
|
|
126
|
+
export var cloneRepo = (user, repo, dir) => {
|
|
127
|
+
var git_repo;
|
|
128
|
+
git_repo = `https://github.com/${user}/${repo}.git`;
|
|
129
|
+
return execCmd(`git clone ${git_repo} ${dir}`);
|
|
130
|
+
};
|
|
131
|
+
|
|
54
132
|
// ---------------------------------------------------------------------------
|
|
55
133
|
// mydir() - pass argument import.meta.url and it will return
|
|
56
134
|
// the directory your file is in
|
|
@@ -62,6 +140,11 @@ export var mydir = (url) => {
|
|
|
62
140
|
return final;
|
|
63
141
|
};
|
|
64
142
|
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
export var homeDir = () => {
|
|
145
|
+
return mkpath(os.homedir());
|
|
146
|
+
};
|
|
147
|
+
|
|
65
148
|
// ---------------------------------------------------------------------------
|
|
66
149
|
export var projRoot = (url) => {
|
|
67
150
|
var dir, rootDir;
|
|
@@ -99,7 +182,7 @@ export var getStats = (fullpath) => {
|
|
|
99
182
|
export var isFile = (fullpath) => {
|
|
100
183
|
try {
|
|
101
184
|
return getStats(fullpath).isFile();
|
|
102
|
-
} catch (
|
|
185
|
+
} catch (error1) {
|
|
103
186
|
return false;
|
|
104
187
|
}
|
|
105
188
|
};
|
|
@@ -108,7 +191,7 @@ export var isFile = (fullpath) => {
|
|
|
108
191
|
export var isDir = (fullpath) => {
|
|
109
192
|
try {
|
|
110
193
|
return getStats(fullpath).isDirectory();
|
|
111
|
-
} catch (
|
|
194
|
+
} catch (error1) {
|
|
112
195
|
return false;
|
|
113
196
|
}
|
|
114
197
|
};
|
|
@@ -142,26 +225,6 @@ export var fileExt = (path) => {
|
|
|
142
225
|
}
|
|
143
226
|
};
|
|
144
227
|
|
|
145
|
-
// ---------------------------------------------------------------------------
|
|
146
|
-
export var mkpath = (...lParts) => {
|
|
147
|
-
var _, drive, i, lMatches, lNewParts, len, newPath, part, rest;
|
|
148
|
-
// --- Ignore empty parts
|
|
149
|
-
lNewParts = [];
|
|
150
|
-
for (i = 0, len = lParts.length; i < len; i++) {
|
|
151
|
-
part = lParts[i];
|
|
152
|
-
if (nonEmpty(part)) {
|
|
153
|
-
lNewParts.push(part);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
newPath = lNewParts.join('/').replace(/\\/g, '/');
|
|
157
|
-
if (lMatches = newPath.match(/^([A-Z])\:(.*)$/)) {
|
|
158
|
-
[_, drive, rest] = lMatches;
|
|
159
|
-
return `${drive.toLowerCase()}:${rest}`;
|
|
160
|
-
} else {
|
|
161
|
-
return newPath;
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
|
|
165
228
|
// ---------------------------------------------------------------------------
|
|
166
229
|
export var getFullPath = (filepath) => {
|
|
167
230
|
return mkpath(pathlib.resolve(filepath));
|
|
@@ -273,9 +336,10 @@ export var forEachSetOfBlocks = (filepath, func, block_regexp = /^-{16,}$/, set_
|
|
|
273
336
|
};
|
|
274
337
|
|
|
275
338
|
// ---------------------------------------------------------------------------
|
|
276
|
-
// slurp - read
|
|
277
|
-
export var slurp = (filepath,
|
|
278
|
-
var contents, lLines;
|
|
339
|
+
// slurp - read a file into a string
|
|
340
|
+
export var slurp = (filepath, hOptions = {}) => {
|
|
341
|
+
var contents, format, lLines, maxLines;
|
|
342
|
+
({maxLines, format} = getOptions(hOptions));
|
|
279
343
|
if (defined(maxLines)) {
|
|
280
344
|
lLines = [];
|
|
281
345
|
forEachLineInFile(filepath, function(line, nLines) {
|
|
@@ -287,21 +351,38 @@ export var slurp = (filepath, maxLines = undef) => {
|
|
|
287
351
|
filepath = filepath.replace(/\//g, "\\");
|
|
288
352
|
contents = fs.readFileSync(filepath, 'utf8').toString();
|
|
289
353
|
}
|
|
290
|
-
|
|
354
|
+
switch (format) {
|
|
355
|
+
case 'TAML':
|
|
356
|
+
return fromTAML(contents);
|
|
357
|
+
case 'JSON':
|
|
358
|
+
return JSON.parse(contents);
|
|
359
|
+
default:
|
|
360
|
+
assert(notdefined(format), `Unknown format: ${format}`);
|
|
361
|
+
return contents;
|
|
362
|
+
}
|
|
291
363
|
};
|
|
292
364
|
|
|
293
365
|
// ---------------------------------------------------------------------------
|
|
294
366
|
// barf - write a string to a file
|
|
295
|
-
export var barf = (filepath, contents) => {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
367
|
+
export var barf = (filepath, contents = '', hOptions = {}) => {
|
|
368
|
+
var format;
|
|
369
|
+
({format} = getOptions(hOptions));
|
|
370
|
+
switch (format) {
|
|
371
|
+
case 'TAML':
|
|
372
|
+
contents = toTAML(contents);
|
|
373
|
+
break;
|
|
374
|
+
case 'JSON':
|
|
375
|
+
contents = JSON.stringify(contents, null, 3);
|
|
376
|
+
break;
|
|
377
|
+
default:
|
|
378
|
+
assert(notdefined(format), `Unknown format: ${format}`);
|
|
379
|
+
if (isArray(contents)) {
|
|
380
|
+
contents = toBlock(contents);
|
|
381
|
+
} else if (!isString(contents)) {
|
|
382
|
+
croak("barf(): Invalid contents");
|
|
383
|
+
}
|
|
384
|
+
contents = rtrim(contents) + "\n";
|
|
303
385
|
}
|
|
304
|
-
contents = rtrim(contents) + "\n";
|
|
305
386
|
fs.writeFileSync(filepath, contents, {
|
|
306
387
|
encoding: 'utf8'
|
|
307
388
|
});
|
|
@@ -333,8 +414,8 @@ export var removeFileWithExt = (path, newExt, hOptions = {}) => {
|
|
|
333
414
|
LOG(` unlink ${filename}`);
|
|
334
415
|
}
|
|
335
416
|
success = true;
|
|
336
|
-
} catch (
|
|
337
|
-
err =
|
|
417
|
+
} catch (error1) {
|
|
418
|
+
err = error1;
|
|
338
419
|
LOG(` UNLINK FAILED: ${err.message}`);
|
|
339
420
|
success = false;
|
|
340
421
|
}
|
|
@@ -576,7 +657,7 @@ export var parseSource = (source) => {
|
|
|
576
657
|
// ---------------------------------------------------------------------------
|
|
577
658
|
// slurpTAML - read TAML from a file
|
|
578
659
|
export var slurpTAML = (filepath) => {
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
660
|
+
return slurp(filepath, {
|
|
661
|
+
format: 'TAML'
|
|
662
|
+
});
|
|
582
663
|
};
|