reslop 0.2.4 → 0.2.6
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/CHANGELOG.md +25 -1
- package/LICENSE +1 -1
- package/README.md +12 -13
- package/bin/reslop.js +3 -8
- package/lib/ansi.js +32 -19
- package/lib/capabilities.js +8 -12
- package/lib/cli.js +40 -74
- package/lib/clipboard.js +48 -18
- package/lib/dashboard/git.js +128 -0
- package/lib/dashboard/model.js +332 -0
- package/lib/dashboard/npm.js +193 -0
- package/lib/dashboard/tree.js +278 -0
- package/lib/deps-diff.js +196 -404
- package/lib/deps.js +240 -399
- package/lib/detect.js +8 -18
- package/lib/diff/align.js +41 -113
- package/lib/diff/diff.js +12 -43
- package/lib/diff/display.js +25 -36
- package/lib/diff/edit.js +6 -20
- package/lib/diff/inline.js +138 -141
- package/lib/diff/items.js +33 -47
- package/lib/diff/parse.js +28 -56
- package/lib/diff/patch.js +12 -33
- package/lib/diff/unit.js +90 -206
- package/lib/editor.js +98 -55
- package/lib/files.js +86 -103
- package/lib/git-branches.js +254 -416
- package/lib/git-deps.js +182 -344
- package/lib/git-reword-todo.js +5 -13
- package/lib/git-worktree.js +141 -212
- package/lib/git.js +21 -49
- package/lib/github.js +67 -181
- package/lib/gitlab.js +40 -90
- package/lib/highlight/bash.js +55 -177
- package/lib/highlight/core.js +157 -132
- package/lib/highlight/css.js +25 -58
- package/lib/highlight/csv.js +19 -37
- package/lib/highlight/dart.js +72 -213
- package/lib/highlight/dot.js +16 -26
- package/lib/highlight/html.js +42 -63
- package/lib/highlight/js.js +177 -506
- package/lib/highlight/json.js +17 -37
- package/lib/highlight/log.js +22 -35
- package/lib/highlight/txt.js +9 -22
- package/lib/highlight.js +17 -46
- package/lib/keys.js +62 -85
- package/lib/manifest.js +67 -130
- package/lib/npm-commands.js +119 -189
- package/lib/remote.js +141 -197
- package/lib/render/branches.js +66 -73
- package/lib/render/chrome.js +264 -323
- package/lib/render/commits.js +187 -500
- package/lib/render/dash-activity.js +212 -0
- package/lib/render/dash-blocks.js +245 -0
- package/lib/render/dash-table.js +290 -0
- package/lib/render/dashboard.js +62 -0
- package/lib/render/diff.js +123 -228
- package/lib/render/files.js +45 -99
- package/lib/render/frame.js +129 -183
- package/lib/render/notes.js +144 -160
- package/lib/render/npm.js +234 -112
- package/lib/render/present.js +4 -11
- package/lib/render/primitives.js +131 -170
- package/lib/render/render.js +5 -14
- package/lib/render/report.js +43 -0
- package/lib/render/tiles.js +260 -0
- package/lib/render/unit.js +15 -28
- package/lib/report-model.js +110 -33
- package/lib/report-parse.js +56 -38
- package/lib/report-render.js +102 -59
- package/lib/report-run.js +87 -78
- package/lib/report-test.js +256 -141
- package/lib/report-tools.js +96 -161
- package/lib/review-merge.js +114 -152
- package/lib/review.js +115 -189
- package/lib/runs.js +225 -0
- package/lib/select.js +89 -75
- package/lib/session/accessors.js +14 -21
- package/lib/session/actions.js +82 -63
- package/lib/session/branches.js +193 -247
- package/lib/session/change-actions.js +171 -214
- package/lib/session/commit.js +280 -342
- package/lib/session/compose.js +559 -674
- package/lib/session/dashboard.js +385 -0
- package/lib/session/dispatch.js +164 -157
- package/lib/session/edit-click.js +57 -0
- package/lib/session/files-pane.js +85 -53
- package/lib/session/items.js +73 -104
- package/lib/session/lifecycle.js +403 -541
- package/lib/session/load.js +48 -68
- package/lib/session/navigation.js +96 -87
- package/lib/session/npm.js +409 -345
- package/lib/session/ops.js +196 -63
- package/lib/session/pointer.js +23 -15
- package/lib/session/progress.js +33 -21
- package/lib/session/review.js +33 -54
- package/lib/session/tasks.js +333 -0
- package/lib/session/templates.js +51 -59
- package/lib/session/terminal.js +85 -136
- package/lib/session/unit.js +3 -4
- package/lib/session/update.js +76 -97
- package/lib/session/view.js +52 -83
- package/lib/session/watch.js +208 -204
- package/lib/session.js +112 -237
- package/lib/update.js +45 -116
- package/lib/utilities.js +67 -89
- package/lib/wrap.js +33 -44
- package/package.json +1 -1
- package/lib/session/todos.js +0 -293
package/lib/report-tools.js
CHANGED
|
@@ -6,41 +6,52 @@ const model = require('./report-model.js');
|
|
|
6
6
|
|
|
7
7
|
const { summary, problem, report, userTrace } = model;
|
|
8
8
|
|
|
9
|
+
const PRETTIER_SUMMARY = [
|
|
10
|
+
'Code style issues',
|
|
11
|
+
'All matched files use Prettier',
|
|
12
|
+
];
|
|
13
|
+
|
|
9
14
|
const place = (file, line, column, root) =>
|
|
10
15
|
userTrace(`${file}:${line}:${column}`, root);
|
|
11
16
|
|
|
17
|
+
const errorReport = (tool, problems) => {
|
|
18
|
+
const stats = summary();
|
|
19
|
+
stats.errors = problems.length;
|
|
20
|
+
return report(tool, { summary: stats, problems });
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const eslintReport = (problems) => {
|
|
24
|
+
const stats = summary();
|
|
25
|
+
const isWarning = (item) => item.severity === 'warning';
|
|
26
|
+
stats.warnings = problems.filter(isWarning).length;
|
|
27
|
+
stats.errors = problems.length - stats.warnings;
|
|
28
|
+
return report('eslint', { summary: stats, problems });
|
|
29
|
+
};
|
|
30
|
+
|
|
12
31
|
const parseEslintJson = (data, root) => {
|
|
13
32
|
const rows = Array.isArray(data) ? data : data && data.results;
|
|
14
33
|
if (!Array.isArray(rows) || !rows.length) return null;
|
|
15
34
|
if (!rows[0] || !Array.isArray(rows[0].messages)) return null;
|
|
16
|
-
const stats = summary();
|
|
17
|
-
let errors = 0;
|
|
18
|
-
let warnings = 0;
|
|
19
35
|
const problems = [];
|
|
20
36
|
for (const file of rows) {
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
37
|
+
for (const item of file.messages || []) {
|
|
38
|
+
const trace = place(
|
|
39
|
+
file.filePath || '',
|
|
40
|
+
item.line || 0,
|
|
41
|
+
item.column || 0,
|
|
42
|
+
root,
|
|
43
|
+
);
|
|
26
44
|
problems.push(
|
|
27
45
|
problem({
|
|
28
|
-
severity,
|
|
46
|
+
severity: item.severity === 1 ? 'warning' : 'error',
|
|
29
47
|
message: item.message || '',
|
|
30
48
|
code: item.ruleId || '',
|
|
31
|
-
trace
|
|
32
|
-
file.filePath || '',
|
|
33
|
-
item.line || 0,
|
|
34
|
-
item.column || 0,
|
|
35
|
-
root,
|
|
36
|
-
),
|
|
49
|
+
trace,
|
|
37
50
|
}),
|
|
38
51
|
);
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
|
-
|
|
42
|
-
stats.warnings = warnings;
|
|
43
|
-
return report('eslint', { summary: stats, problems });
|
|
54
|
+
return eslintReport(problems);
|
|
44
55
|
};
|
|
45
56
|
|
|
46
57
|
const eslintLine = (line) => {
|
|
@@ -67,69 +78,35 @@ const isPathLine = (line) => {
|
|
|
67
78
|
};
|
|
68
79
|
|
|
69
80
|
const parseEslintStylish = (text, root) => {
|
|
70
|
-
const lines = `${text ?? ''}`.split(/\r?\n/);
|
|
71
81
|
const problems = [];
|
|
72
82
|
let file = '';
|
|
73
|
-
let errors = 0;
|
|
74
|
-
let warnings = 0;
|
|
75
83
|
let seen = false;
|
|
76
|
-
for (const line of
|
|
84
|
+
for (const line of `${text ?? ''}`.split(/\r?\n/)) {
|
|
77
85
|
const item = eslintLine(line);
|
|
78
86
|
if (item) {
|
|
79
87
|
seen = true;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
problems.push(
|
|
83
|
-
problem({
|
|
84
|
-
severity: item.severity,
|
|
85
|
-
message: item.message,
|
|
86
|
-
code: item.code,
|
|
87
|
-
trace: place(file, item.line, item.column, root),
|
|
88
|
-
}),
|
|
89
|
-
);
|
|
88
|
+
const { severity, message, code } = item;
|
|
89
|
+
const trace = place(file, item.line, item.column, root);
|
|
90
|
+
problems.push(problem({ severity, message, code, trace }));
|
|
90
91
|
continue;
|
|
91
92
|
}
|
|
92
93
|
if (/✖\s+\d+\s+problems?\b/.test(line)) seen = true;
|
|
93
94
|
if (isPathLine(line)) file = line.trim();
|
|
94
95
|
}
|
|
95
|
-
|
|
96
|
-
const stats = summary();
|
|
97
|
-
stats.errors = errors;
|
|
98
|
-
stats.warnings = warnings;
|
|
99
|
-
return report('eslint', { summary: stats, problems });
|
|
96
|
+
return seen ? eslintReport(problems) : null;
|
|
100
97
|
};
|
|
101
98
|
|
|
102
|
-
const
|
|
103
|
-
const match = /^(.*)\((\d+),(\d+)\):\s+error\s+(TS\d+):\s+(.*)$/.exec(
|
|
104
|
-
line.trim(),
|
|
105
|
-
);
|
|
106
|
-
if (!match) return null;
|
|
107
|
-
return {
|
|
108
|
-
file: match[1],
|
|
109
|
-
line: match[2],
|
|
110
|
-
column: match[3],
|
|
111
|
-
code: match[4],
|
|
112
|
-
message: match[5],
|
|
113
|
-
};
|
|
114
|
-
};
|
|
99
|
+
const TSC_LINE = /^(.*)\((\d+),(\d+)\):\s+error\s+(TS\d+):\s+(.*)$/;
|
|
115
100
|
|
|
116
101
|
const parseTsc = (text, root) => {
|
|
117
102
|
const problems = [];
|
|
118
103
|
for (const line of `${text ?? ''}`.split(/\r?\n/)) {
|
|
119
|
-
const
|
|
120
|
-
if (!
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
message: item.message,
|
|
124
|
-
code: item.code,
|
|
125
|
-
trace: place(item.file, item.line, item.column, root),
|
|
126
|
-
}),
|
|
127
|
-
);
|
|
104
|
+
const match = TSC_LINE.exec(line.trim());
|
|
105
|
+
if (!match) continue;
|
|
106
|
+
const trace = place(match[1], match[2], match[3], root);
|
|
107
|
+
problems.push(problem({ message: match[5], code: match[4], trace }));
|
|
128
108
|
}
|
|
129
|
-
|
|
130
|
-
const stats = summary();
|
|
131
|
-
stats.errors = problems.length;
|
|
132
|
-
return report('tsc', { summary: stats, problems });
|
|
109
|
+
return problems.length ? errorReport('tsc', problems) : null;
|
|
133
110
|
};
|
|
134
111
|
|
|
135
112
|
const prettierFile = (line) => {
|
|
@@ -138,76 +115,53 @@ const prettierFile = (line) => {
|
|
|
138
115
|
return '';
|
|
139
116
|
};
|
|
140
117
|
|
|
118
|
+
const isPrettierSummary = (line) =>
|
|
119
|
+
PRETTIER_SUMMARY.some((text) => line.includes(text));
|
|
120
|
+
|
|
141
121
|
const parsePrettier = (text, root) => {
|
|
142
|
-
const lines = `${text ?? ''}`.split(/\r?\n/);
|
|
143
122
|
const problems = [];
|
|
144
123
|
let seen = false;
|
|
145
|
-
for (const line of
|
|
146
|
-
if (line
|
|
147
|
-
if (line.includes('All matched files use Prettier')) seen = true;
|
|
124
|
+
for (const line of `${text ?? ''}`.split(/\r?\n/)) {
|
|
125
|
+
if (isPrettierSummary(line)) seen = true;
|
|
148
126
|
const file = prettierFile(line);
|
|
149
127
|
if (!file) continue;
|
|
150
128
|
seen = true;
|
|
151
|
-
problems.push(
|
|
152
|
-
problem({
|
|
153
|
-
message: 'format',
|
|
154
|
-
trace: userTrace(file, root),
|
|
155
|
-
}),
|
|
156
|
-
);
|
|
129
|
+
problems.push(problem({ message: 'format', trace: userTrace(file, root) }));
|
|
157
130
|
}
|
|
158
|
-
|
|
159
|
-
const stats = summary();
|
|
160
|
-
stats.errors = problems.length;
|
|
161
|
-
return report('prettier', { summary: stats, problems });
|
|
131
|
+
return seen ? errorReport('prettier', problems) : null;
|
|
162
132
|
};
|
|
163
133
|
|
|
164
134
|
const auditExtra = (item) => {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (item.range) {
|
|
169
|
-
extra[index] = ['range', item.range];
|
|
170
|
-
index += 1;
|
|
171
|
-
}
|
|
172
|
-
if (item.fix) extra[index] = ['fix', item.fix];
|
|
135
|
+
const extra = [];
|
|
136
|
+
if (item.range) extra.push(['range', item.range]);
|
|
137
|
+
if (item.fix) extra.push(['fix', item.fix]);
|
|
173
138
|
return extra;
|
|
174
139
|
};
|
|
175
140
|
|
|
176
|
-
const auditProblems = (text) => {
|
|
177
|
-
const audit = parseAuditReport(text);
|
|
178
|
-
const problems = new Array(audit.size);
|
|
179
|
-
let index = 0;
|
|
180
|
-
for (const item of audit.values()) {
|
|
181
|
-
problems[index] = problem({
|
|
182
|
-
severity: item.severity || 'error',
|
|
183
|
-
name: item.name,
|
|
184
|
-
message: item.title || '',
|
|
185
|
-
extra: auditExtra(item),
|
|
186
|
-
});
|
|
187
|
-
index += 1;
|
|
188
|
-
}
|
|
189
|
-
return problems;
|
|
190
|
-
};
|
|
191
|
-
|
|
192
141
|
const parseAudit = (text) => {
|
|
193
|
-
const problems =
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
142
|
+
const problems = [];
|
|
143
|
+
for (const item of parseAuditReport(text).values()) {
|
|
144
|
+
problems.push(
|
|
145
|
+
problem({
|
|
146
|
+
severity: item.severity || 'error',
|
|
147
|
+
name: item.name,
|
|
148
|
+
message: item.title || '',
|
|
149
|
+
extra: auditExtra(item),
|
|
150
|
+
}),
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
return problems.length ? errorReport('audit', problems) : null;
|
|
198
154
|
};
|
|
199
155
|
|
|
200
156
|
const behind = (item) => {
|
|
201
157
|
if (!item.current) return true;
|
|
202
158
|
if (item.wanted && item.wanted !== item.current) return true;
|
|
203
|
-
|
|
204
|
-
return false;
|
|
159
|
+
return !!item.latest && item.latest !== item.current;
|
|
205
160
|
};
|
|
206
161
|
|
|
207
162
|
const parseOutdated = (text) => {
|
|
208
|
-
const outdated = parseOutdatedReport(text);
|
|
209
163
|
const problems = [];
|
|
210
|
-
for (const [name, item] of
|
|
164
|
+
for (const [name, item] of parseOutdatedReport(text)) {
|
|
211
165
|
if (!behind(item)) continue;
|
|
212
166
|
problems.push(
|
|
213
167
|
problem({
|
|
@@ -230,8 +184,7 @@ const parseOutdated = (text) => {
|
|
|
230
184
|
|
|
231
185
|
const pushLs = (problems, text) => {
|
|
232
186
|
const message = `${text ?? ''}`.trim();
|
|
233
|
-
if (
|
|
234
|
-
problems.push(problem({ message }));
|
|
187
|
+
if (message) problems.push(problem({ message }));
|
|
235
188
|
};
|
|
236
189
|
|
|
237
190
|
const walkLs = (node, problems) => {
|
|
@@ -251,13 +204,12 @@ const walkLs = (node, problems) => {
|
|
|
251
204
|
|
|
252
205
|
const parseLs = (data) => {
|
|
253
206
|
if (!data || typeof data !== 'object' || Array.isArray(data)) return null;
|
|
254
|
-
|
|
207
|
+
const listed = Array.isArray(data.problems);
|
|
208
|
+
if (!data.dependencies && !listed) return null;
|
|
255
209
|
const problems = [];
|
|
256
210
|
walkLs(data, problems);
|
|
257
|
-
if (!problems.length && !
|
|
258
|
-
|
|
259
|
-
stats.errors = problems.length;
|
|
260
|
-
return report('ls', { summary: stats, problems });
|
|
211
|
+
if (!problems.length && !listed) return null;
|
|
212
|
+
return errorReport('ls', problems);
|
|
261
213
|
};
|
|
262
214
|
|
|
263
215
|
const parseToolJson = (data, root) => {
|
|
@@ -281,57 +233,40 @@ const parseAuditText = (text) => {
|
|
|
281
233
|
const match = /^Severity:\s+(\w+)\s*$/.exec(lines[index].trim());
|
|
282
234
|
if (!match) continue;
|
|
283
235
|
const name = (lines[index - 1] || '').trim();
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
severity: match[1].toLowerCase(),
|
|
287
|
-
name,
|
|
288
|
-
message: name,
|
|
289
|
-
}),
|
|
290
|
-
);
|
|
236
|
+
const severity = match[1].toLowerCase();
|
|
237
|
+
problems.push(problem({ severity, name, message: name }));
|
|
291
238
|
}
|
|
292
|
-
|
|
293
|
-
const stats = summary();
|
|
294
|
-
stats.errors = problems.length;
|
|
295
|
-
return report('audit', { summary: stats, problems });
|
|
239
|
+
return problems.length ? errorReport('audit', problems) : null;
|
|
296
240
|
};
|
|
297
241
|
|
|
298
|
-
const TOOL_SLOTS = 4;
|
|
299
|
-
|
|
300
242
|
const parseToolText = (text, root) => {
|
|
301
|
-
const reports =
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
return reports;
|
|
243
|
+
const reports = [
|
|
244
|
+
parseEslintStylish(text, root),
|
|
245
|
+
parseTsc(text, root),
|
|
246
|
+
parsePrettier(text, root),
|
|
247
|
+
parseAuditText(text),
|
|
248
|
+
];
|
|
249
|
+
return reports.filter(Boolean);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
const isPrettierLine = (line) => {
|
|
253
|
+
const text = line.trim();
|
|
254
|
+
if (!text) return false;
|
|
255
|
+
if (prettierFile(text) || isPrettierSummary(text)) return true;
|
|
256
|
+
return text.startsWith('Checking formatting');
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const stderrRest = (text, reports) => {
|
|
260
|
+
if (!reports.some((item) => item.tool === 'prettier')) return text;
|
|
261
|
+
const lines = `${text ?? ''}`.split(/\r?\n/);
|
|
262
|
+
return lines
|
|
263
|
+
.filter((line) => !isPrettierLine(line))
|
|
264
|
+
.join('\n')
|
|
265
|
+
.trim();
|
|
325
266
|
};
|
|
326
267
|
|
|
327
268
|
module.exports = {
|
|
328
|
-
parseEslintJson,
|
|
329
|
-
parseEslintStylish,
|
|
330
|
-
parseTsc,
|
|
331
|
-
parsePrettier,
|
|
332
|
-
parseAudit,
|
|
333
|
-
parseOutdated,
|
|
334
|
-
parseLs,
|
|
335
269
|
parseToolJson,
|
|
336
270
|
parseToolText,
|
|
271
|
+
stderrRest,
|
|
337
272
|
};
|