Skip to content

Commit

Permalink
feat(core): add grouping of promise results by status
Browse files Browse the repository at this point in the history
Closes #287

#287
  • Loading branch information
MishaSeredenkoPushBased committed Jan 8, 2024
1 parent cf4d9e3 commit 5f50e8e
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 11 deletions.
22 changes: 11 additions & 11 deletions packages/core/src/lib/implementation/execute-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ import {
} from '@code-pushup/models';
import {
getProgressBar,
isPromiseFulfilledResult,
isPromiseRejectedResult,
groupByStatus,
logMultipleResults,
} from '@code-pushup/utils';
import { executeRunnerConfig, executeRunnerFunction } from './runner';
Expand Down Expand Up @@ -148,21 +147,22 @@ export async function executePlugins(

logMultipleResults(results, 'Plugins', undefined, errorsCallback);

// TODO: add groupBy method for promiseSettledResult by status, #287

const failedResults = results.filter(isPromiseRejectedResult);
if (failedResults.length) {
const errorMessages = failedResults
const { fulfilled, rejected } = groupByStatus(results) as {
fulfilled: PromiseFulfilledResult<PluginReport>[];
rejected: PromiseRejectedResult[];
};
if (rejected.length) {
const errorMessages = rejected
.map(({ reason }: PromiseRejectedResult) => reason)
.join(', ');
throw new Error(
`Plugins failed: ${failedResults.length} errors: ${errorMessages}`,
`Plugins failed: ${rejected.length} errors: ${errorMessages}`,
);
}

return results
.filter(isPromiseFulfilledResult)
.map((result: PromiseFulfilledResult<PluginReport>) => result.value);
return fulfilled.map(
(result: PromiseFulfilledResult<PluginReport>) => result.value,
);
}

function auditOutputsCorrelateWithPluginOutput(
Expand Down
1 change: 1 addition & 0 deletions packages/utils/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,4 @@ export {
toUnixPath,
} from './lib/transform';
export { verboseUtils } from './lib/verbose-utils';
export { groupByStatus } from './lib/group-by-status';
22 changes: 22 additions & 0 deletions packages/utils/src/lib/group-by-status.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
export function groupByStatus<T>(results: PromiseSettledResult<T>[]): {
fulfilled: PromiseFulfilledResult<T>[];
rejected: PromiseRejectedResult[];
} {
return results.reduce<{
fulfilled: PromiseFulfilledResult<T>[];
rejected: PromiseRejectedResult[];
}>(
(accumulator, currentValue) => {
if (currentValue.status === 'fulfilled' && 'value' in currentValue) {
accumulator.fulfilled.push(currentValue);
} else if (
currentValue.status === 'rejected' &&
'reason' in currentValue
) {
accumulator.rejected.push(currentValue);
}
return accumulator;
},
{ fulfilled: [], rejected: [] },
);
}
20 changes: 20 additions & 0 deletions packages/utils/src/lib/group-by-status.unit.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { describe } from 'vitest';
import { groupByStatus } from './group-by-status';

describe('groupByStatus', () => {
it('should group results by status', () => {
const results = [
{ status: 'fulfilled', value: 'first' },
{ status: 'rejected', reason: 'second' },
{ status: 'fulfilled', value: 'third' },
] as PromiseSettledResult<string>[];
const grouped = groupByStatus(results);
expect(grouped).toEqual({
fulfilled: [
{ status: 'fulfilled', value: 'first' },
{ status: 'fulfilled', value: 'third' },
],
rejected: [{ status: 'rejected', reason: 'second' }],
});
});
});

0 comments on commit 5f50e8e

Please sign in to comment.