Skip to content

Commit 35689fc

Browse files
committed
feat(api): Report.merge() can merge async results
1 parent e89ca3d commit 35689fc

File tree

4 files changed

+82
-1
lines changed

4 files changed

+82
-1
lines changed

etc/browser.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,7 @@ export class Reporter {
935935
// (undocumented)
936936
protected isValid(): boolean;
937937
static merge(reports: Report_2[]): Report_2;
938+
static merge(reports: Promise<Report_2[]> | Array<Promise<Report_2>>): Promise<Report_2>;
938939
// (undocumented)
939940
protected result: Record<string, DeferredMessage[]>;
940941
// (undocumented)

etc/index.api.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,7 @@ export class Reporter {
10281028
// (undocumented)
10291029
protected isValid(): boolean;
10301030
static merge(reports: Report_2[]): Report_2;
1031+
static merge(reports: Promise<Report_2[]> | Array<Promise<Report_2>>): Promise<Report_2>;
10311032
// (undocumented)
10321033
protected result: Record<string, DeferredMessage[]>;
10331034
// (undocumented)

src/reporter.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,56 @@ describe("Reporter", () => {
4848
expect(merged.errorCount).toBe(4);
4949
expect(merged.warningCount).toBe(0);
5050
});
51+
52+
it("should handle promise with results", async () => {
53+
expect.assertions(3);
54+
const merged = await Reporter.merge(
55+
Promise.resolve([
56+
{
57+
valid: false,
58+
results: [createResult("foo", ["fred", "barney"])],
59+
errorCount: 1,
60+
warningCount: 0,
61+
},
62+
{
63+
valid: true,
64+
results: [createResult("bar", ["wilma"])],
65+
errorCount: 0,
66+
warningCount: 1,
67+
},
68+
]),
69+
);
70+
expect(merged.valid).toBeFalsy();
71+
expect(merged.results[0].filePath).toBe("foo");
72+
expect(merged.results[1].filePath).toBe("bar");
73+
});
74+
75+
it("should handle array of promises", async () => {
76+
expect.assertions(3);
77+
const merged = await Reporter.merge([
78+
Promise.resolve({
79+
valid: false,
80+
results: [createResult("foo", ["fred", "barney"])],
81+
errorCount: 1,
82+
warningCount: 0,
83+
}),
84+
Promise.resolve({
85+
valid: true,
86+
results: [createResult("bar", ["wilma"])],
87+
errorCount: 0,
88+
warningCount: 1,
89+
}),
90+
]);
91+
expect(merged.valid).toBeFalsy();
92+
expect(merged.results[0].filePath).toBe("foo");
93+
expect(merged.results[1].filePath).toBe("bar");
94+
});
95+
96+
it("should handle empty array", async () => {
97+
expect.assertions(1);
98+
const merged = Reporter.merge([]);
99+
expect(merged.results).toHaveLength(0);
100+
});
51101
});
52102

53103
describe("save()", () => {

src/reporter.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Severity } from "./config";
22
import { type Location, type Source } from "./context";
33
import { type Rule } from "./rule";
44
import { type DOMNode } from "./dom";
5+
import { isThenable } from "./utils";
56

67
/**
78
* Reported error message.
@@ -58,6 +59,13 @@ function freeze(src: DeferredMessage): Message {
5859
};
5960
}
6061

62+
function isThenableArray<T>(value: T[] | Array<Promise<T>>): value is Array<Promise<T>> {
63+
if (value.length === 0) {
64+
return false;
65+
}
66+
return isThenable(value[0]);
67+
}
68+
6169
/**
6270
* @public
6371
*/
@@ -100,8 +108,29 @@ export class Reporter {
100108

101109
/**
102110
* Merge two or more reports into a single one.
111+
*
112+
* @param reports- Reports to merge.
113+
* @returns A merged report.
114+
*/
115+
public static merge(reports: Report[]): Report;
116+
117+
/**
118+
* Merge two or more reports into a single one.
119+
*
120+
* @param reports- Reports to merge.
121+
* @returns A promise resolved with the merged report.
103122
*/
104-
public static merge(reports: Report[]): Report {
123+
public static merge(reports: Promise<Report[]> | Array<Promise<Report>>): Promise<Report>;
124+
125+
public static merge(
126+
reports: Report[] | Promise<Report[]> | Array<Promise<Report>>,
127+
): Report | Promise<Report> {
128+
if (isThenable(reports)) {
129+
return reports.then((reports) => this.merge(reports));
130+
}
131+
if (isThenableArray(reports)) {
132+
return Promise.all(reports).then((reports) => this.merge(reports));
133+
}
105134
const valid = reports.every((report) => report.valid);
106135
const merged: Record<string, Result> = {};
107136
reports.forEach((report: Report) => {

0 commit comments

Comments
 (0)