jsir 2.1.5 → 2.1.7
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/README.md +49 -0
- package/cmd/oaa.js +109 -74
- package/deps/evalCode.js +1 -2
- package/deps/example.js +25 -0
- package/deps/util.js +23 -15
- package/index.js +0 -4
- package/package.json +8 -3
package/README.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# jsir: JavaScript Script Management Tool
|
|
2
|
+
|
|
3
|
+
**jsir** is a command line tool designed to help manage and organize your JavaScript files. With **jsir**, you can edit, run, and compare JavaScript files, view file dependencies, and switch between different workspaces.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
You can install **jsir** globally using npm:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
npm install -g jsir
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Getting Started
|
|
14
|
+
|
|
15
|
+
To start using **jsir**, simply run the command:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
jsir
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This will open the **jsir** REPL interface where you can start managing your files.
|
|
22
|
+
|
|
23
|
+
## Commands
|
|
24
|
+
|
|
25
|
+
Here is a list of available commands in **jsir**:
|
|
26
|
+
|
|
27
|
+
| Keyword | Short | Comment |
|
|
28
|
+
| --- | --- | --- |
|
|
29
|
+
| .add | .a | Add file |
|
|
30
|
+
| .clear | .C | Clear task |
|
|
31
|
+
| .compare | .c | Compare files |
|
|
32
|
+
| .deps | .d | View file dependencies |
|
|
33
|
+
| .edit | .e | Edit file |
|
|
34
|
+
| .file | .f | Working file mode |
|
|
35
|
+
| .get | .g | Get file |
|
|
36
|
+
| .help | .h | Help documentation |
|
|
37
|
+
| .list | .l | View file list |
|
|
38
|
+
| .quit | .q | Exit |
|
|
39
|
+
| .rename | .n | Rename file |
|
|
40
|
+
| .repl | .p | Interactive interface |
|
|
41
|
+
| .rm | .R | Remove file |
|
|
42
|
+
| .run | .r | Quick execution |
|
|
43
|
+
| .see | .s | View file |
|
|
44
|
+
| .switch | .S | Switch workspace |
|
|
45
|
+
| .uninstall | .u | Uninstall workspace |
|
|
46
|
+
| .version | .v | View version |
|
|
47
|
+
| .workspace | .w | Workspace Management |
|
|
48
|
+
|
|
49
|
+
For detailed information on how to use each command, use the `.help` command followed by the short keyword of the command.
|
package/cmd/oaa.js
CHANGED
|
@@ -3,10 +3,11 @@ const $lib = require('../deps/util');
|
|
|
3
3
|
const {
|
|
4
4
|
getLibDataDir, trim, regEach, getConfig, mkdir, reget,
|
|
5
5
|
getCbText, e, sleep, objDataFile, vl, md5, BigNumber,
|
|
6
|
-
|
|
6
|
+
arrayDataFile, infoStr, warnStr, errorStack,
|
|
7
7
|
getInfo, ei, pad, msgStr, getType,
|
|
8
8
|
errorTag, isArgsMatch, draftQuery, setConfig,
|
|
9
|
-
$log, $draft, getTextComments, getOr, importG
|
|
9
|
+
$log, $draft, getTextComments, getOr, importG, requireG,
|
|
10
|
+
clearConsole
|
|
10
11
|
} = $lib;
|
|
11
12
|
const _args = process.argv.slice(2).map(trim);
|
|
12
13
|
const evalCode = require('../deps/evalCode')
|
|
@@ -15,8 +16,8 @@ const _chokidar = require('chokidar');
|
|
|
15
16
|
const setting = require('../deps/setting')
|
|
16
17
|
const _fs = require('fs')
|
|
17
18
|
const readline = require("readline");
|
|
18
|
-
const
|
|
19
|
-
|
|
19
|
+
const packageJson = require("../package.json");
|
|
20
|
+
const example = require("../deps/example");
|
|
20
21
|
const _workspaceConfigFile = 'workspace.json';
|
|
21
22
|
const _libDataDir = getLibDataDir()
|
|
22
23
|
const _tipsOnRm = {}
|
|
@@ -30,6 +31,10 @@ const $config = {
|
|
|
30
31
|
get: getConfig,
|
|
31
32
|
set: setConfig
|
|
32
33
|
}
|
|
34
|
+
const CONSOLE = Object.assign({}, console);
|
|
35
|
+
const info = (msg) => $lib.info(msg, CONSOLE);
|
|
36
|
+
const warn = (msg) => $lib.warn(msg, CONSOLE);
|
|
37
|
+
const error = (msg, tag) => $lib.error(msg, tag, CONSOLE);
|
|
33
38
|
|
|
34
39
|
let _cmdMapFile = setting.name + 'CmdMap.json'
|
|
35
40
|
let _cmdMap = {}
|
|
@@ -40,14 +45,14 @@ let _noAppendNextLine = true
|
|
|
40
45
|
|
|
41
46
|
const _onLazyGetMap = {}
|
|
42
47
|
const _data = {}
|
|
43
|
-
const
|
|
48
|
+
const _lazyTime = 5 * 60 * 1000
|
|
44
49
|
const _dealOnLazyGet = (key) => {
|
|
45
50
|
if (_noAppendNextLine || !_onLazyGetMap[key]) {
|
|
46
51
|
return _data[key]
|
|
47
52
|
}
|
|
48
53
|
let item = _onLazyGetMap[key]
|
|
49
54
|
if (Date.now() <= item.startTime) {
|
|
50
|
-
item.startTime = Date.now() +
|
|
55
|
+
item.startTime = Date.now() + _lazyTime
|
|
51
56
|
return _data[key]
|
|
52
57
|
}
|
|
53
58
|
let flag = _onLazyGetMap[key].fn()
|
|
@@ -55,14 +60,14 @@ const _dealOnLazyGet = (key) => {
|
|
|
55
60
|
return new Promise(async (resolve, reject) => {
|
|
56
61
|
try {
|
|
57
62
|
await flag
|
|
58
|
-
item.startTime = Date.now() +
|
|
63
|
+
item.startTime = Date.now() + _lazyTime
|
|
59
64
|
resolve(_data[key])
|
|
60
65
|
} catch (e) {
|
|
61
66
|
reject(e)
|
|
62
67
|
}
|
|
63
68
|
})
|
|
64
69
|
} else {
|
|
65
|
-
item.startTime = Date.now() +
|
|
70
|
+
item.startTime = Date.now() + _lazyTime
|
|
66
71
|
return _data[key]
|
|
67
72
|
}
|
|
68
73
|
}
|
|
@@ -70,7 +75,7 @@ const _dataSet = (key, val, onLazyGet) => {
|
|
|
70
75
|
if (onLazyGet) {
|
|
71
76
|
_onLazyGetMap[key] = {
|
|
72
77
|
fn: onLazyGet,
|
|
73
|
-
startTime: Date.now() +
|
|
78
|
+
startTime: Date.now() + _lazyTime
|
|
74
79
|
}
|
|
75
80
|
}
|
|
76
81
|
return _data[key] = val
|
|
@@ -209,7 +214,7 @@ async function watchFile(uniqueName) {
|
|
|
209
214
|
text = newText;
|
|
210
215
|
if (trim(exeStr)) {
|
|
211
216
|
try {
|
|
212
|
-
|
|
217
|
+
CONSOLE.log("\n" + infoStr("------ workFile run ------"))
|
|
213
218
|
await wrapperInput("# " + exeStr)
|
|
214
219
|
} catch (e) {
|
|
215
220
|
error(e)
|
|
@@ -377,7 +382,9 @@ function _nextLine(callback, promptStr, hidden, resolve, end, isText) {
|
|
|
377
382
|
_haveWrapperInput = true;
|
|
378
383
|
closeRl()
|
|
379
384
|
inputStr = inputStr.replace(/\s+$/, '');
|
|
380
|
-
|
|
385
|
+
if (!isText && /^\d+$/.test(inputStr) && /^\s+/.test(textLine)) {
|
|
386
|
+
inputStr = "& " + inputStr;
|
|
387
|
+
}
|
|
381
388
|
let pro = (callback || wrapperInput)(inputStr);
|
|
382
389
|
resolve && resolve(inputStr);
|
|
383
390
|
try {
|
|
@@ -386,7 +393,11 @@ function _nextLine(callback, promptStr, hidden, resolve, end, isText) {
|
|
|
386
393
|
if ((callback || wrapperInput) === wrapperInput) {
|
|
387
394
|
if (!_noAppendNextLine) {
|
|
388
395
|
if (/^\s+$/.test(textLine)) {
|
|
389
|
-
|
|
396
|
+
if (textLine.length > 1) {
|
|
397
|
+
clearConsole(false)
|
|
398
|
+
} else {
|
|
399
|
+
clearConsole();
|
|
400
|
+
}
|
|
390
401
|
listCmd();
|
|
391
402
|
nextLine(null, defaultPromptStr(true))
|
|
392
403
|
} else {
|
|
@@ -422,30 +433,9 @@ async function save(args) {
|
|
|
422
433
|
}
|
|
423
434
|
let resp;
|
|
424
435
|
if (args[0] === 'e') {
|
|
425
|
-
resp =
|
|
426
|
-
A test exe script
|
|
427
|
-
*/
|
|
428
|
-
|
|
429
|
-
$defArgs({
|
|
430
|
-
arg: 'required argument',
|
|
431
|
-
_arg: 'optional argument'
|
|
432
|
-
})
|
|
433
|
-
|
|
434
|
-
let {} = $lib // Reference to built-in resources
|
|
435
|
-
|
|
436
|
-
console.log($args)
|
|
437
|
-
|
|
438
|
-
return {}
|
|
439
|
-
`;
|
|
436
|
+
resp = example.exeFile;
|
|
440
437
|
} else if (args[0] === 'i') {
|
|
441
|
-
resp =
|
|
442
|
-
A test init script
|
|
443
|
-
*/
|
|
444
|
-
|
|
445
|
-
let {} = $lib // Reference to built-in resources
|
|
446
|
-
|
|
447
|
-
return {}
|
|
448
|
-
`;
|
|
438
|
+
resp = example.initFile;
|
|
449
439
|
} else {
|
|
450
440
|
resp = await getCbText();
|
|
451
441
|
}
|
|
@@ -522,6 +512,9 @@ function listCmd(tmpMap) {
|
|
|
522
512
|
warn("no items")
|
|
523
513
|
} else {
|
|
524
514
|
items.forEach(item => {
|
|
515
|
+
if (tmpList && item.key) {
|
|
516
|
+
item.key = ' - '
|
|
517
|
+
}
|
|
525
518
|
if (item.type) {
|
|
526
519
|
let pair = parseUniqueName(item.name);
|
|
527
520
|
if (item.type.startsWith('exe.')) {
|
|
@@ -534,7 +527,7 @@ function listCmd(tmpMap) {
|
|
|
534
527
|
item.name = pair[0] + '/' + item.name
|
|
535
528
|
}
|
|
536
529
|
})
|
|
537
|
-
|
|
530
|
+
CONSOLE.table(items)
|
|
538
531
|
}
|
|
539
532
|
}
|
|
540
533
|
|
|
@@ -556,11 +549,11 @@ async function _wrapperInput(str) {
|
|
|
556
549
|
}
|
|
557
550
|
if (/^&/.test(str)) {
|
|
558
551
|
let cmdStr = trim(str.substr(1));
|
|
559
|
-
if (/^\d+$/.test(cmdStr)
|
|
552
|
+
if (/^\d+$/.test(cmdStr)) {
|
|
560
553
|
if (_cmdMap[cmdStr]) {
|
|
561
554
|
ei('vi', [getFullPath(_cmdMap[cmdStr])])
|
|
562
555
|
} else {
|
|
563
|
-
|
|
556
|
+
ei('vi', ['-n'])
|
|
564
557
|
}
|
|
565
558
|
} else if (cmdStr) {
|
|
566
559
|
ei(cmdStr.split(/\s+/)[0],
|
|
@@ -576,7 +569,7 @@ async function _wrapperInput(str) {
|
|
|
576
569
|
} else {
|
|
577
570
|
let fLine = trim(str.substr(1))
|
|
578
571
|
if (fLine) {
|
|
579
|
-
|
|
572
|
+
CONSOLE.log(draftQuery(fLine).join("\n"))
|
|
580
573
|
} else {
|
|
581
574
|
let text = str.substr(1) + "\n" + await nextText(line => line, fstr)
|
|
582
575
|
$draft(text)
|
|
@@ -587,14 +580,14 @@ async function _wrapperInput(str) {
|
|
|
587
580
|
let isStar = str.startsWith('*')
|
|
588
581
|
let text = trim(str.replace(/^[$#*]/, ''))
|
|
589
582
|
if (is$) {
|
|
590
|
-
|
|
583
|
+
CONSOLE.log(await evalText('return ' + text))
|
|
591
584
|
} else if (isStar) {
|
|
592
585
|
if (!text) {
|
|
593
586
|
text = '$context';
|
|
594
587
|
}
|
|
595
588
|
let result = await evalText('return ' + text)
|
|
596
589
|
if (!result || typeof result === 'string' || Object.keys(result).length === 0) {
|
|
597
|
-
|
|
590
|
+
CONSOLE.nable([getInfo(result)])
|
|
598
591
|
return
|
|
599
592
|
}
|
|
600
593
|
let rows = []
|
|
@@ -604,7 +597,7 @@ async function _wrapperInput(str) {
|
|
|
604
597
|
if (rows.length === 0) {
|
|
605
598
|
warn("no items")
|
|
606
599
|
} else {
|
|
607
|
-
|
|
600
|
+
CONSOLE.nable(rows)
|
|
608
601
|
}
|
|
609
602
|
} else {
|
|
610
603
|
await evalText(text)
|
|
@@ -624,7 +617,7 @@ async function _wrapperInput(str) {
|
|
|
624
617
|
if (firstName === 'f') {
|
|
625
618
|
await workFile(uniqueName)
|
|
626
619
|
} else if (firstName !== 'e') {
|
|
627
|
-
|
|
620
|
+
CONSOLE.log(String(_fs.readFileSync(path)));
|
|
628
621
|
} else {
|
|
629
622
|
await runCmd(str)
|
|
630
623
|
}
|
|
@@ -643,7 +636,7 @@ function arrayToCmdMap(cmds) {
|
|
|
643
636
|
}
|
|
644
637
|
|
|
645
638
|
function help() {
|
|
646
|
-
|
|
639
|
+
CONSOLE.nable(Object.keys(keywordDef).map(key => {
|
|
647
640
|
let item = keywordDef[key];
|
|
648
641
|
return {
|
|
649
642
|
keyword: ' ' + warnStr(`.${key}`),
|
|
@@ -759,7 +752,7 @@ const keywordDef = {
|
|
|
759
752
|
version: {
|
|
760
753
|
comment: 'View version',
|
|
761
754
|
exeFn: (args) => {
|
|
762
|
-
|
|
755
|
+
CONSOLE.log(packageJson.version)
|
|
763
756
|
},
|
|
764
757
|
short: 'v'
|
|
765
758
|
},
|
|
@@ -795,7 +788,7 @@ const keywordDef = {
|
|
|
795
788
|
} else {
|
|
796
789
|
let path = getFullPath(uniqueName)
|
|
797
790
|
let sourceStr = String(_fs.readFileSync(path))
|
|
798
|
-
|
|
791
|
+
CONSOLE.log(sourceStr)
|
|
799
792
|
}
|
|
800
793
|
},
|
|
801
794
|
args: {
|
|
@@ -888,7 +881,7 @@ const keywordDef = {
|
|
|
888
881
|
let bSpace = args[1]
|
|
889
882
|
|
|
890
883
|
if (aUniqueName && bUniqueName) {
|
|
891
|
-
await e(
|
|
884
|
+
await e(`${getConfig("compareExe", "idea diff")} "${getFullPath(aUniqueName)}" "${getFullPath(bUniqueName)}"`)
|
|
892
885
|
} else if (aSpace && bSpace) {
|
|
893
886
|
if (!args[2]) {
|
|
894
887
|
warn('require mode')
|
|
@@ -984,7 +977,7 @@ const keywordDef = {
|
|
|
984
977
|
path
|
|
985
978
|
}
|
|
986
979
|
})
|
|
987
|
-
|
|
980
|
+
CONSOLE.table(items)
|
|
988
981
|
},
|
|
989
982
|
args: {
|
|
990
983
|
workspacePath: 'New workspace path'
|
|
@@ -1002,7 +995,7 @@ const keywordDef = {
|
|
|
1002
995
|
path
|
|
1003
996
|
}
|
|
1004
997
|
})
|
|
1005
|
-
|
|
998
|
+
CONSOLE.table(items)
|
|
1006
999
|
let index = await nextLine(line => line, "index: ")
|
|
1007
1000
|
let workspace = workspaces[index - 1]
|
|
1008
1001
|
if (workspace) {
|
|
@@ -1027,7 +1020,7 @@ const keywordDef = {
|
|
|
1027
1020
|
path
|
|
1028
1021
|
}
|
|
1029
1022
|
})
|
|
1030
|
-
|
|
1023
|
+
CONSOLE.table(items)
|
|
1031
1024
|
let index = trim(await nextLine(line => line, "switch workspace: "));
|
|
1032
1025
|
if (index && workspaces[index - 1]) {
|
|
1033
1026
|
let workspace = workspaces[index - 1];
|
|
@@ -1055,19 +1048,31 @@ const keywordDef = {
|
|
|
1055
1048
|
warn('invalid args')
|
|
1056
1049
|
return
|
|
1057
1050
|
}
|
|
1058
|
-
let
|
|
1051
|
+
let keyword = args[0]
|
|
1052
|
+
let justList = false;
|
|
1053
|
+
if (keyword.endsWith('.')) {
|
|
1054
|
+
let _tmp = trim(keyword.substring(0, keyword.length - 1));
|
|
1055
|
+
if (_tmp) {
|
|
1056
|
+
justList = true;
|
|
1057
|
+
keyword = _tmp;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
let pair = parseUniqueName(keyword)
|
|
1059
1061
|
let cmds;
|
|
1060
1062
|
if (/^0x[a-z\d]{8}$/.test(pair[1]) || pair[1].indexOf(",") !== -1) {
|
|
1061
|
-
cmds = getQuickRunCmds(
|
|
1063
|
+
cmds = getQuickRunCmds(keyword, keyword)
|
|
1062
1064
|
} else {
|
|
1063
|
-
cmds = getQuickRunCmds(
|
|
1065
|
+
cmds = getQuickRunCmds(keyword, '^e ' + toJsirFileName(pair[1]) + '$')
|
|
1064
1066
|
if (cmds.length === 0) {
|
|
1065
|
-
cmds = getQuickRunCmds(
|
|
1067
|
+
cmds = getQuickRunCmds(keyword, keyword)
|
|
1066
1068
|
}
|
|
1067
1069
|
}
|
|
1068
1070
|
if (cmds.length === 1) {
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
+
if (justList) {
|
|
1072
|
+
listCmd(arrayToCmdMap(cmds))
|
|
1073
|
+
} else {
|
|
1074
|
+
await runCmd(args.slice(1).join(' '), cmds[0])
|
|
1075
|
+
}
|
|
1071
1076
|
} else {
|
|
1072
1077
|
warn(cmds.length > 1 ? "multiple match" : "no match")
|
|
1073
1078
|
}
|
|
@@ -1081,7 +1086,7 @@ const keywordDef = {
|
|
|
1081
1086
|
comment: 'Exit',
|
|
1082
1087
|
exeFn: (args) => {
|
|
1083
1088
|
delTips();
|
|
1084
|
-
|
|
1089
|
+
CONSOLE.log(infoStr("Bye!"))
|
|
1085
1090
|
process.exit(0)
|
|
1086
1091
|
},
|
|
1087
1092
|
short: 'q'
|
|
@@ -1091,7 +1096,7 @@ const keywordDef = {
|
|
|
1091
1096
|
exeFn: (args) => {
|
|
1092
1097
|
_noAppendNextLine = false
|
|
1093
1098
|
_cmdMap = {}
|
|
1094
|
-
|
|
1099
|
+
CONSOLE.log(warnStr("You can start with .help, use * to expand context"))
|
|
1095
1100
|
},
|
|
1096
1101
|
short: 'p'
|
|
1097
1102
|
}
|
|
@@ -1158,7 +1163,7 @@ async function _dealKeyword(keyword, args) {
|
|
|
1158
1163
|
}
|
|
1159
1164
|
}
|
|
1160
1165
|
if (unMatched) {
|
|
1161
|
-
|
|
1166
|
+
await keywordDef.run.exeFn([keyword, ...args])
|
|
1162
1167
|
}
|
|
1163
1168
|
}
|
|
1164
1169
|
|
|
@@ -1382,18 +1387,15 @@ function parseUniqueName(uniqueName) {
|
|
|
1382
1387
|
function getArgComments(argDef) {
|
|
1383
1388
|
let comments = []
|
|
1384
1389
|
let keys = Object.keys(argDef)
|
|
1390
|
+
let shortMap = {}
|
|
1391
|
+
let tempShortMap = getShortDefMap(keys)
|
|
1392
|
+
for (let key of Object.keys(tempShortMap)) {
|
|
1393
|
+
shortMap[tempShortMap[key].replace(/^:/, '')] = key;
|
|
1394
|
+
}
|
|
1385
1395
|
if (keys.length > 0) {
|
|
1386
|
-
let aLine = []
|
|
1387
1396
|
for (let k of keys) {
|
|
1388
|
-
let item = warnStr(k) + (argDef[k] ? ` <${argDef[k]}>`:'')
|
|
1389
|
-
|
|
1390
|
-
comments.push(aLine.join(", ") + ", ")
|
|
1391
|
-
aLine = []
|
|
1392
|
-
}
|
|
1393
|
-
aLine.push(item)
|
|
1394
|
-
}
|
|
1395
|
-
if (aLine.length > 0) {
|
|
1396
|
-
comments.push(aLine.join(", "))
|
|
1397
|
+
let item = warnStr(k) + (shortMap[k] ? ` ${warnStr(shortMap[k])}`:'') + (argDef[k] ? ` <${argDef[k]}>`:'')
|
|
1398
|
+
comments.push(item)
|
|
1397
1399
|
}
|
|
1398
1400
|
comments[0] = '$args: ' + comments[0]
|
|
1399
1401
|
if (comments.length > 1) {
|
|
@@ -1405,6 +1407,39 @@ function getArgComments(argDef) {
|
|
|
1405
1407
|
return comments
|
|
1406
1408
|
}
|
|
1407
1409
|
|
|
1410
|
+
function getShortStr(str) {
|
|
1411
|
+
let result = []
|
|
1412
|
+
for (let i = 0; i < str.length; i++) {
|
|
1413
|
+
if (i === 0) {
|
|
1414
|
+
result.push(str[i].toLowerCase())
|
|
1415
|
+
}
|
|
1416
|
+
if (/[A-Z]/.test(str[i])) {
|
|
1417
|
+
result.push(str[i].toLowerCase())
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
return result.join('');
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1423
|
+
function getShortDefMap(argDefKeys) {
|
|
1424
|
+
const result = {};
|
|
1425
|
+
for (let str of argDefKeys) {
|
|
1426
|
+
let originStr = ":" + str;
|
|
1427
|
+
str = str.replace(/^:/, '')
|
|
1428
|
+
str = str.replace(/^_/, '')
|
|
1429
|
+
let shortStr = getShortStr(str);
|
|
1430
|
+
let key = '-' + shortStr;
|
|
1431
|
+
let val = result[key]
|
|
1432
|
+
let i = 1;
|
|
1433
|
+
while (val) {
|
|
1434
|
+
key = '-' + shortStr + i;
|
|
1435
|
+
val = result[key];
|
|
1436
|
+
i ++;
|
|
1437
|
+
}
|
|
1438
|
+
result[key] = originStr;
|
|
1439
|
+
}
|
|
1440
|
+
return result;
|
|
1441
|
+
}
|
|
1442
|
+
|
|
1408
1443
|
async function runCmd(str = '', uniqueName = '', text = '') {
|
|
1409
1444
|
let path = getFullPath(uniqueName);
|
|
1410
1445
|
if (uniqueName || text) {
|
|
@@ -1433,8 +1468,9 @@ async function runCmd(str = '', uniqueName = '', text = '') {
|
|
|
1433
1468
|
return;
|
|
1434
1469
|
}
|
|
1435
1470
|
|
|
1436
|
-
let oriArgs = enrichArgs(str, text)
|
|
1437
1471
|
let argDef = getArgDef(text)
|
|
1472
|
+
let shortDefMap = getShortDefMap(Object.keys(argDef))
|
|
1473
|
+
let oriArgs = enrichArgs(str).map(i => shortDefMap[i] ? shortDefMap[i]:i)
|
|
1438
1474
|
if (argDef['[ParseError]']) {
|
|
1439
1475
|
throw `argDef [ParseError] ${argDef['[ParseError]']}`
|
|
1440
1476
|
}
|
|
@@ -1445,7 +1481,7 @@ async function runCmd(str = '', uniqueName = '', text = '') {
|
|
|
1445
1481
|
let arg = oriArgs[i]
|
|
1446
1482
|
let needTrans
|
|
1447
1483
|
let pair
|
|
1448
|
-
if (arg.startsWith(":") || arg.startsWith("_")) {
|
|
1484
|
+
if (arg.startsWith(":") || arg.startsWith("_") && !arg.endsWith(' ')) {
|
|
1449
1485
|
arg = arg.replace(/^:/, '')
|
|
1450
1486
|
if (oriArgs[i+1] && !(oriArgs[i+1].startsWith(":") || oriArgs[i+1].startsWith("_"))) {
|
|
1451
1487
|
pair = [arg, oriArgs[i+1]]
|
|
@@ -1547,8 +1583,8 @@ function getArgDef(text) {
|
|
|
1547
1583
|
argDef = (exeStr ? evalVal(exeStr) : {}) || {}
|
|
1548
1584
|
let array = []
|
|
1549
1585
|
for (let key of Object.keys(argDef)) {
|
|
1550
|
-
if (array.hasOwnProperty(key)) {
|
|
1551
|
-
throw `invalid argName ${key}`
|
|
1586
|
+
if (/\s/.test(key) || array.hasOwnProperty(key)) {
|
|
1587
|
+
throw `invalid argName ${warnStr(key)}`
|
|
1552
1588
|
}
|
|
1553
1589
|
}
|
|
1554
1590
|
} catch (e) {
|
|
@@ -1714,7 +1750,6 @@ async function evalText($text = '', $cmdName = '', $args = []) {
|
|
|
1714
1750
|
setTips, delTips,
|
|
1715
1751
|
wrapperInput, filterCmd,
|
|
1716
1752
|
currSpace,
|
|
1717
|
-
$log, $draft,
|
|
1718
1753
|
$homeDir, $lib)
|
|
1719
1754
|
} catch(e) {
|
|
1720
1755
|
throw errorTag(e, $cmdName);
|
package/deps/evalCode.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const {info: $info, msg: $msg, warn: $warn, error: $error, importG: $import} = require("./util");
|
|
1
|
+
const {info: $info, msg: $msg, warn: $warn, error: $error, importG: $import, $log, $draft} = require("./util");
|
|
2
2
|
require = require("./util").requireG
|
|
3
3
|
module.exports = async ($text = '', $cmdName = '', $args = [],
|
|
4
4
|
$data, $config,
|
|
@@ -7,7 +7,6 @@ module.exports = async ($text = '', $cmdName = '', $args = [],
|
|
|
7
7
|
$setTips, $delTips,
|
|
8
8
|
$enter, $filterCmd,
|
|
9
9
|
$currentSpace,
|
|
10
|
-
$log, $draft,
|
|
11
10
|
$homeDir, $lib) => {
|
|
12
11
|
const $defArgs = () => $args;
|
|
13
12
|
const $context = {
|
package/deps/example.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
exeFile: `/*
|
|
3
|
+
A test exe script
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
$defArgs({
|
|
7
|
+
arg: 'required argument',
|
|
8
|
+
_arg: 'optional argument'
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
let {} = $lib // Reference to built-in resources
|
|
12
|
+
|
|
13
|
+
console.log($args)
|
|
14
|
+
|
|
15
|
+
return {}
|
|
16
|
+
`,
|
|
17
|
+
initFile: `/*
|
|
18
|
+
A test init script
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
let {} = $lib // Reference to built-in resources
|
|
22
|
+
|
|
23
|
+
return {}
|
|
24
|
+
`
|
|
25
|
+
}
|
package/deps/util.js
CHANGED
|
@@ -13,6 +13,7 @@ const globalDirectories = require('global-dirs');
|
|
|
13
13
|
const emptyFn = ()=>{}
|
|
14
14
|
const dayJs = require('dayjs')
|
|
15
15
|
const table = require('console.table')
|
|
16
|
+
const {log: _log, clear: _clear} = console;
|
|
16
17
|
const _fs = require("fs");
|
|
17
18
|
if (module.paths.indexOf(globalDirectories.npm.packages) === -1) {
|
|
18
19
|
module.paths.push(globalDirectories.npm.packages)
|
|
@@ -126,10 +127,10 @@ function nableStr(rows) {
|
|
|
126
127
|
return tableStr(wrapRows(rows))
|
|
127
128
|
}
|
|
128
129
|
console.table = (...args) => {
|
|
129
|
-
|
|
130
|
+
_log(tableStr(...args))
|
|
130
131
|
}
|
|
131
132
|
console.nable = (rows) => {
|
|
132
|
-
|
|
133
|
+
_log(nableStr(rows))
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
function timeStr(fmt, date) {
|
|
@@ -212,9 +213,16 @@ async function timeLimit(proms, mills) {
|
|
|
212
213
|
return result
|
|
213
214
|
}
|
|
214
215
|
|
|
215
|
-
function clearConsole() {
|
|
216
|
-
|
|
217
|
-
|
|
216
|
+
function clearConsole(clean = true) {
|
|
217
|
+
if (clean) {
|
|
218
|
+
// \033[0f 清除从光标位置到屏幕末尾的内容,并把光标移动到屏幕的左上角。
|
|
219
|
+
// process.stdout.write('\033[0f');
|
|
220
|
+
_clear();
|
|
221
|
+
} else {
|
|
222
|
+
// \033[2J:清空屏幕。
|
|
223
|
+
// \033[H:将光标定位到屏幕左上角。
|
|
224
|
+
process.stdout.write('\033[2J\033[H');
|
|
225
|
+
}
|
|
218
226
|
}
|
|
219
227
|
|
|
220
228
|
function appendLog(fileName, text) {
|
|
@@ -344,7 +352,7 @@ function requireG(moduleName){
|
|
|
344
352
|
} catch (e) {}
|
|
345
353
|
let path = globalDirectories.npm.packages + '/' + moduleName;
|
|
346
354
|
if (!fs.existsSync(path)) {
|
|
347
|
-
|
|
355
|
+
_log(warnStr(`npm install -g ${moduleName}`))
|
|
348
356
|
throw `${moduleName} not found, use above cmd to install it`;
|
|
349
357
|
}
|
|
350
358
|
return require(path);
|
|
@@ -359,7 +367,7 @@ async function importG(moduleName) {
|
|
|
359
367
|
} catch (e) {}
|
|
360
368
|
let path = globalDirectories.npm.packages + '/' + moduleName;
|
|
361
369
|
if (!fs.existsSync(path)) {
|
|
362
|
-
|
|
370
|
+
_log(warnStr(`npm install -g ${moduleName}`))
|
|
363
371
|
throw `${moduleName} not found, use above cmd to install it`;
|
|
364
372
|
}
|
|
365
373
|
return await import(path);
|
|
@@ -953,32 +961,32 @@ function wrapRows(rows) {
|
|
|
953
961
|
return result
|
|
954
962
|
}
|
|
955
963
|
|
|
956
|
-
function info(msg) {
|
|
964
|
+
function info(msg, _console = console) {
|
|
957
965
|
if (typeof msg === 'string' && msg && msg.indexOf('\n') === -1) {
|
|
958
966
|
msg = infoStr(msg)
|
|
959
967
|
}
|
|
960
|
-
|
|
968
|
+
_console.log(infoStr('[info]'), msg)
|
|
961
969
|
}
|
|
962
970
|
|
|
963
|
-
function msg(msg) {
|
|
971
|
+
function msg(msg, _console = console) {
|
|
964
972
|
if (typeof msg === 'string' && msg && msg.indexOf('\n') === -1) {
|
|
965
973
|
msg = msgStr(msg)
|
|
966
974
|
}
|
|
967
|
-
|
|
975
|
+
_console.log(msgStr('[msg]'), msg)
|
|
968
976
|
}
|
|
969
977
|
|
|
970
|
-
function warn(msg) {
|
|
978
|
+
function warn(msg, _console = console) {
|
|
971
979
|
if (typeof msg === 'string' && msg && msg.indexOf('\n') === -1) {
|
|
972
980
|
msg = warnStr(msg)
|
|
973
981
|
}
|
|
974
|
-
|
|
982
|
+
_console.warn(warnStr('[warn]'), msg)
|
|
975
983
|
}
|
|
976
984
|
|
|
977
|
-
function error(msg, tag) {
|
|
985
|
+
function error(msg, tag, _console = console) {
|
|
978
986
|
if (typeof msg === 'string' && msg && msg.indexOf('\n') === -1) {
|
|
979
987
|
msg = errorStr(msg)
|
|
980
988
|
}
|
|
981
|
-
|
|
989
|
+
_console.error(errorStr(`[${tag || 'error'}]`), msg)
|
|
982
990
|
}
|
|
983
991
|
|
|
984
992
|
function infoStr(str) {
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jsir",
|
|
3
|
-
"version": "2.1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.1.7",
|
|
4
|
+
"description": "JavaScript Script Management Tool",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "cmd/oaa.js"
|
|
@@ -9,7 +9,12 @@
|
|
|
9
9
|
"bin": {
|
|
10
10
|
"jsir": "cmd/oaa.js"
|
|
11
11
|
},
|
|
12
|
-
"keywords": [
|
|
12
|
+
"keywords": [
|
|
13
|
+
"javascript",
|
|
14
|
+
"scripts",
|
|
15
|
+
"manager",
|
|
16
|
+
"executor"
|
|
17
|
+
],
|
|
13
18
|
"author": "",
|
|
14
19
|
"license": "ISC",
|
|
15
20
|
"dependencies": {
|