@lage-run/reporters 0.1.1

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.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@lage-run/reporters",
3
+ "entries": [
4
+ {
5
+ "date": "Thu, 11 Aug 2022 23:52:37 GMT",
6
+ "tag": "@lage-run/reporters_v0.1.1",
7
+ "version": "0.1.1",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "kchau@microsoft.com",
12
+ "package": "@lage-run/reporters",
13
+ "commit": "e7170c999eb659b1b167aa54380d3804ea366017",
14
+ "comment": "Brand new reporter package for lage v2"
15
+ },
16
+ {
17
+ "author": "beachball",
18
+ "package": "@lage-run/reporters",
19
+ "comment": "Bump @lage-run/logger to v1.1.1",
20
+ "commit": "e7170c999eb659b1b167aa54380d3804ea366017"
21
+ },
22
+ {
23
+ "author": "beachball",
24
+ "package": "@lage-run/reporters",
25
+ "comment": "Bump @lage-run/scheduler to v0.1.2",
26
+ "commit": "e7170c999eb659b1b167aa54380d3804ea366017"
27
+ }
28
+ ]
29
+ }
30
+ }
31
+ ]
32
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # Change Log - @lage-run/reporters
2
+
3
+ This log was last generated on Thu, 11 Aug 2022 23:52:37 GMT and should not be manually modified.
4
+
5
+ <!-- Start content -->
6
+
7
+ ## 0.1.1
8
+
9
+ Thu, 11 Aug 2022 23:52:37 GMT
10
+
11
+ ### Patches
12
+
13
+ - Brand new reporter package for lage v2 (kchau@microsoft.com)
14
+ - Bump @lage-run/logger to v1.1.1
15
+ - Bump @lage-run/scheduler to v0.1.2
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # @lage-run/reporters
2
+
3
+ This package provides some default built-in reporters to be used inside @lage-run/cli (and lage, the main entry point to the tool). The `Reporter` interface comes from `@lage-run/logger`.
4
+
5
+ ## NpmLogReporter
6
+
7
+ This reporter uses the `npmlog` package that is the same logger used by `npm`. It is considered stable, and is chosen because of its ability to log in a "standard" way with a clear distinction between "INFO", "WARN", "ERR!", "VERB", etc. `npmlog` by default writes to the `stderr` stream, so be aware that these logs are written to that.
8
+
9
+ To use it, look at how it is instantiated inside the unit tests. Here's an example of a basic usage:
10
+
11
+ ```typescript
12
+ const reporter = new NpmLogReporter({ grouped: false, logLevel: LogLevel.verbose });
13
+
14
+ reporter.log({
15
+ data: {
16
+ target: createTarget("a", "task"),
17
+ status: "running",
18
+ duration: [0, 0],
19
+ startTime: [0, 0],
20
+ } as TargetStatusEntry,
21
+ level: LogLevel.verbose,
22
+ msg: "test message",
23
+ timestamp: 0,
24
+ });
25
+ ```
26
+
27
+ It will produce a summary that looks something like this in case of errors, displaying any explicit errors in a summary section:
28
+
29
+ ```
30
+ info ➔ start a test
31
+ info ✓ done a test - 10.00s
32
+ info ➔ start b build
33
+ info ✓ done b build - 30.00s
34
+ info ➔ start a build
35
+ info ✖ fail a build
36
+ info 🏗 Summary
37
+ info
38
+ info Nothing has been run.
39
+ info ----------------------------------------------
40
+ ERR! [a build] ERROR DETECTED
41
+ ERR!
42
+ ERR! test message for a#build
43
+ ERR! test message for a#build again, but look there is an error!
44
+ ERR!
45
+ info ----------------------------------------------
46
+ info Took a total of 1m 40.00s to complete
47
+ ```
48
+
49
+ ## JsonReporter
50
+
51
+ Every log entry being sent to this reporter will write out in a raw JSON format. When piped to another processor, be sure to handle the newline-delimited JSON objects. This is useful for making a tool on top of lage to post process the run in an automation step or as part of a larger pipeline of work.
52
+
53
+ ## AdoReporter
54
+
55
+ Azure DevOps contains a set of [logging commands](https://docs.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash) that can make the logged messages more easily parsed by humans. These formatting commands include the ability to collapse logs in a group. To support this, `lage` also provides a built-in Azure DevOps reporter. It outputs roughly into something like this:
56
+
57
+ ```
58
+ ##[group] a test success, took 10.00s
59
+ INFO: ➔ start a test
60
+ VERB: | test message for a#test
61
+ VERB: | test message for a#test again
62
+ INFO: ✓ done a test - 10.00s
63
+ ##[endgroup]
64
+ ##[group] b build success, took 30.00s
65
+ INFO: ➔ start b build
66
+ VERB: | test message for b#build
67
+ VERB: | test message for b#build again
68
+ INFO: ✓ done b build - 30.00s
69
+ ##[endgroup]
70
+ ##[group] a build failed, took 60.00s
71
+ INFO: ➔ start a build
72
+ VERB: | test message for a#build
73
+ VERB: | test message for a#build again, but look there is an error!
74
+ INFO: ✖ fail a build
75
+ ##[endgroup]
76
+ ##[section]Summary
77
+ INFO: a build failed, took 60.00s
78
+ INFO: a test success, took 60.00s
79
+ INFO: b build success, took 60.00s
80
+ [Tasks Count] success: 2, skipped: 0, pending: 0, aborted: 0
81
+ ##[error] [a build] ERROR DETECTED
82
+ ##[error]
83
+ ##[error] test message for a#build
84
+ ##[error] test message for a#build again, but look there is an error!
85
+ ##[error]
86
+ INFO: Took a total of 1m 40.00s to complete
87
+ ```
package/jest.config.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require("monorepo-scripts/config/jest.config.js");
@@ -0,0 +1,19 @@
1
+ /// <reference types="node" />
2
+ import { LogLevel, LogStructuredData } from "@lage-run/logger";
3
+ import type { Reporter, LogEntry } from "@lage-run/logger";
4
+ import type { SchedulerRunSummary } from "@lage-run/scheduler";
5
+ import { Writable } from "stream";
6
+ export declare class AdoReporter implements Reporter {
7
+ private options;
8
+ logStream: Writable;
9
+ private logEntries;
10
+ readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]>;
11
+ constructor(options: {
12
+ logLevel?: LogLevel;
13
+ grouped?: boolean;
14
+ });
15
+ log(entry: LogEntry<any>): boolean | void;
16
+ private logTargetEntry;
17
+ private logTargetEntryByGroup;
18
+ summarize(schedulerRunSummary: SchedulerRunSummary): void;
19
+ }
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AdoReporter = void 0;
7
+ const formatDuration_1 = require("./formatDuration");
8
+ const target_graph_1 = require("@lage-run/target-graph");
9
+ const logger_1 = require("@lage-run/logger");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const isTargetStatusLogEntry_1 = require("./isTargetStatusLogEntry");
12
+ const colors = {
13
+ [logger_1.LogLevel.info]: chalk_1.default.white,
14
+ [logger_1.LogLevel.verbose]: chalk_1.default.gray,
15
+ [logger_1.LogLevel.warn]: chalk_1.default.white,
16
+ [logger_1.LogLevel.error]: chalk_1.default.white,
17
+ [logger_1.LogLevel.silly]: chalk_1.default.green,
18
+ task: chalk_1.default.cyan,
19
+ pkg: chalk_1.default.magenta,
20
+ ok: chalk_1.default.green,
21
+ error: chalk_1.default.red,
22
+ warn: chalk_1.default.yellow,
23
+ };
24
+ const logLevelLabel = {
25
+ [logger_1.LogLevel.info]: "INFO",
26
+ [logger_1.LogLevel.warn]: "WARN",
27
+ [logger_1.LogLevel.error]: "ERR!",
28
+ [logger_1.LogLevel.silly]: "SILLY",
29
+ [logger_1.LogLevel.verbose]: "VERB",
30
+ };
31
+ function getTaskLogPrefix(pkg, task) {
32
+ return `${colors.pkg(pkg)} ${colors.task(task)}`;
33
+ }
34
+ function normalize(prefixOrMessage, message) {
35
+ if (typeof message === "string") {
36
+ const prefix = prefixOrMessage;
37
+ return { prefix, message };
38
+ }
39
+ else {
40
+ const prefix = "";
41
+ const message = prefixOrMessage;
42
+ return { prefix, message };
43
+ }
44
+ }
45
+ function format(level, prefix, message) {
46
+ return `${logLevelLabel[level]}: ${prefix} ${message}\n`;
47
+ }
48
+ class AdoReporter {
49
+ constructor(options) {
50
+ this.options = options;
51
+ this.logStream = process.stdout;
52
+ this.logEntries = new Map();
53
+ this.groupedEntries = new Map();
54
+ options.logLevel = options.logLevel || logger_1.LogLevel.info;
55
+ }
56
+ log(entry) {
57
+ if (entry.data && entry.data.target) {
58
+ if (!this.logEntries.has(entry.data.target.id)) {
59
+ this.logEntries.set(entry.data.target.id, []);
60
+ }
61
+ this.logEntries.get(entry.data.target.id).push(entry);
62
+ }
63
+ if (this.options.logLevel >= entry.level) {
64
+ if (this.options.grouped) {
65
+ return this.logTargetEntryByGroup(entry);
66
+ }
67
+ return this.logTargetEntry(entry);
68
+ }
69
+ }
70
+ logTargetEntry(entry) {
71
+ const colorFn = colors[entry.level];
72
+ const data = entry.data;
73
+ if ((0, isTargetStatusLogEntry_1.isTargetStatusLogEntry)(data)) {
74
+ const { target, hash, duration } = data;
75
+ const { packageName, task } = target;
76
+ const normalizedArgs = this.options.grouped
77
+ ? normalize(entry.msg)
78
+ : normalize(getTaskLogPrefix(packageName !== null && packageName !== void 0 ? packageName : "<root>", task), entry.msg);
79
+ const pkgTask = this.options.grouped ? `${chalk_1.default.magenta(packageName)} ${chalk_1.default.cyan(task)}` : "";
80
+ switch (data.status) {
81
+ case "running":
82
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("➔")} start ${pkgTask}`)));
83
+ case "success":
84
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("✓")} done ${pkgTask} - ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(duration))}`)));
85
+ case "failed":
86
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.error("✖")} fail ${pkgTask}`)));
87
+ case "skipped":
88
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.ok("»")} skip ${pkgTask} - ${hash}`)));
89
+ case "aborted":
90
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn(`${colors.warn("»")} aborted ${pkgTask}`)));
91
+ }
92
+ }
93
+ else {
94
+ // this is a generic log
95
+ const { target } = data;
96
+ const { packageName, task } = target;
97
+ const normalizedArgs = this.options.grouped
98
+ ? normalize(entry.msg)
99
+ : normalize(getTaskLogPrefix(packageName !== null && packageName !== void 0 ? packageName : "<root>", task), entry.msg);
100
+ return this.logStream.write(format(entry.level, normalizedArgs.prefix, colorFn("| " + normalizedArgs.message)));
101
+ }
102
+ }
103
+ logTargetEntryByGroup(entry) {
104
+ var _a, _b;
105
+ const data = entry.data;
106
+ const target = data.target;
107
+ const { id } = target;
108
+ this.groupedEntries.set(id, this.groupedEntries.get(id) || []);
109
+ (_a = this.groupedEntries.get(id)) === null || _a === void 0 ? void 0 : _a.push(entry);
110
+ if ((0, isTargetStatusLogEntry_1.isTargetStatusLogEntry)(data)) {
111
+ if (data.status === "success" || data.status === "failed" || data.status === "skipped" || data.status === "aborted") {
112
+ const { status, duration } = data;
113
+ this.logStream.write(`##[group] ${colors.pkg((_b = data.target.packageName) !== null && _b !== void 0 ? _b : "<root>")} ${colors.task(data.target.task)} ${status}${duration ? `, took ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(duration))}` : ""}\n`);
114
+ const entries = this.groupedEntries.get(id);
115
+ for (const targetEntry of entries) {
116
+ this.logTargetEntry(targetEntry);
117
+ }
118
+ this.logStream.write(`##[endgroup]\n`);
119
+ }
120
+ }
121
+ }
122
+ summarize(schedulerRunSummary) {
123
+ const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;
124
+ const { failed, aborted, skipped, success, pending } = targetRunByStatus;
125
+ const statusColorFn = {
126
+ success: chalk_1.default.greenBright,
127
+ failed: chalk_1.default.redBright,
128
+ skipped: chalk_1.default.gray,
129
+ running: chalk_1.default.yellow,
130
+ pending: chalk_1.default.gray,
131
+ aborted: chalk_1.default.red,
132
+ };
133
+ this.logStream.write(chalk_1.default.cyanBright(`##[section]Summary\n`));
134
+ if (targetRuns.size > 0) {
135
+ for (const wrappedTarget of targetRuns.values()) {
136
+ const colorFn = statusColorFn[wrappedTarget.status];
137
+ const target = wrappedTarget.target;
138
+ this.logStream.write(format(logger_1.LogLevel.info, getTaskLogPrefix(target.packageName || "[GLOBAL]", target.task), colorFn(`${wrappedTarget.status}${wrappedTarget.duration ? `, took ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(wrappedTarget.duration))}` : ""}`)));
139
+ }
140
+ this.logStream.write(`[Tasks Count] success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}\n`);
141
+ }
142
+ else {
143
+ this.logStream.write("Nothing has been run.\n");
144
+ }
145
+ if (failed && failed.length > 0) {
146
+ for (const targetId of failed) {
147
+ const { packageName, task } = (0, target_graph_1.getPackageAndTask)(targetId);
148
+ const taskLogs = this.logEntries.get(targetId);
149
+ this.logStream.write(`##[error] [${chalk_1.default.magenta(packageName)} ${chalk_1.default.cyan(task)}] ${chalk_1.default.redBright("ERROR DETECTED")}\n`);
150
+ if (taskLogs) {
151
+ for (const entry of taskLogs) {
152
+ // Log each entry separately to prevent truncation
153
+ this.logStream.write(`##[error] ${entry.msg}\n`);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ this.logStream.write(format(logger_1.LogLevel.info, "", `Took a total of ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(duration))} to complete`));
159
+ }
160
+ }
161
+ exports.AdoReporter = AdoReporter;
162
+ //# sourceMappingURL=AdoReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdoReporter.js","sourceRoot":"","sources":["../src/AdoReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { SchedulerRunSummary } from "@lage-run/scheduler";
2
+ import { LogEntry, LogLevel, Reporter } from "@lage-run/logger";
3
+ import { TargetMessageEntry, TargetStatusEntry } from "./types/TargetLogEntry";
4
+ export declare class JsonReporter implements Reporter {
5
+ private options;
6
+ constructor(options: {
7
+ logLevel: LogLevel;
8
+ });
9
+ log(entry: LogEntry<TargetStatusEntry | TargetMessageEntry>): void;
10
+ summarize(schedulerRunSummary: SchedulerRunSummary): void;
11
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JsonReporter = void 0;
4
+ const formatDuration_1 = require("./formatDuration");
5
+ class JsonReporter {
6
+ constructor(options) {
7
+ this.options = options;
8
+ }
9
+ log(entry) {
10
+ if (this.options.logLevel >= entry.level) {
11
+ console.log(JSON.stringify(entry));
12
+ }
13
+ }
14
+ summarize(schedulerRunSummary) {
15
+ const { duration, targetRuns, targetRunByStatus } = schedulerRunSummary;
16
+ const summary = {};
17
+ const taskStats = [];
18
+ for (const targetRun of targetRuns.values()) {
19
+ taskStats.push({
20
+ package: targetRun.target.packageName,
21
+ task: targetRun.target.task,
22
+ duration: (0, formatDuration_1.hrToSeconds)(targetRun.duration),
23
+ status: targetRun.status,
24
+ });
25
+ }
26
+ for (const status of Object.keys(targetRunByStatus)) {
27
+ if (targetRunByStatus[status] && targetRunByStatus[status].length.length > 0) {
28
+ summary[`${status}Targets`] = targetRunByStatus[status].length;
29
+ }
30
+ }
31
+ summary.duration = (0, formatDuration_1.hrToSeconds)(duration);
32
+ summary.taskStats = taskStats;
33
+ console.log(JSON.stringify({ summary }));
34
+ }
35
+ }
36
+ exports.JsonReporter = JsonReporter;
37
+ //# sourceMappingURL=JsonReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonReporter.js","sourceRoot":"","sources":["../src/JsonReporter.ts"],"names":[],"mappings":";;;AAAA,qDAA+C;AAK/C,MAAa,YAAY;IACvB,YAAoB,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;IAAG,CAAC;IAEvD,GAAG,CAAC,KAAuD;QACzD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACpC;IACH,CAAC;IAED,SAAS,CAAC,mBAAwC;QAChD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,mBAAmB,CAAC;QACxE,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,MAAM,SAAS,GAAU,EAAE,CAAC;QAE5B,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE;YAC3C,SAAS,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,WAAW;gBACrC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI;gBAC3B,QAAQ,EAAE,IAAA,4BAAW,EAAC,SAAS,CAAC,QAAQ,CAAC;gBACzC,MAAM,EAAE,SAAS,CAAC,MAAM;aACzB,CAAC,CAAC;SACJ;QAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;YACnD,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC5E,OAAO,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;aAChE;SACF;QAED,OAAO,CAAC,QAAQ,GAAG,IAAA,4BAAW,EAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;CACF;AAlCD,oCAkCC"}
@@ -0,0 +1,19 @@
1
+ import { LogLevel, LogStructuredData } from "@lage-run/logger";
2
+ import log from "npmlog";
3
+ import type { Reporter, LogEntry } from "@lage-run/logger";
4
+ import type { SchedulerRunSummary } from "@lage-run/scheduler";
5
+ export declare class NpmLogReporter implements Reporter {
6
+ private options;
7
+ npmLog: log.Logger;
8
+ private logEntries;
9
+ readonly groupedEntries: Map<string, LogEntry<LogStructuredData>[]>;
10
+ constructor(options: {
11
+ logLevel?: LogLevel;
12
+ grouped?: boolean;
13
+ });
14
+ log(entry: LogEntry<any>): any;
15
+ private logTargetEntry;
16
+ private logTargetEntryByGroup;
17
+ hr(): void;
18
+ summarize(schedulerRunSummary: SchedulerRunSummary): void;
19
+ }
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.NpmLogReporter = void 0;
7
+ const formatDuration_1 = require("./formatDuration");
8
+ const target_graph_1 = require("@lage-run/target-graph");
9
+ const logger_1 = require("@lage-run/logger");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const npmlog_1 = __importDefault(require("npmlog"));
12
+ const isTargetStatusLogEntry_1 = require("./isTargetStatusLogEntry");
13
+ const colors = {
14
+ [logger_1.LogLevel.info]: chalk_1.default.white,
15
+ [logger_1.LogLevel.verbose]: chalk_1.default.gray,
16
+ [logger_1.LogLevel.warn]: chalk_1.default.white,
17
+ [logger_1.LogLevel.error]: chalk_1.default.white,
18
+ [logger_1.LogLevel.silly]: chalk_1.default.green,
19
+ task: chalk_1.default.cyan,
20
+ pkg: chalk_1.default.magenta,
21
+ ok: chalk_1.default.green,
22
+ error: chalk_1.default.red,
23
+ warn: chalk_1.default.yellow,
24
+ };
25
+ const logLevelEnum = {
26
+ [logger_1.LogLevel.info]: "info",
27
+ [logger_1.LogLevel.warn]: "warn",
28
+ [logger_1.LogLevel.error]: "error",
29
+ [logger_1.LogLevel.silly]: "silly",
30
+ [logger_1.LogLevel.verbose]: "verbose",
31
+ };
32
+ const logFns = Object.values(logLevelEnum).reduce((acc, level) => {
33
+ acc[logger_1.LogLevel[level]] = npmlog_1.default[level];
34
+ return acc;
35
+ }, {});
36
+ function getTaskLogPrefix(pkg, task) {
37
+ return `${colors.pkg(pkg)} ${colors.task(task)}`;
38
+ }
39
+ function normalize(prefixOrMessage, message) {
40
+ if (typeof message === "string") {
41
+ const prefix = prefixOrMessage;
42
+ return { prefix, message };
43
+ }
44
+ else {
45
+ const prefix = "";
46
+ const message = prefixOrMessage;
47
+ return { prefix, message };
48
+ }
49
+ }
50
+ class NpmLogReporter {
51
+ constructor(options) {
52
+ this.options = options;
53
+ this.npmLog = npmlog_1.default;
54
+ this.logEntries = new Map();
55
+ this.groupedEntries = new Map();
56
+ options.logLevel = options.logLevel || logger_1.LogLevel.info;
57
+ npmlog_1.default.level = logLevelEnum[options.logLevel];
58
+ }
59
+ log(entry) {
60
+ if (entry.data && entry.data.target) {
61
+ if (!this.logEntries.has(entry.data.target.id)) {
62
+ this.logEntries.set(entry.data.target.id, []);
63
+ }
64
+ this.logEntries.get(entry.data.target.id).push(entry);
65
+ }
66
+ if (this.options.logLevel >= entry.level) {
67
+ if (this.options.grouped) {
68
+ return this.logTargetEntryByGroup(entry);
69
+ }
70
+ return this.logTargetEntry(entry);
71
+ }
72
+ }
73
+ logTargetEntry(entry) {
74
+ const logFn = logFns[entry.level];
75
+ const colorFn = colors[entry.level];
76
+ const data = entry.data;
77
+ if ((0, isTargetStatusLogEntry_1.isTargetStatusLogEntry)(data)) {
78
+ const { target, hash, duration } = data;
79
+ const { packageName, task } = target;
80
+ const normalizedArgs = this.options.grouped
81
+ ? normalize(entry.msg)
82
+ : normalize(getTaskLogPrefix(packageName !== null && packageName !== void 0 ? packageName : "<root>", task), entry.msg);
83
+ const pkgTask = this.options.grouped ? `${chalk_1.default.magenta(packageName)} ${chalk_1.default.cyan(task)}` : "";
84
+ switch (data.status) {
85
+ case "running":
86
+ return logFn(normalizedArgs.prefix, colorFn(`${colors.ok("➔")} start ${pkgTask}`));
87
+ case "success":
88
+ return logFn(normalizedArgs.prefix, colorFn(`${colors.ok("✓")} done ${pkgTask} - ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(duration))}`));
89
+ case "failed":
90
+ return logFn(normalizedArgs.prefix, colorFn(`${colors.error("✖")} fail ${pkgTask}`));
91
+ case "skipped":
92
+ return logFn(normalizedArgs.prefix, colorFn(`${colors.ok("»")} skip ${pkgTask} - ${hash}`));
93
+ case "aborted":
94
+ return logFn(normalizedArgs.prefix, colorFn(`${colors.warn("»")} aborted ${pkgTask}`));
95
+ }
96
+ }
97
+ else {
98
+ // this is a generic log
99
+ const { target } = data;
100
+ const { packageName, task } = target;
101
+ const normalizedArgs = this.options.grouped
102
+ ? normalize(entry.msg)
103
+ : normalize(getTaskLogPrefix(packageName !== null && packageName !== void 0 ? packageName : "<root>", task), entry.msg);
104
+ return logFn(normalizedArgs.prefix, colorFn("| " + normalizedArgs.message));
105
+ }
106
+ }
107
+ logTargetEntryByGroup(entry) {
108
+ var _a;
109
+ const data = entry.data;
110
+ const target = data.target;
111
+ const { id } = target;
112
+ this.groupedEntries.set(id, this.groupedEntries.get(id) || []);
113
+ (_a = this.groupedEntries.get(id)) === null || _a === void 0 ? void 0 : _a.push(entry);
114
+ if ((0, isTargetStatusLogEntry_1.isTargetStatusLogEntry)(data) &&
115
+ (data.status === "success" || data.status === "failed" || data.status === "skipped" || data.status === "aborted")) {
116
+ const entries = this.groupedEntries.get(id);
117
+ for (const targetEntry of entries) {
118
+ this.logTargetEntry(targetEntry);
119
+ }
120
+ if (entries.length > 2) {
121
+ this.hr();
122
+ }
123
+ }
124
+ }
125
+ hr() {
126
+ npmlog_1.default.info("", "----------------------------------------------");
127
+ }
128
+ summarize(schedulerRunSummary) {
129
+ const { hr } = this;
130
+ const { targetRuns, targetRunByStatus, duration } = schedulerRunSummary;
131
+ const { failed, aborted, skipped, success, pending } = targetRunByStatus;
132
+ const statusColorFn = {
133
+ success: chalk_1.default.greenBright,
134
+ failed: chalk_1.default.redBright,
135
+ skipped: chalk_1.default.gray,
136
+ running: chalk_1.default.yellow,
137
+ pending: chalk_1.default.gray,
138
+ aborted: chalk_1.default.red,
139
+ };
140
+ npmlog_1.default.info("", chalk_1.default.cyanBright(`🏗 Summary\n`));
141
+ if (targetRuns.size > 0) {
142
+ for (const wrappedTarget of targetRuns.values()) {
143
+ const colorFn = statusColorFn[wrappedTarget.status];
144
+ const target = wrappedTarget.target;
145
+ npmlog_1.default.verbose("", getTaskLogPrefix(target.packageName || "[GLOBAL]", target.task), colorFn(`${wrappedTarget.status === "running" ? "running - incomplete" : wrappedTarget.status}${wrappedTarget.duration ? `, took ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(wrappedTarget.duration))}` : ""}`));
146
+ }
147
+ npmlog_1.default.info("", `[Tasks Count] success: ${success.length}, skipped: ${skipped.length}, pending: ${pending.length}, aborted: ${aborted.length}`);
148
+ }
149
+ else {
150
+ npmlog_1.default.info("", "Nothing has been run.");
151
+ }
152
+ hr();
153
+ if (failed && failed.length > 0) {
154
+ for (const targetId of failed) {
155
+ const { packageName, task } = (0, target_graph_1.getPackageAndTask)(targetId);
156
+ const taskLogs = this.logEntries.get(targetId);
157
+ npmlog_1.default.error("", `[${chalk_1.default.magenta(packageName)} ${chalk_1.default.cyan(task)}] ${chalk_1.default.redBright("ERROR DETECTED")}`);
158
+ if (taskLogs) {
159
+ for (const entry of taskLogs) {
160
+ // Log each entry separately to prevent truncation
161
+ npmlog_1.default.error("", entry.msg);
162
+ }
163
+ }
164
+ hr();
165
+ }
166
+ }
167
+ npmlog_1.default.info("", `Took a total of ${(0, formatDuration_1.formatDuration)((0, formatDuration_1.hrToSeconds)(duration))} to complete`);
168
+ }
169
+ }
170
+ exports.NpmLogReporter = NpmLogReporter;
171
+ //# sourceMappingURL=NpmLogReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NpmLogReporter.js","sourceRoot":"","sources":["../src/NpmLogReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function formatDuration(seconds: string): string;
2
+ export declare function hrToSeconds(hrtime: [number, number]): string;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hrToSeconds = exports.formatDuration = void 0;
4
+ function formatDuration(seconds) {
5
+ let raw = parseFloat(seconds);
6
+ if (raw > 60) {
7
+ const minutes = Math.floor(raw / 60);
8
+ const seconds = (raw - minutes * 60).toFixed(2);
9
+ return `${minutes}m ${seconds}s`;
10
+ }
11
+ else {
12
+ const seconds = raw.toFixed(2);
13
+ return `${seconds}s`;
14
+ }
15
+ }
16
+ exports.formatDuration = formatDuration;
17
+ function hrToSeconds(hrtime) {
18
+ let raw = hrtime[0] + hrtime[1] / 1e9;
19
+ return raw.toFixed(2);
20
+ }
21
+ exports.hrToSeconds = hrToSeconds;
22
+ //# sourceMappingURL=formatDuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatDuration.js","sourceRoot":"","sources":["../src/formatDuration.ts"],"names":[],"mappings":";;;AAAA,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE,EAAE;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChD,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;KAClC;SAAM;QACL,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,GAAG,OAAO,GAAG,CAAC;KACtB;AACH,CAAC;AAVD,wCAUC;AAED,SAAgB,WAAW,CAAC,MAAwB;IAClD,IAAI,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAHD,kCAGC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export { AdoReporter } from "./AdoReporter";
2
+ export { JsonReporter } from "./JsonReporter";
3
+ export { NpmLogReporter } from "./NpmLogReporter";
4
+ export type { TargetStatusEntry, TargetMessageEntry } from "./types/TargetLogEntry";
package/lib/index.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NpmLogReporter = exports.JsonReporter = exports.AdoReporter = void 0;
4
+ var AdoReporter_1 = require("./AdoReporter");
5
+ Object.defineProperty(exports, "AdoReporter", { enumerable: true, get: function () { return AdoReporter_1.AdoReporter; } });
6
+ var JsonReporter_1 = require("./JsonReporter");
7
+ Object.defineProperty(exports, "JsonReporter", { enumerable: true, get: function () { return JsonReporter_1.JsonReporter; } });
8
+ var NpmLogReporter_1 = require("./NpmLogReporter");
9
+ Object.defineProperty(exports, "NpmLogReporter", { enumerable: true, get: function () { return NpmLogReporter_1.NpmLogReporter; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
@@ -0,0 +1,3 @@
1
+ import type { LogStructuredData } from "@lage-run/logger";
2
+ import type { TargetStatusEntry } from "./types/TargetLogEntry";
3
+ export declare function isTargetStatusLogEntry(data?: LogStructuredData): data is TargetStatusEntry;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTargetStatusLogEntry = void 0;
4
+ function isTargetStatusLogEntry(data) {
5
+ return data !== undefined && data.target && data.status !== undefined;
6
+ }
7
+ exports.isTargetStatusLogEntry = isTargetStatusLogEntry;
8
+ //# sourceMappingURL=isTargetStatusLogEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isTargetStatusLogEntry.js","sourceRoot":"","sources":["../src/isTargetStatusLogEntry.ts"],"names":[],"mappings":";;;AAGA,SAAgB,sBAAsB,CAAC,IAAwB;IAC7D,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;AACxE,CAAC;AAFD,wDAEC"}
@@ -0,0 +1,12 @@
1
+ import type { TargetStatus } from "@lage-run/scheduler";
2
+ import type { Target } from "@lage-run/target-graph";
3
+ export interface TargetStatusEntry {
4
+ target: Target;
5
+ status: TargetStatus;
6
+ duration?: [number, number];
7
+ hash?: string;
8
+ }
9
+ export interface TargetMessageEntry {
10
+ target: Target;
11
+ pid: number;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=TargetLogEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TargetLogEntry.js","sourceRoot":"","sources":["../../src/types/TargetLogEntry.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@lage-run/reporters",
3
+ "version": "0.1.1",
4
+ "description": "Log reporters for Lage",
5
+ "repository": {
6
+ "url": "https://github.com/microsoft/lage"
7
+ },
8
+ "license": "MIT",
9
+ "main": "lib/index.js",
10
+ "types": "lib/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "tsc -w --preserveWatchOutput",
14
+ "test": "jest"
15
+ },
16
+ "dependencies": {
17
+ "@lage-run/logger": "^1.1.1",
18
+ "@lage-run/scheduler": "^0.1.2",
19
+ "@lage-run/target-graph": "^0.2.0",
20
+ "chalk": "^4.0.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/jest": "^27.0.1",
24
+ "@types/node": "12.20.55",
25
+ "jest": "^27.2.0",
26
+ "memory-streams": "^0.1.3",
27
+ "ts-jest": "^27.0.5",
28
+ "typescript": "^4.4.4"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ }
33
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "ts-node": {
3
+ "transpileOnly": true
4
+ },
5
+ "compilerOptions": {
6
+ "target": "ES2017",
7
+ "module": "CommonJS",
8
+ "moduleResolution": "Node",
9
+ "declaration": true,
10
+ "lib": ["ES2017"],
11
+ "allowJs": true,
12
+ "outDir": "./lib",
13
+ "strict": true,
14
+ "noImplicitAny": false,
15
+ "allowSyntheticDefaultImports": true,
16
+ "esModuleInterop": true,
17
+ "forceConsistentCasingInFileNames": true,
18
+ "skipLibCheck": true,
19
+ "noUnusedLocals": false,
20
+ "sourceMap": true
21
+ },
22
+ "include": ["src"]
23
+ }