node-automator 1.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.
Files changed (143) hide show
  1. package/LICENSE +15 -0
  2. package/assets/alert.png +0 -0
  3. package/assets/error.png +0 -0
  4. package/assets/success.png +0 -0
  5. package/commands/abort.js +11 -0
  6. package/commands/alert.js +19 -0
  7. package/commands/assemble.js +56 -0
  8. package/commands/assert.js +18 -0
  9. package/commands/base.js +363 -0
  10. package/commands/break.js +11 -0
  11. package/commands/change_filter.js +34 -0
  12. package/commands/cheerio.js +15 -0
  13. package/commands/clear_screen.js +14 -0
  14. package/commands/commit.js +31 -0
  15. package/commands/compare.js +23 -0
  16. package/commands/confirm.js +16 -0
  17. package/commands/continue.js +11 -0
  18. package/commands/copy.js +14 -0
  19. package/commands/cursor_up.js +12 -0
  20. package/commands/date.js +25 -0
  21. package/commands/debugger.js +11 -0
  22. package/commands/dingtalk.js +110 -0
  23. package/commands/disassemble.js +36 -0
  24. package/commands/divination.js +15 -0
  25. package/commands/download.js +12 -0
  26. package/commands/edit.js +83 -0
  27. package/commands/edit_excel.js +57 -0
  28. package/commands/env_optional.js +57 -0
  29. package/commands/eval.js +27 -0
  30. package/commands/exec_from_file.js +31 -0
  31. package/commands/export_diff_head.js +31 -0
  32. package/commands/file_info.js +41 -0
  33. package/commands/file_size.js +12 -0
  34. package/commands/files.js +14 -0
  35. package/commands/first_exist.js +18 -0
  36. package/commands/flatten.js +18 -0
  37. package/commands/ftp.js +161 -0
  38. package/commands/git_commit.js +31 -0
  39. package/commands/git_export_diff_head.js +13 -0
  40. package/commands/git_is_dirty.js +13 -0
  41. package/commands/hash.js +21 -0
  42. package/commands/http_request.js +12 -0
  43. package/commands/image_crop.js +19 -0
  44. package/commands/input.js +37 -0
  45. package/commands/interval.js +60 -0
  46. package/commands/is_dirty.js +31 -0
  47. package/commands/jwt_decode.js +22 -0
  48. package/commands/list2dict.js +32 -0
  49. package/commands/log.js +72 -0
  50. package/commands/loop.js +115 -0
  51. package/commands/loop_forever.js +66 -0
  52. package/commands/merge_files.js +39 -0
  53. package/commands/mgr.js +476 -0
  54. package/commands/modify.js +44 -0
  55. package/commands/move.js +14 -0
  56. package/commands/move_local.js +14 -0
  57. package/commands/multi_select.js +16 -0
  58. package/commands/mysql_connect.js +29 -0
  59. package/commands/mysql_end.js +13 -0
  60. package/commands/mysql_query.js +19 -0
  61. package/commands/notify.js +13 -0
  62. package/commands/open.js +30 -0
  63. package/commands/parse.js +18 -0
  64. package/commands/pause.js +15 -0
  65. package/commands/print.js +47 -0
  66. package/commands/read_cache.js +12 -0
  67. package/commands/read_cfg.js +13 -0
  68. package/commands/read_clipboard.js +19 -0
  69. package/commands/read_excel.js +17 -0
  70. package/commands/read_only_excel.js +40 -0
  71. package/commands/read_plain.js +14 -0
  72. package/commands/remove.js +14 -0
  73. package/commands/retrieve.js +17 -0
  74. package/commands/reveal.js +33 -0
  75. package/commands/revision_info.js +31 -0
  76. package/commands/schedule.js +80 -0
  77. package/commands/select.js +17 -0
  78. package/commands/send_email.js +25 -0
  79. package/commands/share_data.js +745 -0
  80. package/commands/shell.js +13 -0
  81. package/commands/sleep.js +17 -0
  82. package/commands/store.js +13 -0
  83. package/commands/store_optional.js +33 -0
  84. package/commands/stream.js +16 -0
  85. package/commands/stringify.js +24 -0
  86. package/commands/svn_add.js +26 -0
  87. package/commands/svn_commit.js +49 -0
  88. package/commands/svn_export_diff_head.js +13 -0
  89. package/commands/svn_is_dirty.js +13 -0
  90. package/commands/svn_update.js +27 -0
  91. package/commands/switch.js +18 -0
  92. package/commands/temp.js +12 -0
  93. package/commands/tencent_cos.js +323 -0
  94. package/commands/test.js +14 -0
  95. package/commands/title.js +18 -0
  96. package/commands/tmpdir.js +21 -0
  97. package/commands/translate.js +58 -0
  98. package/commands/traversal.js +38 -0
  99. package/commands/truncate.js +31 -0
  100. package/commands/truncate_all.js +62 -0
  101. package/commands/ts_sort.js +18 -0
  102. package/commands/unzip.js +50 -0
  103. package/commands/updating_revision.js +28 -0
  104. package/commands/valid_required.js +31 -0
  105. package/commands/void.js +10 -0
  106. package/commands/watch_mail.js +94 -0
  107. package/commands/web_socket.js +233 -0
  108. package/commands/which.js +60 -0
  109. package/commands/write_cache.js +16 -0
  110. package/commands/write_cfg.js +18 -0
  111. package/commands/write_clipboard.js +23 -0
  112. package/commands/write_excel.js +17 -0
  113. package/commands/write_plain.js +18 -0
  114. package/commands/zip.js +78 -0
  115. package/commands/zip_data.js +64 -0
  116. package/examples/print_env.yml +3 -0
  117. package/index.js +109 -0
  118. package/package.json +63 -0
  119. package/scratch/.gitkeep +0 -0
  120. package/utils/alert_tool.js +133 -0
  121. package/utils/base64_tool.js +13 -0
  122. package/utils/cache/local_cache.js +79 -0
  123. package/utils/cache/raw_cache.js +47 -0
  124. package/utils/cache/simple_local_cache.js +33 -0
  125. package/utils/cache/simple_sqlite_cache.js +43 -0
  126. package/utils/cache/simple_svn_cache.js +49 -0
  127. package/utils/cache/svn_cache.js +40 -0
  128. package/utils/cache_tool.js +53 -0
  129. package/utils/display_tool.js +85 -0
  130. package/utils/divination_util.js +555 -0
  131. package/utils/file_tool.js +529 -0
  132. package/utils/hash_tool.js +8 -0
  133. package/utils/interaction_tool.js +228 -0
  134. package/utils/log_tool.js +190 -0
  135. package/utils/parse_directive.js +194 -0
  136. package/utils/parse_tool.js +236 -0
  137. package/utils/request_tool.js +156 -0
  138. package/utils/scm_tool.js +108 -0
  139. package/utils/selection_tool.js +593 -0
  140. package/utils/shell_tool.js +162 -0
  141. package/utils/svn_diff/diff_file.js +44 -0
  142. package/utils/svn_diff/diff_parser.js +55 -0
  143. package/utils/transform_tool.js +520 -0
@@ -0,0 +1,161 @@
1
+ const {
2
+ BaseCommand
3
+ } = require("./base");
4
+
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const {
8
+ get_full_path,
9
+ get_file_list
10
+ } = require("../utils/file_tool");
11
+ const {
12
+ info
13
+ } = require("../utils/log_tool");
14
+ const {
15
+ progress
16
+ } = require("../utils/display_tool");
17
+
18
+ class FtpCommand extends BaseCommand {
19
+ async execute() {
20
+ let config = this.selfData.config;
21
+ let mode = this.selfData.mode;
22
+ return await new Promise((resolve, reject) => {
23
+ var Client = require('ftp');
24
+ var c = new Client();
25
+ c.on('ready', () => {
26
+ switch (mode) {
27
+ case "VIEW": {
28
+ let src = this.selfData.src || "/";
29
+ c.list(src, function (err, list) {
30
+ if (err) {
31
+ throw err;
32
+ }
33
+ resolve(list);
34
+ c.end();
35
+ });
36
+ break;
37
+ }
38
+ case "DOWNLOAD": {
39
+ let src = this.selfData.src;
40
+ let dst = get_full_path(this.selfData.dst);
41
+ let remote_dirname = path.dirname(src);
42
+ let remote_basename = path.basename(src);
43
+ c.list(remote_dirname, function (err, list) {
44
+ if (err) {
45
+ throw err;
46
+ }
47
+ const element = list.find((element) => element.name == remote_basename);
48
+ if (element) {
49
+ let cur = 0,
50
+ total = element.size;
51
+ c.get(src, function (err, stream) {
52
+ if (err) {
53
+ throw err;
54
+ }
55
+ stream.on('data', function (d) {
56
+ cur += d.length;
57
+ progress(cur, total, {
58
+ desc: `Downloading from ${src}`,
59
+ depth: 0,
60
+ color: "green",
61
+ align: true,
62
+ format_bytes: true,
63
+ }, true);
64
+ });
65
+ stream.once('close', function () {
66
+ c.end();
67
+ resolve(true);
68
+ });
69
+ stream.pipe(fs.createWriteStream(dst));
70
+ });
71
+ } else {
72
+ reject(`Not found ${src}`);
73
+ }
74
+ });
75
+ break;
76
+ }
77
+ case "UPLOAD_FILE":
78
+ case "UPLOAD": {
79
+ let dst = this.selfData.dst;
80
+ let src = get_full_path(this.selfData.src);
81
+ let readStream = fs.createReadStream(src),
82
+ cur = 0,
83
+ total = fs.statSync(src).size;
84
+ readStream.on('data', function (d) {
85
+ cur += d.length;
86
+ progress(cur, total, {
87
+ desc: `Uploading to ${dst}`,
88
+ depth: 0,
89
+ color: "green",
90
+ align: true,
91
+ format_bytes: true,
92
+ }, true);
93
+ });
94
+ c.put(readStream, dst, function (err) {
95
+ if (err) {
96
+ throw err;
97
+ }
98
+ c.end();
99
+ resolve(true);
100
+ });
101
+ break;
102
+ }
103
+ case "UPLOAD_FILES": {
104
+ let dst_folder = this.selfData.dst_folder;
105
+ let srcs = get_file_list(this.selfData.src, undefined, true);
106
+ let base = this.selfData.base;
107
+ let numFiles = srcs.length;
108
+ if (numFiles) {
109
+ let numComplete = 0;
110
+
111
+ function completeOne() {
112
+ ++numComplete;
113
+ if (numComplete == numFiles) {
114
+ c.end();
115
+ resolve(true);
116
+ }
117
+ }
118
+
119
+ for (let i = 0; i < numFiles; i++) {
120
+ const src = srcs[i];
121
+ const dst = path.join(dst_folder, path.relative(base, src));
122
+ let readStream = fs.createReadStream(src),
123
+ cur = 0,
124
+ total = fs.statSync(src).size;
125
+ readStream.on('data', function (d) {
126
+ cur += d.length;
127
+ let percentageComplete = ((cur / total) * 100).toFixed(1);
128
+ progress(i + (cur / total), numFiles, {
129
+ desc: `Uploading to ${dst} [${percentageComplete}%]`,
130
+ depth: 0,
131
+ color: "green",
132
+ align: true,
133
+ }, true);
134
+ });
135
+ c.put(readStream, dst, function (err) {
136
+ if (err) {
137
+ throw err;
138
+ }
139
+ completeOne();
140
+ });
141
+ }
142
+ } else {
143
+ resolve(true);
144
+ }
145
+ break;
146
+ }
147
+ default: {
148
+ resolve(false);
149
+ break;
150
+ }
151
+ }
152
+ });
153
+ // connect to localhost:21 as anonymous
154
+ c.connect(config);
155
+ });
156
+ }
157
+ }
158
+
159
+ module.exports = {
160
+ FtpCommand,
161
+ };
@@ -0,0 +1,31 @@
1
+ const { whisper, warn, info } = require("../utils/log_tool");
2
+ const { git_is_dirty, git_commit, git_push } = require("../utils/scm_tool");
3
+ const { toArray } = require("../utils/transform_tool");
4
+ const { BaseCommand } = require("./base");
5
+
6
+ class GitCommitCommand extends BaseCommand {
7
+ async execute() {
8
+ let data = this.selfData;
9
+ if (!data.force) {
10
+ let is_dirty = await git_is_dirty(data.cwd);
11
+ if (!is_dirty) {
12
+ whisper(`没有要git提交的更改 ${data.cwd} ${data.msg}`, undefined, true);
13
+ } else {
14
+ info(`准备git提交 ${data.cwd} ${data.msg}`);
15
+ await git_commit(data.cwd, data.msg);
16
+ }
17
+ }
18
+ let pushCfgs = data.push;
19
+ if (pushCfgs) {
20
+ pushCfgs = toArray(pushCfgs);
21
+ for (let i = 0; i < pushCfgs.length; i++) {
22
+ const pushCfg = pushCfgs[i];
23
+ await git_push(data.cwd, pushCfg);
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ module.exports = {
30
+ GitCommitCommand,
31
+ };
@@ -0,0 +1,13 @@
1
+ const { git_export_diff_head } = require("../utils/scm_tool");
2
+ const { BaseCommand } = require("./base");
3
+
4
+ class GitExportDiffHeadCommand extends BaseCommand {
5
+ async execute() {
6
+ let data = this.selfData;
7
+ await git_export_diff_head(data.cwd, data.dst, data.base, data.options);
8
+ }
9
+ }
10
+
11
+ module.exports = {
12
+ GitExportDiffHeadCommand,
13
+ };
@@ -0,0 +1,13 @@
1
+ const { git_is_dirty } = require("../utils/scm_tool");
2
+ const { BaseCommand } = require("./base");
3
+
4
+ class GitIsDirtyCommand extends BaseCommand {
5
+ async execute() {
6
+ let data = this.selfData;
7
+ return await git_is_dirty(data.cwd);
8
+ }
9
+ }
10
+
11
+ module.exports = {
12
+ GitIsDirtyCommand,
13
+ };
@@ -0,0 +1,21 @@
1
+ const { BaseCommand } = require("./base");
2
+ const fs = require("fs");
3
+ const { get_fst_file } = require("../utils/file_tool");
4
+ const { hash } = require('../utils/hash_tool');
5
+
6
+ class HashCommand extends BaseCommand {
7
+ async execute() {
8
+ let target;
9
+ if (this.selfData.content) {
10
+ target = "" + this.selfData.content;
11
+ } else if (this.selfData.src) {
12
+ let file = get_fst_file(this.selfData.src);
13
+ target = fs.readFileSync(file);
14
+ }
15
+ return hash(target, this.selfData.algorithm, this.selfData.digestEncoding);
16
+ }
17
+ }
18
+
19
+ module.exports = {
20
+ HashCommand,
21
+ };
@@ -0,0 +1,12 @@
1
+ const { doRequest } = require("../utils/request_tool");
2
+ const { BaseCommand } = require("./base");
3
+
4
+ class HTTPRequestCommand extends BaseCommand {
5
+ async execute() {
6
+ return await doRequest(this.selfData);
7
+ }
8
+ }
9
+
10
+ module.exports = {
11
+ HTTPRequestCommand,
12
+ };
@@ -0,0 +1,19 @@
1
+ const { get_fst_file, get_full_path } = require('../utils/file_tool');
2
+ const { BaseCommand } = require("./base");
3
+ const Jimp = require("jimp");
4
+
5
+ class ImageCropCommand extends BaseCommand {
6
+ async execute() {
7
+ const data = this.selfData;
8
+ const src = get_fst_file(data.src);
9
+ const image = await Jimp.read(src);
10
+ const {x, y, w, h} = data.region;
11
+ const croped = image.crop(x, y, w, h);
12
+ const dst = get_full_path(data.dst);
13
+ await croped.writeAsync(dst);
14
+ }
15
+ }
16
+
17
+ module.exports = {
18
+ ImageCropCommand,
19
+ };
@@ -0,0 +1,37 @@
1
+ const { BaseCommand } = require("./base");
2
+ const { moveCursorLineUp } = require("../utils/interaction_tool");
3
+ const { info, log } = require("../utils/log_tool");
4
+
5
+ class InputCommand extends BaseCommand {
6
+ async execute() {
7
+ const readline = require("readline");
8
+ let data = this.selfData;
9
+ const prompt = data && (data.prompt || this.selfCfg.title);
10
+ const default_value = data && data.default;
11
+ if (prompt) {
12
+ info(prompt);
13
+ }
14
+ const input = await new Promise(resolve => {
15
+ const rl = readline.createInterface({
16
+ input: process.stdin,
17
+ output: null,
18
+ });
19
+ rl.question("", function(input) {
20
+ info("");
21
+ resolve(input);
22
+ rl.close();
23
+ });
24
+
25
+ rl.on("close", function() {
26
+
27
+ });
28
+ });
29
+ // 往上移一行
30
+ moveCursorLineUp(1);
31
+ return input || default_value || "";
32
+ }
33
+ }
34
+
35
+ module.exports = {
36
+ InputCommand,
37
+ };
@@ -0,0 +1,60 @@
1
+ const { warn, error, info, success, getPrint } = require('../utils/log_tool');
2
+ const { formatTimeInMillisec, formatDate, convert } = require('../utils/transform_tool');
3
+ const { BaseCommand } = require('./base');
4
+ const { formatData } = require('./share_data');
5
+
6
+ class IntervalCommand extends BaseCommand {
7
+ async execute() {
8
+ let data = this.selfData;
9
+ let commandCfgs = data.commands;
10
+ // 特殊处理字符的情况
11
+ if (typeof commandCfgs === "string") {
12
+ commandCfgs = formatData(commandCfgs);
13
+ }
14
+ let now = Date.now();
15
+ let asyncId;
16
+ let delay = convert(data.delay, "millisecond");
17
+ let repeat = data.repeat || 0;
18
+ let times = 0;
19
+ if (data.run_immediately) {
20
+ warn(`立即执行一次任务`);
21
+ await this.exec(commandCfgs, this.depth + 1);
22
+ }
23
+ // 正在执行任务。(执行中,不能再次发起)
24
+ let isRunningTask = 0;
25
+ let timer = setInterval( async () => {
26
+ if (isRunningTask && !data.concurrent) return;
27
+ info("");
28
+ times += 1;
29
+ if (repeat) {
30
+ if (times >= repeat) {
31
+ clearInterval(timer);
32
+ }
33
+ }
34
+ if (data.repeat_mapping) {
35
+ this.shareData[data.repeat_mapping] = repeat;
36
+ }
37
+ if (data.times_mapping) {
38
+ this.shareData[data.times_mapping] = times;
39
+ }
40
+ warn(`开始执行间隔任务[${asyncId}] (${times}/${repeat || "∞"})`, undefined, undefined, true);
41
+ isRunningTask++;
42
+ await this.exec(commandCfgs, this.depth + 1);
43
+ isRunningTask--;
44
+ }, delay);
45
+ asyncId = timer[Object.getOwnPropertySymbols(timer).find(v => v.description == "asyncId")];
46
+ info("");
47
+ warn(`将每间隔 ${formatTimeInMillisec(delay, true)} 执行定时任务[${asyncId}] (${times}/${repeat || "∞"})`, undefined, undefined, true);
48
+ }
49
+
50
+ getRequiredParams() {
51
+ return [
52
+ "commands",
53
+ "delay",
54
+ ];
55
+ }
56
+ }
57
+
58
+ module.exports = {
59
+ IntervalCommand,
60
+ };
@@ -0,0 +1,31 @@
1
+ const { vital } = require("../utils/log_tool");
2
+ const { svn_is_dirty, git_is_dirty } = require("../utils/scm_tool");
3
+ const { BaseCommand } = require("./base");
4
+
5
+ class IsDirtyCommand extends BaseCommand {
6
+ async execute() {
7
+ let data = this.selfData;
8
+ switch (this.selfData.type) {
9
+ case 'svn': {
10
+ return await svn_is_dirty(data.cwd);
11
+ }
12
+ case 'git': {
13
+ return await git_is_dirty(data.cwd);
14
+ }
15
+ default: {
16
+ throw (`不支持的类型 ${this.selfData.type}`);
17
+ break;
18
+ }
19
+ }
20
+ }
21
+
22
+ getRequiredParams() {
23
+ return [
24
+ "type",
25
+ ];
26
+ }
27
+ }
28
+
29
+ module.exports = {
30
+ IsDirtyCommand,
31
+ };
@@ -0,0 +1,22 @@
1
+ const { BaseCommand } = require("./base");
2
+
3
+ class JwtDecodeCommand extends BaseCommand {
4
+ async execute() {
5
+ // eyJraWQiOiIxYnh2cE80cGI5TGs1b09HMTZLMlJCIiwiYWxnIjoiRVMyNTYifQ.eyJzdWIiOiJHMUE0Q0VQUkciLCJhdWQiOiJzZWlyZWkiLCJjb3VudHJ5IjoiSlAiLCJjcmVhdGVkIjoxNjY1MzEzMjkwLCJpc3MiOiJnMTIzLWF1dGgiLCJjdXJyZW5jeSI6IkpQWSIsImV4cCI6MTY3Nzk1ODM4NywicmVnaW9uIjoiSlAiLCJsYW5nIjoiamEiLCJpYXQiOjE2Nzc3ODU1ODcsImp0aSI6IjFMbE00UEtuR2VaWWthR0V6YjBhd2wifQ.HXC6wkb7D57I2bdu0Ds_gQp_ZngvjvniP62wJZB5V7pawyVPvnOZT7s_Hkhg9G1hSpoHlAtZKIW5tndlydRBZQ
6
+ let ret = require("jwt-js").decodeToken(this.content);
7
+ // ret = {
8
+ // "header": {"kid": "1bxvpO4pb9Lk5oOG16K2RB", "alg": "ES256"},
9
+ // "payload": {"sub": "G1A4CEPRG", "aud": "seirei", "country": "JP", "created": 1665313290, "iss": "g123-auth", "currency": "JPY", "exp": 1677958387, "region": "JP", "lang": "ja", "iat": 1677785587, "jti": "1LlM4PKnGeZYkaGEzb0awl"},
10
+ // "signature": "HXC6wkb7D57I2bdu0Ds_gQp_ZngvjvniP62wJZB5V7pawyVPvnOZT7s_Hkhg9G1hSpoHlAtZKIW5tndlydRBZQ"
11
+ // };
12
+ return ret;
13
+ }
14
+
15
+ getRequireContent() {
16
+ return true;
17
+ }
18
+ }
19
+
20
+ module.exports = {
21
+ JwtDecodeCommand,
22
+ };
@@ -0,0 +1,32 @@
1
+ const { BaseCommand } = require("./base");
2
+ const { getDataByKey } = require("./share_data");
3
+
4
+ class List2DictCommand extends BaseCommand {
5
+ async execute() {
6
+ let data = this.selfData;
7
+ let content = this.content;
8
+ let keyIndex = data.key_index == undefined ? 0 : data.key_index;
9
+ let valueIndex = data.value_index == undefined ? 1 : data.value_index;
10
+ let value_self = data.value_self;
11
+ let result = {};
12
+ for (let i = 0; i < content.length; i++) {
13
+ const v = content[i];
14
+ if (value_self) {
15
+ result[getDataByKey("" + keyIndex, v)] = v;
16
+ } else if (valueIndex instanceof Array) {
17
+ result[getDataByKey("" + keyIndex, v)] = valueIndex.map(i => getDataByKey("" + v[i], v));
18
+ } else {
19
+ result[getDataByKey("" + keyIndex, v)] = getDataByKey("" + valueIndex, v);
20
+ }
21
+ }
22
+ return result;
23
+ }
24
+
25
+ getRequireContent() {
26
+ return true;
27
+ }
28
+ }
29
+
30
+ module.exports = {
31
+ List2DictCommand,
32
+ };
@@ -0,0 +1,72 @@
1
+ const { BaseCommand } = require("./base");
2
+ const { shareData } = require("./share_data");
3
+ let logger;
4
+
5
+ class LogCommand extends BaseCommand {
6
+ async execute() {
7
+ if (!logger) {
8
+ const log4js = require('log4js');
9
+ log4js.configure({
10
+ appenders: {
11
+ automator: {
12
+ type: 'file',
13
+ filename: shareData.AUTOMATOR_ROOT + '/log/automator.log',
14
+ },
15
+ console: {
16
+ type: "console"
17
+ },
18
+ },
19
+ categories: {
20
+ default: {
21
+ appenders: ['automator'],
22
+ level: 'debug'
23
+ }
24
+ }
25
+ });
26
+ logger = log4js.getLogger();
27
+ }
28
+
29
+ switch (this.selfData && this.selfData.level) {
30
+ case "trace": {
31
+ logger.trace(this.content);
32
+ break;
33
+ }
34
+ case "debug": {
35
+ logger.debug(this.content);
36
+ break;
37
+ }
38
+ case "info": {
39
+ logger.info(this.content);
40
+ break;
41
+ }
42
+ case "warn": {
43
+ logger.warn(this.content);
44
+ break;
45
+ }
46
+ case "error": {
47
+ logger.error(this.content);
48
+ break;
49
+ }
50
+ case "fatal": {
51
+ logger.fatal(this.content);
52
+ break;
53
+ }
54
+ case "mark": {
55
+ logger.mark(this.content);
56
+ break;
57
+ }
58
+ default: {
59
+ logger.info(this.content);
60
+ break;
61
+ }
62
+ }
63
+ }
64
+
65
+ getRequireContent() {
66
+ return true;
67
+ }
68
+ }
69
+
70
+ module.exports = {
71
+ LogCommand,
72
+ };
@@ -0,0 +1,115 @@
1
+ const transform_tool = require("../utils/transform_tool");
2
+ const { progress } = require("../utils/display_tool");
3
+ const { getLastError, resetError, log } = require("../utils/log_tool");
4
+ const { BaseCommand, PROCESS_STATE } = require("./base");
5
+
6
+ class LoopCommand extends BaseCommand {
7
+ async execute() {
8
+ let data = this.selfData;
9
+ let content = this.content;
10
+ if (data.delimiter) {
11
+ content = content.split(new RegExp(data.delimiter));
12
+ }
13
+ let keys = Object.keys(content);
14
+ let show_progress = this.selfCfg.show_progress;
15
+ for (let loop_index = 0; loop_index < keys.length; loop_index++) {
16
+ if (this.globalData.process_state === PROCESS_STATE.BREAK) {
17
+ this.resetProcessState();
18
+ break;
19
+ } else if (this.globalData.process_state === PROCESS_STATE.CONTINUE) {
20
+ this.resetProcessState();
21
+ }
22
+ let loop_key = keys[loop_index];
23
+ let loop_data = content[loop_key];
24
+ // 键索引值映射
25
+ if (data.index_mapping) {
26
+ this.shareData[data.index_mapping] = loop_index;
27
+ } else {
28
+ this.shareData['loop_index'] = loop_index;
29
+ }
30
+ // 键映射
31
+ if (data.key_mapping) {
32
+ this.shareData[data.key_mapping] = loop_key;
33
+ } else {
34
+ this.shareData['loop_key'] = loop_key;
35
+ }
36
+ // 值映射
37
+ let value_mapping = data.value_mapping;
38
+ if (value_mapping) {
39
+ if (typeof value_mapping === "string") {
40
+ this.shareData[value_mapping] = loop_data;
41
+ } else if (value_mapping instanceof Array) {
42
+ for (let i = 0; i < value_mapping.length; i++) {
43
+ const k = value_mapping[i];
44
+ this.shareData[k] = loop_data[i];
45
+ }
46
+ } else if (typeof value_mapping === "object") {
47
+ for (const key in value_mapping) {
48
+ if (Object.hasOwnProperty.call(value_mapping, key)) {
49
+ const element = value_mapping[key];
50
+ this.shareData[element] = loop_data[key];
51
+ }
52
+ }
53
+ } else if (typeof value_mapping === "boolean") {
54
+ for (const key in loop_data) {
55
+ if (Object.hasOwnProperty.call(loop_data, key)) {
56
+ this.shareData[key] = loop_data[key];
57
+ }
58
+ }
59
+ }
60
+ } else {
61
+ this.shareData['loop_data'] = loop_data;
62
+ }
63
+ let tip = "";
64
+ if (data.tip_key != undefined) {
65
+ if (typeof data.tip_key === "boolean") {
66
+ tip = `[${loop_data}]`;
67
+ } else {
68
+ tip = `[${this.getDataByKey(data.tip_key)}]`;
69
+ }
70
+ }
71
+ if (show_progress) {
72
+ ++this.shareData.$COMPRESS_PROGERSS;
73
+ // log("");
74
+ progress(loop_index, keys.length, { desc: `> ${this.selfCfg.title || this.selfCfg.type}${tip}`, color: "cyan"});
75
+ // log("");
76
+ }
77
+ let commandCfgs = data.commands;
78
+ // 特殊处理字符的情况
79
+ if (typeof commandCfgs === "string") {
80
+ commandCfgs = this.formatData(commandCfgs);
81
+ }
82
+ // 默认从循环开始执行,增加深度
83
+ await this.exec(commandCfgs, this.depth + 1);
84
+ if (show_progress) {
85
+ --this.shareData.$COMPRESS_PROGERSS;
86
+ if (!getLastError()) {
87
+ progress(loop_index + 1, keys.length, {desc: `> ${this.selfCfg.title || this.selfCfg.type}${tip}`, color: "cyan"});
88
+ } else {
89
+ progress(loop_index + 1, keys.length, {desc: `> ${this.selfCfg.title || this.selfCfg.type}${tip}`, color: "cyan"});
90
+ }
91
+ // log("");
92
+ }
93
+ if (getLastError()) {
94
+ if (this.selfCfg.ignore_error) {
95
+ resetError(this.selfCfg.ignore_error);
96
+ } else {
97
+ throw getLastError();
98
+ }
99
+ }
100
+ }
101
+ if (show_progress) {
102
+ log("");
103
+ }
104
+ // 最后一个循环结束后,需要重置掉执行状态
105
+ this.resetProcessState();
106
+ }
107
+
108
+ getRequireContent() {
109
+ return true;
110
+ }
111
+ }
112
+
113
+ module.exports = {
114
+ LoopCommand,
115
+ };