Skip to content

Commit 40f7dce

Browse files
committed
feat: add docker requirement and parser option
1 parent f460d33 commit 40f7dce

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

src/app/features/requirements.ts

+30-10
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,43 @@ import {
77
import { createGlobalState } from './base-feature-facade';
88

99
const requirements = [
10-
'node -v',
11-
'npm -v',
12-
'mvn --version',
13-
'java -version',
14-
'git --version',
10+
{ cmd: 'node -v' },
11+
{ cmd: 'npm -v' },
12+
{ cmd: 'mvn --version' },
13+
{ cmd: 'java -version' },
14+
{
15+
cmd: 'git --version',
16+
parser: (output: string) => output.trim().split(' ').reverse()[0],
17+
},
18+
{
19+
cmd: 'docker --version',
20+
},
21+
{
22+
cmd: 'docker compose version',
23+
},
1524
];
1625
const execPromise = promisify(exec);
1726

27+
function transformMessage(
28+
stdout: string,
29+
stderr: string,
30+
parser?: (output: string) => string
31+
) {
32+
if (stdout) {
33+
return parser ? parser(stdout) : stdout;
34+
}
35+
return stderr;
36+
}
37+
1838
export default class RequirementsFacade implements RequirementsResource {
1939
async getRequirements(): Promise<Requirement[]> {
2040
return Promise.all(
21-
requirements.map(requirement =>
22-
execPromise(requirement).then(({ stdout, stderr }) => ({
23-
name: requirement,
24-
cmd: requirement,
41+
requirements.map(({ cmd, parser }) =>
42+
execPromise(cmd).then(({ stdout, stderr }) => ({
43+
name: cmd,
44+
cmd: cmd,
2545
state: stdout ? ('ok' as const) : ('error' as const),
26-
message: stdout || stderr,
46+
message: transformMessage(stdout, stderr, parser),
2747
}))
2848
)
2949
);

src/ui/modules/requirements/requirements.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ import Box from '@mui/material/Box';
22
import Button from '@mui/material/Button';
33
import Typography from '@mui/material/Typography';
44
import React, { useState } from 'react';
5+
import { Requirement } from '../../../shared/types/requirements';
56
import { RequirementsResourceImpl } from './requirements-service';
67

78
export default function Requirements() {
89
const getRequirements = async () => {
910
const requirements = await new RequirementsResourceImpl().getRequirements();
10-
setRequirements(requirements.map(requirement => requirement.message));
11+
setRequirements(requirements);
1112
};
1213

13-
const [requirements, setRequirements] = useState<string[]>([]);
14+
const [requirements, setRequirements] = useState<Requirement[]>([]);
1415

1516
return (
1617
<React.Fragment>
@@ -29,8 +30,10 @@ export default function Requirements() {
2930
</Button>
3031
</Box>
3132
<ul>
32-
{requirements.map((requirement, index) => (
33-
<li key={index}>{requirement}</li>
33+
{requirements.map(({ message, name }, index) => (
34+
<li key={index}>
35+
{name}: {message}
36+
</li>
3437
))}
3538
</ul>
3639
</React.Fragment>

0 commit comments

Comments
 (0)