@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 +32 -0
- package/CHANGELOG.md +15 -0
- package/README.md +87 -0
- package/jest.config.js +1 -0
- package/lib/AdoReporter.d.ts +19 -0
- package/lib/AdoReporter.js +162 -0
- package/lib/AdoReporter.js.map +1 -0
- package/lib/JsonReporter.d.ts +11 -0
- package/lib/JsonReporter.js +37 -0
- package/lib/JsonReporter.js.map +1 -0
- package/lib/NpmLogReporter.d.ts +19 -0
- package/lib/NpmLogReporter.js +171 -0
- package/lib/NpmLogReporter.js.map +1 -0
- package/lib/formatDuration.d.ts +2 -0
- package/lib/formatDuration.js +22 -0
- package/lib/formatDuration.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +10 -0
- package/lib/index.js.map +1 -0
- package/lib/isTargetStatusLogEntry.d.ts +3 -0
- package/lib/isTargetStatusLogEntry.js +8 -0
- package/lib/isTargetStatusLogEntry.js.map +1 -0
- package/lib/types/TargetLogEntry.d.ts +12 -0
- package/lib/types/TargetLogEntry.js +3 -0
- package/lib/types/TargetLogEntry.js.map +1 -0
- package/package.json +33 -0
- package/tsconfig.json +23 -0
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,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
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
|
package/lib/index.js.map
ADDED
|
@@ -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,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 @@
|
|
|
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
|
+
}
|