@lage-run/reporters 1.3.7 → 1.4.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.
- package/lib/AdoReporter.d.ts +8 -17
- package/lib/AdoReporter.js +26 -175
- package/lib/AdoReporter.js.map +1 -1
- package/lib/BasicReporter.js.map +1 -1
- package/lib/ChromeTraceEventsReporter.d.ts +5 -2
- package/lib/ChromeTraceEventsReporter.js +1 -1
- package/lib/ChromeTraceEventsReporter.js.map +1 -1
- package/lib/GithubActionsReporter.d.ts +9 -0
- package/lib/GithubActionsReporter.js +43 -0
- package/lib/GithubActionsReporter.js.map +1 -0
- package/lib/GroupedReporter.d.ts +58 -0
- package/lib/GroupedReporter.js +202 -0
- package/lib/GroupedReporter.js.map +1 -0
- package/lib/JsonReporter.js.map +1 -1
- package/lib/LogReporter.d.ts +5 -4
- package/lib/LogReporter.js +1 -3
- package/lib/LogReporter.js.map +1 -1
- package/lib/ProgressReporter.d.ts +6 -10
- package/lib/ProgressReporter.js +0 -11
- package/lib/ProgressReporter.js.map +1 -1
- package/lib/VerboseFileLogReporter.d.ts +6 -2
- package/lib/VerboseFileLogReporter.js +11 -8
- package/lib/VerboseFileLogReporter.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/package.json +14 -12
- package/CHANGELOG.json +0 -2015
- package/CHANGELOG.md +0 -805
- package/jest.config.js +0 -1
- package/tsconfig.json +0 -8
package/lib/AdoReporter.d.ts
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]>;
|
|
10
|
-
constructor(options: {
|
|
11
|
-
logLevel?: LogLevel;
|
|
12
|
-
grouped?: boolean;
|
|
13
|
-
});
|
|
14
|
-
log(entry: LogEntry<any>): boolean | void;
|
|
15
|
-
private logTargetEntry;
|
|
16
|
-
private logTargetEntryByGroup;
|
|
17
|
-
summarize(schedulerRunSummary: SchedulerRunSummary): void;
|
|
1
|
+
import type { TargetRun } from "@lage-run/scheduler-types";
|
|
2
|
+
import { GroupedReporter } from "./GroupedReporter.js";
|
|
3
|
+
export declare class AdoReporter extends GroupedReporter {
|
|
4
|
+
protected formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string;
|
|
5
|
+
protected formatGroupEnd(): string;
|
|
6
|
+
protected writeSummaryHeader(): void;
|
|
7
|
+
protected writeSummaryFooter(): void;
|
|
8
|
+
protected writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void;
|
|
18
9
|
}
|
package/lib/AdoReporter.js
CHANGED
|
@@ -9,193 +9,44 @@ Object.defineProperty(exports, "AdoReporter", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _formathrtime = require("@lage-run/format-hrtime");
|
|
12
|
-
const _isTargetStatusLogEntry = require("./isTargetStatusLogEntry.js");
|
|
13
|
-
const _logger = require("@lage-run/logger");
|
|
14
12
|
const _chalk = /*#__PURE__*/ _interop_require_default(require("chalk"));
|
|
15
|
-
const
|
|
16
|
-
function _define_property(obj, key, value) {
|
|
17
|
-
if (key in obj) {
|
|
18
|
-
Object.defineProperty(obj, key, {
|
|
19
|
-
value: value,
|
|
20
|
-
enumerable: true,
|
|
21
|
-
configurable: true,
|
|
22
|
-
writable: true
|
|
23
|
-
});
|
|
24
|
-
} else {
|
|
25
|
-
obj[key] = value;
|
|
26
|
-
}
|
|
27
|
-
return obj;
|
|
28
|
-
}
|
|
13
|
+
const _GroupedReporter = require("./GroupedReporter.js");
|
|
29
14
|
function _interop_require_default(obj) {
|
|
30
15
|
return obj && obj.__esModule ? obj : {
|
|
31
16
|
default: obj
|
|
32
17
|
};
|
|
33
18
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
[_logger.LogLevel.warn]: _chalk.default.white,
|
|
38
|
-
[_logger.LogLevel.error]: _chalk.default.white,
|
|
39
|
-
[_logger.LogLevel.silly]: _chalk.default.green,
|
|
40
|
-
task: _chalk.default.cyan,
|
|
41
|
-
pkg: _chalk.default.magenta,
|
|
42
|
-
ok: _chalk.default.green,
|
|
43
|
-
error: _chalk.default.red,
|
|
44
|
-
warn: _chalk.default.yellow
|
|
45
|
-
};
|
|
46
|
-
const logLevelLabel = {
|
|
47
|
-
[_logger.LogLevel.info]: "INFO",
|
|
48
|
-
[_logger.LogLevel.warn]: "WARN",
|
|
49
|
-
[_logger.LogLevel.error]: "ERR!",
|
|
50
|
-
[_logger.LogLevel.silly]: "SILLY",
|
|
51
|
-
[_logger.LogLevel.verbose]: "VERB"
|
|
52
|
-
};
|
|
53
|
-
function getTaskLogPrefix(pkg, task) {
|
|
54
|
-
return `${colors.pkg(pkg)} ${colors.task(task)}`;
|
|
55
|
-
}
|
|
56
|
-
function normalize(prefixOrMessage, message) {
|
|
57
|
-
if (typeof message === "string") {
|
|
58
|
-
const prefix = prefixOrMessage;
|
|
59
|
-
return {
|
|
60
|
-
prefix,
|
|
61
|
-
message
|
|
62
|
-
};
|
|
63
|
-
} else {
|
|
64
|
-
const prefix = "";
|
|
65
|
-
const message = prefixOrMessage;
|
|
66
|
-
return {
|
|
67
|
-
prefix,
|
|
68
|
-
message
|
|
69
|
-
};
|
|
19
|
+
class AdoReporter extends _GroupedReporter.GroupedReporter {
|
|
20
|
+
formatGroupStart(packageName, task, status, duration) {
|
|
21
|
+
return `##[group] ${_GroupedReporter.colors.pkg(packageName)} ${_GroupedReporter.colors.task(task)} ${status}${duration ? `, took ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(duration))}` : ""}\n`;
|
|
70
22
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
return `${logLevelLabel[level]}: ${prefix} ${message}\n`;
|
|
74
|
-
}
|
|
75
|
-
class AdoReporter {
|
|
76
|
-
log(entry) {
|
|
77
|
-
if (entry.data && entry.data.target && entry.data.target.hidden) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (entry.data && entry.data.target) {
|
|
81
|
-
if (!this.logEntries.has(entry.data.target.id)) {
|
|
82
|
-
this.logEntries.set(entry.data.target.id, []);
|
|
83
|
-
}
|
|
84
|
-
this.logEntries.get(entry.data.target.id).push(entry);
|
|
85
|
-
}
|
|
86
|
-
if (this.options.logLevel >= entry.level) {
|
|
87
|
-
if (this.options.grouped && entry.data?.target) {
|
|
88
|
-
return this.logTargetEntryByGroup(entry);
|
|
89
|
-
}
|
|
90
|
-
return this.logTargetEntry(entry);
|
|
91
|
-
}
|
|
23
|
+
formatGroupEnd() {
|
|
24
|
+
return `##[endgroup]\n`;
|
|
92
25
|
}
|
|
93
|
-
|
|
94
|
-
const colorFn = colors[entry.level];
|
|
95
|
-
const data = entry.data;
|
|
96
|
-
if ((0, _isTargetStatusLogEntry.isTargetStatusLogEntry)(data)) {
|
|
97
|
-
const { target, hash, duration } = data;
|
|
98
|
-
const { packageName, task } = target;
|
|
99
|
-
const normalizedArgs = this.options.grouped ? normalize(entry.msg) : normalize(getTaskLogPrefix(packageName ?? "<root>", task), entry.msg);
|
|
100
|
-
const pkgTask = this.options.grouped ? `${_chalk.default.magenta(packageName)} ${_chalk.default.cyan(task)}` : "";
|
|
101
|
-
switch(data.status){
|
|
102
|
-
case "running":
|
|
103
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("➔")} start ${pkgTask}`)));
|
|
104
|
-
case "success":
|
|
105
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("✓")} done ${pkgTask} - ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(duration))}`)));
|
|
106
|
-
case "failed":
|
|
107
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.error("✖")} fail ${pkgTask}`)));
|
|
108
|
-
case "skipped":
|
|
109
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("»")} skip ${pkgTask} - ${hash}`)));
|
|
110
|
-
case "aborted":
|
|
111
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn("-")} aborted ${pkgTask}`)));
|
|
112
|
-
case "queued":
|
|
113
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn("…")} aborted ${pkgTask}`)));
|
|
114
|
-
}
|
|
115
|
-
} else if (entry?.data?.target) {
|
|
116
|
-
const { target } = data;
|
|
117
|
-
const { packageName, task } = target;
|
|
118
|
-
const normalizedArgs = this.options.grouped ? normalize(entry.msg) : normalize(getTaskLogPrefix(packageName ?? "<root>", task), entry.msg);
|
|
119
|
-
return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn("| " + normalizedArgs.message)));
|
|
120
|
-
} else if (entry?.msg.trim() !== "") {
|
|
121
|
-
return this.logStream.write(format(entry.level, "", entry.msg));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
logTargetEntryByGroup(entry) {
|
|
125
|
-
const data = entry.data;
|
|
126
|
-
const target = data.target;
|
|
127
|
-
const { id } = target;
|
|
128
|
-
this.groupedEntries.set(id, this.groupedEntries.get(id) || []);
|
|
129
|
-
this.groupedEntries.get(id)?.push(entry);
|
|
130
|
-
if ((0, _isTargetStatusLogEntry.isTargetStatusLogEntry)(data)) {
|
|
131
|
-
if (data.status === "success" || data.status === "failed" || data.status === "skipped" || data.status === "aborted") {
|
|
132
|
-
const { status, duration } = data;
|
|
133
|
-
this.logStream.write(`##[group] ${colors.pkg(data.target.packageName ?? "<root>")} ${colors.task(data.target.task)} ${status}${duration ? `, took ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(duration))}` : ""}\n`);
|
|
134
|
-
const entries = this.groupedEntries.get(id);
|
|
135
|
-
for (const targetEntry of entries){
|
|
136
|
-
this.logTargetEntry(targetEntry);
|
|
137
|
-
}
|
|
138
|
-
this.logStream.write(`##[endgroup]\n`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
summarize(schedulerRunSummary) {
|
|
143
|
-
const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;
|
|
144
|
-
const { failed, aborted, skipped, success, pending } = targetRunByStatus;
|
|
145
|
-
const statusColorFn = {
|
|
146
|
-
success: _chalk.default.greenBright,
|
|
147
|
-
failed: _chalk.default.redBright,
|
|
148
|
-
skipped: _chalk.default.gray,
|
|
149
|
-
running: _chalk.default.yellow,
|
|
150
|
-
pending: _chalk.default.gray,
|
|
151
|
-
aborted: _chalk.default.red,
|
|
152
|
-
queued: _chalk.default.magenta
|
|
153
|
-
};
|
|
26
|
+
writeSummaryHeader() {
|
|
154
27
|
this.logStream.write(_chalk.default.cyanBright(`##[section]Summary\n`));
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
if (target) {
|
|
173
|
-
const { packageName, task } = target;
|
|
174
|
-
const taskLogs = this.logEntries.get(targetId);
|
|
175
|
-
packagesMessage += `[${packageName} ${task}], `;
|
|
176
|
-
this.logStream.write(`##[error] [${_chalk.default.magenta(packageName)} ${_chalk.default.cyan(task)}] ${_chalk.default.redBright("ERROR DETECTED")}\n`);
|
|
177
|
-
if (taskLogs) {
|
|
178
|
-
for (const entry of taskLogs){
|
|
179
|
-
// Log each entry separately to prevent truncation
|
|
180
|
-
this.logStream.write(`##[error] ${entry.msg}\n`);
|
|
181
|
-
}
|
|
28
|
+
}
|
|
29
|
+
writeSummaryFooter() {
|
|
30
|
+
// ADO sections have no closing marker
|
|
31
|
+
}
|
|
32
|
+
writeFailures(failed, targetRuns) {
|
|
33
|
+
let packagesMessage = `##vso[task.logissue type=error]Your build failed on the following packages => `;
|
|
34
|
+
for (const targetId of failed){
|
|
35
|
+
const target = targetRuns.get(targetId)?.target;
|
|
36
|
+
if (target) {
|
|
37
|
+
const { packageName, task } = target;
|
|
38
|
+
const taskLogs = this.logEntries.get(targetId);
|
|
39
|
+
packagesMessage += `[${packageName} ${task}], `;
|
|
40
|
+
this.logStream.write(`##[error] [${_chalk.default.magenta(packageName)} ${_chalk.default.cyan(task)}] ${_chalk.default.redBright("ERROR DETECTED")}\n`);
|
|
41
|
+
if (taskLogs) {
|
|
42
|
+
for (const entry of taskLogs){
|
|
43
|
+
// Log each entry separately to prevent truncation
|
|
44
|
+
this.logStream.write(`##[error] ${entry.msg}\n`);
|
|
182
45
|
}
|
|
183
46
|
}
|
|
184
47
|
}
|
|
185
|
-
packagesMessage += "find the error logs above with the prefix '##[error]!'\n";
|
|
186
|
-
this.logStream.write(packagesMessage);
|
|
187
48
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
constructor(options){
|
|
191
|
-
_define_property(this, "options", void 0);
|
|
192
|
-
_define_property(this, "logStream", void 0);
|
|
193
|
-
_define_property(this, "logEntries", void 0);
|
|
194
|
-
_define_property(this, "groupedEntries", void 0);
|
|
195
|
-
this.options = options;
|
|
196
|
-
this.logStream = process.stdout;
|
|
197
|
-
this.logEntries = new Map();
|
|
198
|
-
this.groupedEntries = new Map();
|
|
199
|
-
options.logLevel = options.logLevel || _logger.LogLevel.info;
|
|
49
|
+
packagesMessage += "find the error logs above with the prefix '##[error]!'\n";
|
|
50
|
+
this.logStream.write(packagesMessage);
|
|
200
51
|
}
|
|
201
52
|
}
|
package/lib/AdoReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/AdoReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { isTargetStatusLogEntry } from \"./isTargetStatusLogEntry.js\";\nimport { LogLevel, type LogStructuredData } from \"@lage-run/logger\";\nimport chalk from \"chalk\";\nimport type { Reporter, LogEntry } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { TargetMessageEntry, TargetStatusEntry } from \"./types/TargetLogEntry.js\";\nimport type { Writable } from \"stream\";\nimport { slowestTargetRuns } from \"./slowestTargetRuns.js\";\n\nconst colors = {\n [LogLevel.info]: chalk.white,\n [LogLevel.verbose]: chalk.gray,\n [LogLevel.warn]: chalk.white,\n [LogLevel.error]: chalk.white,\n [LogLevel.silly]: chalk.green,\n task: chalk.cyan,\n pkg: chalk.magenta,\n ok: chalk.green,\n error: chalk.red,\n warn: chalk.yellow,\n};\n\nconst logLevelLabel = {\n [LogLevel.info]: \"INFO\",\n [LogLevel.warn]: \"WARN\",\n [LogLevel.error]: \"ERR!\",\n [LogLevel.silly]: \"SILLY\",\n [LogLevel.verbose]: \"VERB\",\n};\n\nfunction getTaskLogPrefix(pkg: string, task: string) {\n return `${colors.pkg(pkg)} ${colors.task(task)}`;\n}\n\nfunction normalize(prefixOrMessage: string, message?: string) {\n if (typeof message === \"string\") {\n const prefix = prefixOrMessage;\n return { prefix, message };\n } else {\n const prefix = \"\";\n const message = prefixOrMessage;\n return { prefix, message };\n }\n}\n\nfunction format(level: LogLevel, prefix: string, message: string) {\n return `${logLevelLabel[level]}: ${prefix} ${message}\\n`;\n}\n\nexport class AdoReporter implements Reporter {\n logStream: Writable = process.stdout;\n\n private logEntries = new Map<string, LogEntry[]>();\n readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]> = new Map<string, LogEntry[]>();\n\n constructor(private options: { logLevel?: LogLevel; grouped?: boolean }) {\n options.logLevel = options.logLevel || LogLevel.info;\n }\n\n log(entry: LogEntry<any>): boolean | void {\n if (entry.data && entry.data.target && entry.data.target.hidden) {\n return;\n }\n\n if (entry.data && entry.data.target) {\n if (!this.logEntries.has(entry.data.target.id)) {\n this.logEntries.set(entry.data.target.id, []);\n }\n\n this.logEntries.get(entry.data.target.id)!.push(entry);\n }\n\n if (this.options.logLevel! >= entry.level) {\n if (this.options.grouped && entry.data?.target) {\n return this.logTargetEntryByGroup(entry);\n }\n\n return this.logTargetEntry(entry);\n }\n }\n\n private logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const colorFn = colors[entry.level];\n const data = entry.data!;\n\n if (isTargetStatusLogEntry(data)) {\n const { target, hash, duration } = data;\n const { packageName, task } = target;\n\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n\n const pkgTask = this.options.grouped ? `${chalk.magenta(packageName)} ${chalk.cyan(task)}` : \"\";\n\n switch (data.status) {\n case \"running\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"➔\")} start ${pkgTask}`)));\n\n case \"success\":\n return this.logStream.write(\n format(\n entry.level,\n normalizedArgs.prefix,\n colorFn(`${colors.ok(\"✓\")} done ${pkgTask} - ${formatDuration(hrToSeconds(duration!))}`)\n )\n );\n\n case \"failed\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.error(\"✖\")} fail ${pkgTask}`)));\n\n case \"skipped\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok(\"»\")} skip ${pkgTask} - ${hash!}`)));\n\n case \"aborted\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"-\")} aborted ${pkgTask}`)));\n\n case \"queued\":\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn(\"…\")} aborted ${pkgTask}`)));\n }\n } else if (entry?.data?.target) {\n const { target } = data;\n const { packageName, task } = target;\n const normalizedArgs = this.options.grouped\n ? normalize(entry.msg)\n : normalize(getTaskLogPrefix(packageName ?? \"<root>\", task), entry.msg);\n return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(\"| \" + normalizedArgs.message)));\n } else if (entry?.msg.trim() !== \"\") {\n return this.logStream.write(format(entry.level, \"\", entry.msg));\n }\n }\n\n private logTargetEntryByGroup(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>) {\n const data = entry.data!;\n\n const target = data.target;\n const { id } = target;\n\n this.groupedEntries.set(id, this.groupedEntries.get(id) || []);\n this.groupedEntries.get(id)?.push(entry);\n\n if (isTargetStatusLogEntry(data)) {\n if (data.status === \"success\" || data.status === \"failed\" || data.status === \"skipped\" || data.status === \"aborted\") {\n const { status, duration } = data;\n this.logStream.write(\n `##[group] ${colors.pkg(data.target.packageName ?? \"<root>\")} ${colors.task(data.target.task)} ${status}${\n duration ? `, took ${formatDuration(hrToSeconds(duration))}` : \"\"\n }\\n`\n );\n const entries = this.groupedEntries.get(id)! as LogEntry<TargetStatusEntry>[];\n\n for (const targetEntry of entries) {\n this.logTargetEntry(targetEntry);\n }\n\n this.logStream.write(`##[endgroup]\\n`);\n }\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n const statusColorFn: {\n [status in TargetStatus]: chalk.Chalk;\n } = {\n success: chalk.greenBright,\n failed: chalk.redBright,\n skipped: chalk.gray,\n running: chalk.yellow,\n pending: chalk.gray,\n aborted: chalk.red,\n queued: chalk.magenta,\n };\n\n this.logStream.write(chalk.cyanBright(`##[section]Summary\\n`));\n\n if (targetRuns.size > 0) {\n const slowestTargets = slowestTargetRuns([...targetRuns.values()]);\n\n for (const wrappedTarget of slowestTargets) {\n const colorFn = statusColorFn[wrappedTarget.status];\n const target = wrappedTarget.target;\n\n this.logStream.write(\n format(\n LogLevel.info,\n getTaskLogPrefix(target.packageName || \"[GLOBAL]\", target.task),\n colorFn(\n `${wrappedTarget.status}${wrappedTarget.duration ? `, took ${formatDuration(hrToSeconds(wrappedTarget.duration))}` : \"\"}`\n )\n )\n );\n }\n\n this.logStream.write(\n `[Tasks Count] success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}\\n`\n );\n } else {\n this.logStream.write(\"Nothing has been run.\\n\");\n }\n\n if (failed && failed.length > 0) {\n let packagesMessage = `##vso[task.logissue type=error]Your build failed on the following packages => `;\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const taskLogs = this.logEntries.get(targetId);\n\n packagesMessage += `[${packageName} ${task}], `;\n\n this.logStream.write(`##[error] [${chalk.magenta(packageName)} ${chalk.cyan(task)}] ${chalk.redBright(\"ERROR DETECTED\")}\\n`);\n\n if (taskLogs) {\n for (const entry of taskLogs) {\n // Log each entry separately to prevent truncation\n this.logStream.write(`##[error] ${entry.msg}\\n`);\n }\n }\n }\n }\n\n packagesMessage += \"find the error logs above with the prefix '##[error]!'\\n\";\n this.logStream.write(packagesMessage);\n }\n\n this.logStream.write(format(LogLevel.info, \"\", `Took a total of ${formatDuration(hrToSeconds(duration))} to complete`));\n }\n}\n"],"names":["AdoReporter","colors","LogLevel","info","chalk","white","verbose","gray","warn","error","silly","green","task","cyan","pkg","magenta","ok","red","yellow","logLevelLabel","getTaskLogPrefix","normalize","prefixOrMessage","message","prefix","format","level","log","entry","data","target","hidden","logEntries","has","id","set","get","push","options","logLevel","grouped","logTargetEntryByGroup","logTargetEntry","colorFn","isTargetStatusLogEntry","hash","duration","packageName","normalizedArgs","msg","pkgTask","status","logStream","write","formatDuration","hrToSeconds","trim","groupedEntries","entries","targetEntry","summarize","schedulerRunSummary","targetRuns","targetRunByStatus","failed","aborted","skipped","success","pending","statusColorFn","greenBright","redBright","running","queued","cyanBright","size","slowestTargets","slowestTargetRuns","values","wrappedTarget","length","packagesMessage","targetId","taskLogs","process","stdout","Map"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/AdoReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport chalk from \"chalk\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { colors, GroupedReporter } from \"./GroupedReporter.js\";\n\nexport class AdoReporter extends GroupedReporter {\n protected formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string {\n return `##[group] ${colors.pkg(packageName)} ${colors.task(task)} ${status}${\n duration ? `, took ${formatDuration(hrToSeconds(duration))}` : \"\"\n }\\n`;\n }\n\n protected formatGroupEnd(): string {\n return `##[endgroup]\\n`;\n }\n\n protected writeSummaryHeader(): void {\n this.logStream.write(chalk.cyanBright(`##[section]Summary\\n`));\n }\n\n protected writeSummaryFooter(): void {\n // ADO sections have no closing marker\n }\n\n protected writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void {\n let packagesMessage = `##vso[task.logissue type=error]Your build failed on the following packages => `;\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const taskLogs = this.logEntries.get(targetId);\n\n packagesMessage += `[${packageName} ${task}], `;\n\n this.logStream.write(`##[error] [${chalk.magenta(packageName)} ${chalk.cyan(task)}] ${chalk.redBright(\"ERROR DETECTED\")}\\n`);\n\n if (taskLogs) {\n for (const entry of taskLogs) {\n // Log each entry separately to prevent truncation\n this.logStream.write(`##[error] ${entry.msg}\\n`);\n }\n }\n }\n }\n\n packagesMessage += \"find the error logs above with the prefix '##[error]!'\\n\";\n this.logStream.write(packagesMessage);\n }\n}\n"],"names":["AdoReporter","GroupedReporter","formatGroupStart","packageName","task","status","duration","colors","pkg","formatDuration","hrToSeconds","formatGroupEnd","writeSummaryHeader","logStream","write","chalk","cyanBright","writeSummaryFooter","writeFailures","failed","targetRuns","packagesMessage","targetId","target","get","taskLogs","logEntries","magenta","cyan","redBright","entry","msg"],"mappings":";;;;+BAKaA;;;eAAAA;;;8BAL+B;8DAC1B;iCAEsB;;;;;;AAEjC,MAAMA,oBAAoBC,gCAAe;IACpCC,iBAAiBC,WAAmB,EAAEC,IAAY,EAAEC,MAAc,EAAEC,QAA2B,EAAU;QACjH,OAAO,CAAC,UAAU,EAAEC,uBAAM,CAACC,GAAG,CAACL,aAAa,CAAC,EAAEI,uBAAM,CAACH,IAAI,CAACA,MAAM,CAAC,EAAEC,SAClEC,WAAW,CAAC,OAAO,EAAEG,IAAAA,4BAAc,EAACC,IAAAA,yBAAW,EAACJ,YAAY,GAAG,GAChE,EAAE,CAAC;IACN;IAEUK,iBAAyB;QACjC,OAAO,CAAC,cAAc,CAAC;IACzB;IAEUC,qBAA2B;QACnC,IAAI,CAACC,SAAS,CAACC,KAAK,CAACC,cAAK,CAACC,UAAU,CAAC,CAAC,oBAAoB,CAAC;IAC9D;IAEUC,qBAA2B;IACnC,sCAAsC;IACxC;IAEUC,cAAcC,MAAgB,EAAEC,UAA2C,EAAQ;QAC3F,IAAIC,kBAAkB,CAAC,8EAA8E,CAAC;QAEtG,KAAK,MAAMC,YAAYH,OAAQ;YAC7B,MAAMI,SAASH,WAAWI,GAAG,CAACF,WAAWC;YAEzC,IAAIA,QAAQ;gBACV,MAAM,EAAEpB,WAAW,EAAEC,IAAI,EAAE,GAAGmB;gBAC9B,MAAME,WAAW,IAAI,CAACC,UAAU,CAACF,GAAG,CAACF;gBAErCD,mBAAmB,CAAC,CAAC,EAAElB,YAAY,CAAC,EAAEC,KAAK,GAAG,CAAC;gBAE/C,IAAI,CAACS,SAAS,CAACC,KAAK,CAAC,CAAC,WAAW,EAAEC,cAAK,CAACY,OAAO,CAACxB,aAAa,CAAC,EAAEY,cAAK,CAACa,IAAI,CAACxB,MAAM,EAAE,EAAEW,cAAK,CAACc,SAAS,CAAC,kBAAkB,EAAE,CAAC;gBAE3H,IAAIJ,UAAU;oBACZ,KAAK,MAAMK,SAASL,SAAU;wBAC5B,kDAAkD;wBAClD,IAAI,CAACZ,SAAS,CAACC,KAAK,CAAC,CAAC,UAAU,EAAEgB,MAAMC,GAAG,CAAC,EAAE,CAAC;oBACjD;gBACF;YACF;QACF;QAEAV,mBAAmB;QACnB,IAAI,CAACR,SAAS,CAACC,KAAK,CAACO;IACvB;AACF"}
|
package/lib/BasicReporter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/BasicReporter.ts"],"sourcesContent":["import { type LogEntry, type Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport chalk from \"chalk\";\nimport { gradient } from \"./gradient.js\";\nimport { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { formatBytes } from \"./formatBytes.js\";\n\ntype CoarseStatus = \"completed\" | \"running\" | \"pending\";\n\nconst coarseStatus: Record<TargetStatus, CoarseStatus> = {\n success: \"completed\",\n failed: \"completed\",\n skipped: \"completed\",\n aborted: \"completed\",\n running: \"running\",\n pending: \"pending\",\n queued: \"pending\",\n};\n\ntype CompletionStatus = \"success\" | \"failed\" | \"skipped\" | \"aborted\";\nconst isCompletionStatus = (status: TargetStatus): status is CompletionStatus => coarseStatus[status] === \"completed\";\n\nconst colors = {\n label: chalk.white,\n timestamp: chalk.gray,\n duration: chalk.gray,\n success: chalk.green,\n failed: chalk.red,\n skipped: chalk.gray,\n aborted: chalk.yellow,\n summary: chalk.cyanBright,\n task: chalk.hex(\"#00DDDD\"),\n pkg: chalk.hex(\"#FFD66B\"),\n};\n\nconst hrLine = \"┈\".repeat(80);\n\nconst icons: Record<CompletionStatus, string> = {\n success: \"✓\",\n failed: \"✗\",\n skipped: \"-\",\n aborted: \"-\",\n};\n\nconst terminal = {\n hideCursor: \"\\x1b[?25l\",\n showCursor: \"\\x1b[?25h\",\n clearLine: \"\\x1b[2K\\r\",\n};\n\nconst fancy = (str: string) => gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(str);\nconst print = (message: string) => process.stdout.write(message + \"\\n\");\n\nexport class BasicReporter implements Reporter {\n private taskData = new Map<string, { target: Target; status: TargetStatus; logEntries: LogEntry[] }>();\n private updateTimer: NodeJS.Timeout | undefined;\n private startTimer: () => void;\n\n constructor(params: { concurrency?: number; version?: string; frequency?: number } = {}) {\n const { concurrency = 0, version = \"0.0.0\", frequency = 500 } = params;\n print(`${fancy(\"lage\")} - Version ${version} - ${concurrency} Workers`);\n\n this.startTimer = () => {\n this.updateTimer = setInterval(() => this.renderStatus(), frequency);\n this.updateTimer.unref();\n this.startTimer = () => {};\n };\n\n process.stdout.write(terminal.hideCursor);\n process.on(\"exit\", () => process.stdout.write(terminal.showCursor));\n }\n\n log(entry: LogEntry): void {\n const data = entry.data;\n if (!data?.target || data.target.hidden) return;\n\n let taskData = this.taskData.get(data.target.id);\n if (!taskData) {\n taskData = { target: data.target, status: \"pending\", logEntries: [] };\n this.taskData.set(data.target.id, taskData);\n }\n\n this.startTimer();\n taskData.logEntries.push(entry);\n\n if (data.status) {\n taskData.status = data.status;\n if (isCompletionStatus(data.status)) {\n this.reportCompletion({ target: data.target, status: data.status, duration: data.duration });\n }\n }\n }\n\n summarize(schedulerRunSummary: SchedulerRunSummary): void {\n clearInterval(this.updateTimer);\n process.stdout.write(terminal.clearLine);\n\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n if (targetRuns.size > 0) {\n print(colors.summary(`\\nSummary`));\n print(hrLine);\n print(\n `success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}, failed: ${failed.length}`\n );\n print(\n `worker restarts: ${schedulerRunSummary.workerRestarts}, max worker memory usage: ${formatBytes(schedulerRunSummary.maxWorkerMemoryUsage)}`\n );\n } else {\n print(\"Nothing has been run.\");\n }\n\n print(hrLine);\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n if (target) {\n const failureLogs = this.taskData.get(targetId)?.logEntries;\n\n print(`[${colors.pkg(target.packageName ?? \"<root>\")} ${colors.task(target.task)}] ${colors.failed(\"ERROR DETECTED\")}`);\n\n if (failureLogs) {\n for (const entry of failureLogs) {\n print(entry.msg);\n }\n }\n print(hrLine);\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancy(`All targets skipped!`) : \"\";\n\n print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n\n private reportCompletion(completion: { target: Target; status: CompletionStatus; duration?: [number, number] }) {\n const icon = icons[completion.status];\n const statusColor = colors[completion.status];\n const durationText = completion.duration ? ` (${formatDuration(hrToSeconds(completion.duration))})` : \"\";\n\n const message = `${statusColor(`${icon} ${completion.status.padEnd(8)}`)} ${colors.label(completion.target.label)}${colors.duration(durationText)}`;\n this.renderStatus(message);\n }\n\n private renderStatus(completedTaskMessage?: string) {\n const counts: Record<CoarseStatus, number> = { completed: 0, running: 0, pending: 0 };\n for (const data of this.taskData.values()) {\n counts[coarseStatus[data.status]]++;\n }\n const { completed, running, pending } = counts;\n const total = this.taskData.size;\n const timestamp = colors.timestamp(`[${new Date().toLocaleTimeString(\"en-US\", { hour12: false })}]`);\n\n let output = terminal.clearLine;\n if (completedTaskMessage) {\n output += `${timestamp} ${completedTaskMessage}\\n`;\n }\n const percentage = Math.round((completed / total) * 100);\n output += `${timestamp} Completed: ${completed}/${total} (${percentage}%) [${running} running, ${pending} pending]`;\n process.stdout.write(output);\n }\n}\n"],"names":["BasicReporter","coarseStatus","success","failed","skipped","aborted","running","pending","queued","isCompletionStatus","status","colors","label","chalk","white","timestamp","gray","duration","green","red","yellow","summary","cyanBright","task","hex","pkg","hrLine","repeat","icons","terminal","hideCursor","showCursor","clearLine","fancy","str","gradient","r","g","b","print","message","process","stdout","write","log","entry","data","target","hidden","taskData","get","id","logEntries","set","startTimer","push","reportCompletion","summarize","schedulerRunSummary","clearInterval","updateTimer","targetRuns","targetRunByStatus","size","length","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","packageName","msg","allCacheHits","values","filter","run","allCacheHitText","formatDuration","hrToSeconds","completion","icon","statusColor","durationText","padEnd","renderStatus","completedTaskMessage","counts","completed","total","Date","toLocaleTimeString","hour12","output","percentage","Math","round","params","Map","concurrency","version","frequency","setInterval","unref","on"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/BasicReporter.ts"],"sourcesContent":["import { type LogEntry, type Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetStatus } from \"@lage-run/scheduler-types\";\nimport type { Target } from \"@lage-run/target-graph\";\nimport chalk from \"chalk\";\nimport { gradient } from \"./gradient.js\";\nimport { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport { formatBytes } from \"./formatBytes.js\";\n\ntype CoarseStatus = \"completed\" | \"running\" | \"pending\";\n\nconst coarseStatus: Record<TargetStatus, CoarseStatus> = {\n success: \"completed\",\n failed: \"completed\",\n skipped: \"completed\",\n aborted: \"completed\",\n running: \"running\",\n pending: \"pending\",\n queued: \"pending\",\n};\n\ntype CompletionStatus = \"success\" | \"failed\" | \"skipped\" | \"aborted\";\nconst isCompletionStatus = (status: TargetStatus): status is CompletionStatus => coarseStatus[status] === \"completed\";\n\nconst colors = {\n label: chalk.white,\n timestamp: chalk.gray,\n duration: chalk.gray,\n success: chalk.green,\n failed: chalk.red,\n skipped: chalk.gray,\n aborted: chalk.yellow,\n summary: chalk.cyanBright,\n task: chalk.hex(\"#00DDDD\"),\n pkg: chalk.hex(\"#FFD66B\"),\n};\n\nconst hrLine = \"┈\".repeat(80);\n\nconst icons: Record<CompletionStatus, string> = {\n success: \"✓\",\n failed: \"✗\",\n skipped: \"-\",\n aborted: \"-\",\n};\n\nconst terminal = {\n hideCursor: \"\\x1b[?25l\",\n showCursor: \"\\x1b[?25h\",\n clearLine: \"\\x1b[2K\\r\",\n};\n\nconst fancy = (str: string) => gradient({ r: 237, g: 178, b: 77 }, \"cyan\")(str);\nconst print = (message: string) => process.stdout.write(message + \"\\n\");\n\nexport class BasicReporter implements Reporter {\n private taskData = new Map<string, { target: Target; status: TargetStatus; logEntries: LogEntry[] }>();\n private updateTimer: NodeJS.Timeout | undefined;\n private startTimer: () => void;\n\n constructor(params: { concurrency?: number; version?: string; frequency?: number } = {}) {\n const { concurrency = 0, version = \"0.0.0\", frequency = 500 } = params;\n print(`${fancy(\"lage\")} - Version ${version} - ${concurrency} Workers`);\n\n this.startTimer = () => {\n this.updateTimer = setInterval(() => this.renderStatus(), frequency);\n this.updateTimer.unref();\n this.startTimer = () => {};\n };\n\n process.stdout.write(terminal.hideCursor);\n process.on(\"exit\", () => process.stdout.write(terminal.showCursor));\n }\n\n public log(entry: LogEntry): void {\n const data = entry.data;\n if (!data?.target || data.target.hidden) return;\n\n let taskData = this.taskData.get(data.target.id);\n if (!taskData) {\n taskData = { target: data.target, status: \"pending\", logEntries: [] };\n this.taskData.set(data.target.id, taskData);\n }\n\n this.startTimer();\n taskData.logEntries.push(entry);\n\n if (data.status) {\n taskData.status = data.status;\n if (isCompletionStatus(data.status)) {\n this.reportCompletion({ target: data.target, status: data.status, duration: data.duration });\n }\n }\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n clearInterval(this.updateTimer);\n process.stdout.write(terminal.clearLine);\n\n const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;\n const { failed, aborted, skipped, success, pending } = targetRunByStatus;\n\n if (targetRuns.size > 0) {\n print(colors.summary(`\\nSummary`));\n print(hrLine);\n print(\n `success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}, failed: ${failed.length}`\n );\n print(\n `worker restarts: ${schedulerRunSummary.workerRestarts}, max worker memory usage: ${formatBytes(schedulerRunSummary.maxWorkerMemoryUsage)}`\n );\n } else {\n print(\"Nothing has been run.\");\n }\n\n print(hrLine);\n\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n if (target) {\n const failureLogs = this.taskData.get(targetId)?.logEntries;\n\n print(`[${colors.pkg(target.packageName ?? \"<root>\")} ${colors.task(target.task)}] ${colors.failed(\"ERROR DETECTED\")}`);\n\n if (failureLogs) {\n for (const entry of failureLogs) {\n print(entry.msg);\n }\n }\n print(hrLine);\n }\n }\n\n const allCacheHits = [...targetRuns.values()].filter((run) => !run.target.hidden).length === skipped.length;\n const allCacheHitText = allCacheHits ? fancy(`All targets skipped!`) : \"\";\n\n print(`Took a total of ${formatDuration(hrToSeconds(duration))} to complete. ${allCacheHitText}`);\n }\n\n private reportCompletion(completion: { target: Target; status: CompletionStatus; duration?: [number, number] }) {\n const icon = icons[completion.status];\n const statusColor = colors[completion.status];\n const durationText = completion.duration ? ` (${formatDuration(hrToSeconds(completion.duration))})` : \"\";\n\n const message = `${statusColor(`${icon} ${completion.status.padEnd(8)}`)} ${colors.label(completion.target.label)}${colors.duration(durationText)}`;\n this.renderStatus(message);\n }\n\n private renderStatus(completedTaskMessage?: string) {\n const counts: Record<CoarseStatus, number> = { completed: 0, running: 0, pending: 0 };\n for (const data of this.taskData.values()) {\n counts[coarseStatus[data.status]]++;\n }\n const { completed, running, pending } = counts;\n const total = this.taskData.size;\n const timestamp = colors.timestamp(`[${new Date().toLocaleTimeString(\"en-US\", { hour12: false })}]`);\n\n let output = terminal.clearLine;\n if (completedTaskMessage) {\n output += `${timestamp} ${completedTaskMessage}\\n`;\n }\n const percentage = Math.round((completed / total) * 100);\n output += `${timestamp} Completed: ${completed}/${total} (${percentage}%) [${running} running, ${pending} pending]`;\n process.stdout.write(output);\n }\n}\n"],"names":["BasicReporter","coarseStatus","success","failed","skipped","aborted","running","pending","queued","isCompletionStatus","status","colors","label","chalk","white","timestamp","gray","duration","green","red","yellow","summary","cyanBright","task","hex","pkg","hrLine","repeat","icons","terminal","hideCursor","showCursor","clearLine","fancy","str","gradient","r","g","b","print","message","process","stdout","write","log","entry","data","target","hidden","taskData","get","id","logEntries","set","startTimer","push","reportCompletion","summarize","schedulerRunSummary","clearInterval","updateTimer","targetRuns","targetRunByStatus","size","length","workerRestarts","formatBytes","maxWorkerMemoryUsage","targetId","failureLogs","packageName","msg","allCacheHits","values","filter","run","allCacheHitText","formatDuration","hrToSeconds","completion","icon","statusColor","durationText","padEnd","renderStatus","completedTaskMessage","counts","completed","total","Date","toLocaleTimeString","hour12","output","percentage","Math","round","params","Map","concurrency","version","frequency","setInterval","unref","on"],"mappings":"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"}
|
|
@@ -8,10 +8,13 @@ export interface ChromeTraceEventsReporterOptions {
|
|
|
8
8
|
}
|
|
9
9
|
export declare class ChromeTraceEventsReporter implements Reporter {
|
|
10
10
|
private options;
|
|
11
|
-
consoleLogStream
|
|
11
|
+
private consoleLogStream;
|
|
12
12
|
private events;
|
|
13
13
|
private outputFile;
|
|
14
|
-
constructor(options: ChromeTraceEventsReporterOptions
|
|
14
|
+
constructor(options: ChromeTraceEventsReporterOptions & {
|
|
15
|
+
/** stream for testing */
|
|
16
|
+
consoleLogStream?: Writable;
|
|
17
|
+
});
|
|
15
18
|
log(): void;
|
|
16
19
|
summarize(schedulerRunSummary: SchedulerRunSummary): void;
|
|
17
20
|
}
|
|
@@ -83,11 +83,11 @@ class ChromeTraceEventsReporter {
|
|
|
83
83
|
_define_property(this, "events", void 0);
|
|
84
84
|
_define_property(this, "outputFile", void 0);
|
|
85
85
|
this.options = options;
|
|
86
|
-
this.consoleLogStream = process.stdout;
|
|
87
86
|
this.events = {
|
|
88
87
|
traceEvents: [],
|
|
89
88
|
displayTimeUnit: "ms"
|
|
90
89
|
};
|
|
91
90
|
this.outputFile = options.outputFile ?? getTimeBasedFilename("profile");
|
|
91
|
+
this.consoleLogStream = options.consoleLogStream ?? process.stdout;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ChromeTraceEventsReporter.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { Writable } from \"stream\";\n\ninterface TraceEventsObject {\n traceEvents: CompleteEvent[];\n displayTimeUnit: \"ms\" | \"ns\";\n}\n\ninterface CompleteEvent {\n name: string;\n cat: string; // status#task\n ph: \"X\";\n ts: number; // in microseconds\n pid: number;\n tid: number;\n dur: number;\n args?: Record<string, any>;\n}\n\nexport interface ChromeTraceEventsReporterOptions {\n outputFile?: string;\n concurrency: number;\n categorize?: (targetRun?: TargetRun) => string;\n}\n\nfunction hrTimeToMicroseconds(hr: [number, number]) {\n return hr[0] * 1e6 + hr[1] * 1e-3;\n}\n\nfunction getTimeBasedFilename(prefix: string) {\n const now = new Date(); // 2011-10-05T14:48:00.000Z\n const datetime = now.toISOString().split(\".\")[0]; // 2011-10-05T14:48:00\n const datetimeNormalized = datetime.replace(/-|:/g, \"\"); // 20111005T144800\n return `${prefix ? prefix + \"-\" : \"\"}${datetimeNormalized}.json`;\n}\n\nexport class ChromeTraceEventsReporter implements Reporter {\n consoleLogStream: Writable
|
|
1
|
+
{"version":3,"sources":["../src/ChromeTraceEventsReporter.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Reporter } from \"@lage-run/logger\";\nimport type { SchedulerRunSummary, TargetRun } from \"@lage-run/scheduler-types\";\nimport type { Writable } from \"stream\";\n\ninterface TraceEventsObject {\n traceEvents: CompleteEvent[];\n displayTimeUnit: \"ms\" | \"ns\";\n}\n\ninterface CompleteEvent {\n name: string;\n cat: string; // status#task\n ph: \"X\";\n ts: number; // in microseconds\n pid: number;\n tid: number;\n dur: number;\n args?: Record<string, any>;\n}\n\nexport interface ChromeTraceEventsReporterOptions {\n outputFile?: string;\n concurrency: number;\n categorize?: (targetRun?: TargetRun) => string;\n}\n\nfunction hrTimeToMicroseconds(hr: [number, number]) {\n return hr[0] * 1e6 + hr[1] * 1e-3;\n}\n\nfunction getTimeBasedFilename(prefix: string) {\n const now = new Date(); // 2011-10-05T14:48:00.000Z\n const datetime = now.toISOString().split(\".\")[0]; // 2011-10-05T14:48:00\n const datetimeNormalized = datetime.replace(/-|:/g, \"\"); // 20111005T144800\n return `${prefix ? prefix + \"-\" : \"\"}${datetimeNormalized}.json`;\n}\n\nexport class ChromeTraceEventsReporter implements Reporter {\n private consoleLogStream: Writable;\n\n private events: TraceEventsObject = {\n traceEvents: [],\n displayTimeUnit: \"ms\",\n };\n private outputFile: string;\n\n constructor(\n private options: ChromeTraceEventsReporterOptions & {\n /** stream for testing */\n consoleLogStream?: Writable;\n }\n ) {\n this.outputFile = options.outputFile ?? getTimeBasedFilename(\"profile\");\n this.consoleLogStream = options.consoleLogStream ?? process.stdout;\n }\n\n public log(): void {\n // pass\n }\n\n public summarize(schedulerRunSummary: SchedulerRunSummary): void {\n const { targetRuns, startTime } = schedulerRunSummary;\n\n // categorize events\n const { categorize } = this.options;\n\n for (const targetRun of targetRuns.values()) {\n // Skip hidden targets because those should be hidden by reporters.\n // Hiding as well skipped targets to avoid polluting the profile.\n if (targetRun.target.hidden || targetRun.status === \"skipped\") {\n continue;\n }\n\n const event = {\n name: targetRun.target.id,\n cat: `${targetRun.status}#${targetRun.target.task}`,\n ph: \"X\",\n ts: hrTimeToMicroseconds(targetRun.startTime) - hrTimeToMicroseconds(startTime), // in microseconds\n dur: hrTimeToMicroseconds(targetRun.duration ?? [0, 1000]), // in microseconds\n pid: 1,\n tid: targetRun.threadId,\n } as CompleteEvent;\n\n if (categorize) {\n event.cat += `,${categorize(targetRun)}`;\n }\n\n this.events.traceEvents.push(event);\n }\n\n if (!fs.existsSync(path.dirname(this.outputFile))) {\n fs.mkdirSync(path.dirname(this.outputFile), { recursive: true });\n }\n\n fs.writeFileSync(this.outputFile, JSON.stringify(this.events, null, 2));\n\n this.consoleLogStream.write(\n chalk.blueBright(\n `\\nProfiler output written to ${chalk.underline(this.outputFile)}, open it with chrome://tracing or edge://tracing\\n`\n )\n );\n }\n}\n"],"names":["ChromeTraceEventsReporter","hrTimeToMicroseconds","hr","getTimeBasedFilename","prefix","now","Date","datetime","toISOString","split","datetimeNormalized","replace","log","summarize","schedulerRunSummary","targetRuns","startTime","categorize","options","targetRun","values","target","hidden","status","event","name","id","cat","task","ph","ts","dur","duration","pid","tid","threadId","events","traceEvents","push","fs","existsSync","path","dirname","outputFile","mkdirSync","recursive","writeFileSync","JSON","stringify","consoleLogStream","write","chalk","blueBright","underline","displayTimeUnit","process","stdout"],"mappings":";;;;+BAwCaA;;;eAAAA;;;8DAxCK;2DACH;6DACE;;;;;;;;;;;;;;;;;;;AA2BjB,SAASC,qBAAqBC,EAAoB;IAChD,OAAOA,EAAE,CAAC,EAAE,GAAG,MAAMA,EAAE,CAAC,EAAE,GAAG;AAC/B;AAEA,SAASC,qBAAqBC,MAAc;IAC1C,MAAMC,MAAM,IAAIC,QAAQ,2BAA2B;IACnD,MAAMC,WAAWF,IAAIG,WAAW,GAAGC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,sBAAsB;IACxE,MAAMC,qBAAqBH,SAASI,OAAO,CAAC,QAAQ,KAAK,kBAAkB;IAC3E,OAAO,GAAGP,SAASA,SAAS,MAAM,KAAKM,mBAAmB,KAAK,CAAC;AAClE;AAEO,MAAMV;IAmBJY,MAAY;IACjB,OAAO;IACT;IAEOC,UAAUC,mBAAwC,EAAQ;QAC/D,MAAM,EAAEC,UAAU,EAAEC,SAAS,EAAE,GAAGF;QAElC,oBAAoB;QACpB,MAAM,EAAEG,UAAU,EAAE,GAAG,IAAI,CAACC,OAAO;QAEnC,KAAK,MAAMC,aAAaJ,WAAWK,MAAM,GAAI;YAC3C,mEAAmE;YACnE,iEAAiE;YACjE,IAAID,UAAUE,MAAM,CAACC,MAAM,IAAIH,UAAUI,MAAM,KAAK,WAAW;gBAC7D;YACF;YAEA,MAAMC,QAAQ;gBACZC,MAAMN,UAAUE,MAAM,CAACK,EAAE;gBACzBC,KAAK,GAAGR,UAAUI,MAAM,CAAC,CAAC,EAAEJ,UAAUE,MAAM,CAACO,IAAI,EAAE;gBACnDC,IAAI;gBACJC,IAAI7B,qBAAqBkB,UAAUH,SAAS,IAAIf,qBAAqBe;gBACrEe,KAAK9B,qBAAqBkB,UAAUa,QAAQ,IAAI;oBAAC;oBAAG;iBAAK;gBACzDC,KAAK;gBACLC,KAAKf,UAAUgB,QAAQ;YACzB;YAEA,IAAIlB,YAAY;gBACdO,MAAMG,GAAG,IAAI,CAAC,CAAC,EAAEV,WAAWE,YAAY;YAC1C;YAEA,IAAI,CAACiB,MAAM,CAACC,WAAW,CAACC,IAAI,CAACd;QAC/B;QAEA,IAAI,CAACe,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,OAAO,CAAC,IAAI,CAACC,UAAU,IAAI;YACjDJ,WAAE,CAACK,SAAS,CAACH,aAAI,CAACC,OAAO,CAAC,IAAI,CAACC,UAAU,GAAG;gBAAEE,WAAW;YAAK;QAChE;QAEAN,WAAE,CAACO,aAAa,CAAC,IAAI,CAACH,UAAU,EAAEI,KAAKC,SAAS,CAAC,IAAI,CAACZ,MAAM,EAAE,MAAM;QAEpE,IAAI,CAACa,gBAAgB,CAACC,KAAK,CACzBC,cAAK,CAACC,UAAU,CACd,CAAC,6BAA6B,EAAED,cAAK,CAACE,SAAS,CAAC,IAAI,CAACV,UAAU,EAAE,mDAAmD,CAAC;IAG3H;IAvDA,YACE,AAAQzB,OAGP,CACD;;QAbF,uBAAQ+B,oBAAR,KAAA;QAEA,uBAAQb,UAAR,KAAA;QAIA,uBAAQO,cAAR,KAAA;aAGUzB,UAAAA;aAPFkB,SAA4B;YAClCC,aAAa,EAAE;YACfiB,iBAAiB;QACnB;QASE,IAAI,CAACX,UAAU,GAAGzB,QAAQyB,UAAU,IAAIxC,qBAAqB;QAC7D,IAAI,CAAC8C,gBAAgB,GAAG/B,QAAQ+B,gBAAgB,IAAIM,QAAQC,MAAM;IACpE;AAgDF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TargetRun } from "@lage-run/scheduler-types";
|
|
2
|
+
import { GroupedReporter } from "./GroupedReporter.js";
|
|
3
|
+
export declare class GithubActionsReporter extends GroupedReporter {
|
|
4
|
+
protected formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string;
|
|
5
|
+
protected formatGroupEnd(): string;
|
|
6
|
+
protected writeSummaryHeader(): void;
|
|
7
|
+
protected writeSummaryFooter(): void;
|
|
8
|
+
protected writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GithubActionsReporter", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return GithubActionsReporter;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _formathrtime = require("@lage-run/format-hrtime");
|
|
12
|
+
const _GroupedReporter = require("./GroupedReporter.js");
|
|
13
|
+
class GithubActionsReporter extends _GroupedReporter.GroupedReporter {
|
|
14
|
+
formatGroupStart(packageName, task, status, duration) {
|
|
15
|
+
return `::group::${packageName} ${task} ${status}${duration ? `, took ${(0, _formathrtime.formatDuration)((0, _formathrtime.hrToSeconds)(duration))}` : ""}\n`;
|
|
16
|
+
}
|
|
17
|
+
formatGroupEnd() {
|
|
18
|
+
return `::endgroup::\n`;
|
|
19
|
+
}
|
|
20
|
+
writeSummaryHeader() {
|
|
21
|
+
this.logStream.write(`::group::Summary\n`);
|
|
22
|
+
}
|
|
23
|
+
writeSummaryFooter() {
|
|
24
|
+
this.logStream.write(`::endgroup::\n`);
|
|
25
|
+
}
|
|
26
|
+
writeFailures(failed, targetRuns) {
|
|
27
|
+
for (const targetId of failed){
|
|
28
|
+
const target = targetRuns.get(targetId)?.target;
|
|
29
|
+
if (target) {
|
|
30
|
+
const { packageName, task } = target;
|
|
31
|
+
const taskLogs = this.logEntries.get(targetId);
|
|
32
|
+
this.logStream.write(`::error title=${packageName} ${task}::Build failed\n`);
|
|
33
|
+
if (taskLogs) {
|
|
34
|
+
for (const entry of taskLogs){
|
|
35
|
+
if (entry.msg.trim() !== "") {
|
|
36
|
+
this.logStream.write(`::error::${entry.msg}\n`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/GithubActionsReporter.ts"],"sourcesContent":["import { formatDuration, hrToSeconds } from \"@lage-run/format-hrtime\";\nimport type { TargetRun } from \"@lage-run/scheduler-types\";\nimport { GroupedReporter } from \"./GroupedReporter.js\";\n\nexport class GithubActionsReporter extends GroupedReporter {\n protected formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string {\n return `::group::${packageName} ${task} ${status}${duration ? `, took ${formatDuration(hrToSeconds(duration))}` : \"\"}\\n`;\n }\n\n protected formatGroupEnd(): string {\n return `::endgroup::\\n`;\n }\n\n protected writeSummaryHeader(): void {\n this.logStream.write(`::group::Summary\\n`);\n }\n\n protected writeSummaryFooter(): void {\n this.logStream.write(`::endgroup::\\n`);\n }\n\n protected writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void {\n for (const targetId of failed) {\n const target = targetRuns.get(targetId)?.target;\n\n if (target) {\n const { packageName, task } = target;\n const taskLogs = this.logEntries.get(targetId);\n\n this.logStream.write(`::error title=${packageName} ${task}::Build failed\\n`);\n\n if (taskLogs) {\n for (const entry of taskLogs) {\n if (entry.msg.trim() !== \"\") {\n this.logStream.write(`::error::${entry.msg}\\n`);\n }\n }\n }\n }\n }\n }\n}\n"],"names":["GithubActionsReporter","GroupedReporter","formatGroupStart","packageName","task","status","duration","formatDuration","hrToSeconds","formatGroupEnd","writeSummaryHeader","logStream","write","writeSummaryFooter","writeFailures","failed","targetRuns","targetId","target","get","taskLogs","logEntries","entry","msg","trim"],"mappings":";;;;+BAIaA;;;eAAAA;;;8BAJ+B;iCAEZ;AAEzB,MAAMA,8BAA8BC,gCAAe;IAC9CC,iBAAiBC,WAAmB,EAAEC,IAAY,EAAEC,MAAc,EAAEC,QAA2B,EAAU;QACjH,OAAO,CAAC,SAAS,EAAEH,YAAY,CAAC,EAAEC,KAAK,CAAC,EAAEC,SAASC,WAAW,CAAC,OAAO,EAAEC,IAAAA,4BAAc,EAACC,IAAAA,yBAAW,EAACF,YAAY,GAAG,GAAG,EAAE,CAAC;IAC1H;IAEUG,iBAAyB;QACjC,OAAO,CAAC,cAAc,CAAC;IACzB;IAEUC,qBAA2B;QACnC,IAAI,CAACC,SAAS,CAACC,KAAK,CAAC,CAAC,kBAAkB,CAAC;IAC3C;IAEUC,qBAA2B;QACnC,IAAI,CAACF,SAAS,CAACC,KAAK,CAAC,CAAC,cAAc,CAAC;IACvC;IAEUE,cAAcC,MAAgB,EAAEC,UAA2C,EAAQ;QAC3F,KAAK,MAAMC,YAAYF,OAAQ;YAC7B,MAAMG,SAASF,WAAWG,GAAG,CAACF,WAAWC;YAEzC,IAAIA,QAAQ;gBACV,MAAM,EAAEf,WAAW,EAAEC,IAAI,EAAE,GAAGc;gBAC9B,MAAME,WAAW,IAAI,CAACC,UAAU,CAACF,GAAG,CAACF;gBAErC,IAAI,CAACN,SAAS,CAACC,KAAK,CAAC,CAAC,cAAc,EAAET,YAAY,CAAC,EAAEC,KAAK,gBAAgB,CAAC;gBAE3E,IAAIgB,UAAU;oBACZ,KAAK,MAAME,SAASF,SAAU;wBAC5B,IAAIE,MAAMC,GAAG,CAACC,IAAI,OAAO,IAAI;4BAC3B,IAAI,CAACb,SAAS,CAACC,KAAK,CAAC,CAAC,SAAS,EAAEU,MAAMC,GAAG,CAAC,EAAE,CAAC;wBAChD;oBACF;gBACF;YACF;QACF;IACF;AACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { LogLevel, type LogStructuredData } from "@lage-run/logger";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import type { Reporter, LogEntry } from "@lage-run/logger";
|
|
4
|
+
import type { SchedulerRunSummary, TargetRun } from "@lage-run/scheduler-types";
|
|
5
|
+
import type { TargetMessageEntry, TargetStatusEntry } from "./types/TargetLogEntry.js";
|
|
6
|
+
import type { Writable } from "stream";
|
|
7
|
+
export declare const colors: {
|
|
8
|
+
30: chalk.Chalk;
|
|
9
|
+
40: chalk.Chalk;
|
|
10
|
+
20: chalk.Chalk;
|
|
11
|
+
10: chalk.Chalk;
|
|
12
|
+
50: chalk.Chalk;
|
|
13
|
+
task: chalk.Chalk;
|
|
14
|
+
pkg: chalk.Chalk;
|
|
15
|
+
ok: chalk.Chalk;
|
|
16
|
+
error: chalk.Chalk;
|
|
17
|
+
warn: chalk.Chalk;
|
|
18
|
+
};
|
|
19
|
+
export declare const logLevelLabel: {
|
|
20
|
+
30: string;
|
|
21
|
+
20: string;
|
|
22
|
+
10: string;
|
|
23
|
+
50: string;
|
|
24
|
+
40: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function getTaskLogPrefix(pkg: string, task: string): string;
|
|
27
|
+
export declare function format(level: LogLevel, prefix: string, message: string): string;
|
|
28
|
+
export declare abstract class GroupedReporter implements Reporter {
|
|
29
|
+
protected options: {
|
|
30
|
+
logLevel?: LogLevel;
|
|
31
|
+
grouped?: boolean;
|
|
32
|
+
/** stream for testing */
|
|
33
|
+
logStream?: Writable;
|
|
34
|
+
};
|
|
35
|
+
protected logStream: Writable;
|
|
36
|
+
protected logEntries: Map<string, LogEntry<LogStructuredData>[]>;
|
|
37
|
+
private readonly groupedEntries;
|
|
38
|
+
constructor(options: {
|
|
39
|
+
logLevel?: LogLevel;
|
|
40
|
+
grouped?: boolean;
|
|
41
|
+
/** stream for testing */
|
|
42
|
+
logStream?: Writable;
|
|
43
|
+
});
|
|
44
|
+
log(entry: LogEntry<any>): boolean | void;
|
|
45
|
+
protected logTargetEntry(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>): boolean | void;
|
|
46
|
+
private logTargetEntryByGroup;
|
|
47
|
+
summarize(schedulerRunSummary: SchedulerRunSummary): void;
|
|
48
|
+
/** Returns the opening line for a grouped target log block, including trailing newline. */
|
|
49
|
+
protected abstract formatGroupStart(packageName: string, task: string, status: string, duration?: [number, number]): string;
|
|
50
|
+
/** Returns the closing line for a grouped target log block, including trailing newline. */
|
|
51
|
+
protected abstract formatGroupEnd(): string;
|
|
52
|
+
/** Writes the summary section header. */
|
|
53
|
+
protected abstract writeSummaryHeader(): void;
|
|
54
|
+
/** Writes anything needed after the summary target list (e.g. closing a group). */
|
|
55
|
+
protected abstract writeSummaryFooter(): void;
|
|
56
|
+
/** Writes per-CI-system error annotations for all failed targets. */
|
|
57
|
+
protected abstract writeFailures(failed: string[], targetRuns: Map<string, TargetRun<unknown>>): void;
|
|
58
|
+
}
|