Skip to content

Commit 843246d

Browse files
committed
feat: added mulitple reporters feature
BREAKING CHANGE: `reporter` option is now `reporters` and can handle multiple reporters
1 parent ed3812c commit 843246d

File tree

4 files changed

+36
-23
lines changed

4 files changed

+36
-23
lines changed

bin/cli.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const program = require('commander');
33
const orpcCoverage = require('../build').default;
44
const { parseOpenRPCDocument } = require('@open-rpc/schema-utils-js');
55

6-
const getMethodsArray = (input) => {
6+
const getArrayFromCommaSeparated = (input) => {
77
if (input && input.split(',').length > 0) {
88
return input.split(',');
99
} else {
@@ -15,10 +15,10 @@ program
1515
.version(require('./get-version'))
1616
.usage('[options]')
1717
.option('-s, --schema [schema]', 'JSON string or a Path/Url pointing to an open rpc schema')
18-
.option('-r, --reporter <reporter>', 'Use the specified reporter [console] [json] [empty]')
18+
.option('-r, --reporters <reporter>', 'Use the specified reporter [console] [json] [empty]. Can be a comma separated list of reporters.')
1919
.option('-t, --transport <transport>', 'Use the specified transport [http]')
20-
.option('--skip <skip>', 'Methods to skip')
21-
.option('--only <only>', 'Methods to only run')
20+
.option('--skip <skip>', 'Methods to skip. Comma separated list of method names')
21+
.option('--only <only>', 'Methods to only run. Comma separated list of method names')
2222
.action(async (options) => {
2323
let schema;
2424
try {
@@ -32,9 +32,9 @@ program
3232
await orpcCoverage({
3333
openrpcDocument: schema,
3434
transport: options.transport,
35-
reporter: options.reporter,
36-
skip: getMethodsArray(options.skip),
37-
only: getMethodsArray(options.only),
35+
reporters: getArrayFromCommaSeparated(options.reporters),
36+
skip: getArrayFromCommaSeparated(options.skip),
37+
only: getArrayFromCommaSeparated(options.only),
3838
});
3939
} catch (e) {
4040
console.error(e);

src/coverage.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ describe("coverage", () => {
127127
}
128128
const transport = () => Promise.resolve();
129129
coverage({
130-
reporter: new CustomReporter(),
130+
reporters: [new CustomReporter()],
131131
transport,
132132
openrpcDocument: mockSchema,
133133
skip: [],
@@ -148,7 +148,7 @@ describe("coverage", () => {
148148
return { result: true };
149149
};
150150
coverage({
151-
reporter: new CustomReporter(),
151+
reporters: [new CustomReporter()],
152152
transport,
153153
openrpcDocument: mockSchema,
154154
skip: [],
@@ -168,7 +168,7 @@ describe("coverage", () => {
168168
const transport = () => Promise.resolve({});
169169
const openrpcDocument = mockSchema;
170170
const options = {
171-
reporter,
171+
reporters: [reporter],
172172
transport,
173173
openrpcDocument,
174174
skip: ['foo', 'bar', 'baz'],
@@ -189,14 +189,14 @@ describe("coverage", () => {
189189
const openrpcDocument = {...mockSchema};
190190
openrpcDocument.servers = undefined;
191191
const options = {
192-
reporter,
192+
reporters: [reporter],
193193
transport,
194194
openrpcDocument,
195195
skip: [],
196196
only: ['baz'],
197197
};
198198

199-
await expect(coverage(options)).resolves.toBeUndefined();
199+
await expect(coverage(options)).resolves.toBeDefined();
200200
});
201201
});
202202
describe("transport", () => {
@@ -206,7 +206,7 @@ describe("coverage", () => {
206206
return Promise.resolve({});
207207
};
208208
coverage({
209-
reporter: new EmptyReporter(),
209+
reporters: [new EmptyReporter()],
210210
transport,
211211
openrpcDocument: mockSchema,
212212
skip: [],
@@ -222,7 +222,7 @@ describe("coverage", () => {
222222
const transport = () => Promise.resolve({});
223223
const openrpcDocument = mockSchema;
224224
const options = {
225-
reporter,
225+
reporters: [reporter],
226226
transport,
227227
openrpcDocument,
228228
skip: [],
@@ -244,7 +244,7 @@ describe("coverage", () => {
244244
const transport = () => Promise.resolve({});
245245
const openrpcDocument = mockSchema;
246246
const options = {
247-
reporter,
247+
reporters: [reporter],
248248
transport,
249249
openrpcDocument,
250250
skip: [],

src/coverage.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface IOptions {
2222
skip: string[];
2323
only: string[];
2424
transport(url: string, method: string, params: any[]): PromiseLike<any>;
25-
reporter: Reporter;
25+
reporters: Reporter[];
2626
}
2727

2828
export interface ExampleCall {
@@ -104,10 +104,14 @@ export default async (options: IOptions) => {
104104
});
105105
});
106106

107-
options.reporter.onBegin(options, exampleCalls);
107+
for (const reporter of options.reporters) {
108+
reporter.onBegin(options, exampleCalls);
109+
}
108110

109111
for (const exampleCall of exampleCalls) {
110-
options.reporter.onTestBegin(options, exampleCall);
112+
for (const reporter of options.reporters) {
113+
reporter.onTestBegin(options, exampleCall);
114+
}
111115
try {
112116
const callResult = await options.transport(
113117
exampleCall.url,
@@ -135,8 +139,13 @@ export default async (options: IOptions) => {
135139
exampleCall.valid = false;
136140
exampleCall.requestError = e;
137141
}
138-
options.reporter.onTestEnd(options, exampleCall);
142+
for (const reporter of options.reporters) {
143+
reporter.onTestEnd(options, exampleCall);
144+
}
139145
}
140146

141-
return options.reporter.onEnd(options, exampleCalls);
147+
for (const reporter of options.reporters) {
148+
reporter.onEnd(options, exampleCalls);
149+
}
150+
return exampleCalls;
142151
};

src/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,23 @@ const reporters = {
1717
const transports = {
1818
http: HTTPTransport,
1919
};
20-
20+
type ReporterString = "console" | "json" | "raw" | "empty";
2121
interface IOptions {
2222
openrpcDocument: OpenrpcDocument;
2323
skip?: string[];
2424
only?: string[];
25-
reporter: "console" | "json" | "raw" | "empty";
25+
reporters: ReporterString[];
2626
transport: "http" | ITransport;
2727
}
2828

2929
export default async (options: IOptions) => {
3030
const transport = typeof options.transport === "function" ? options.transport : transports[options.transport || "http"];
31+
let reporterInstances = options.reporters.map((reporter) => new reporters[reporter]);
32+
if (reporterInstances.length === 0) {
33+
reporterInstances = [new reporters["console"]()];
34+
}
3135
return coverage({
32-
reporter: new reporters[options.reporter || "console"],
36+
reporters: reporterInstances,
3337
openrpcDocument: options.openrpcDocument,
3438
skip: options.skip || [],
3539
only: options.only || [],

0 commit comments

Comments
 (0)