fix(arp-scanner): remplace map+filter null par flatMap typé

Le combo `map -> satisfies DiscoveryResult -> filter (r is …)` ne
passait pas le typecheck strict de Next : le type littéral produit
par `satisfies` n'était pas considéré sous-type valide du prédicat.
`flatMap<DiscoveryResult>` retourne [] quand la ligne ne matche pas,
ce qui évite la nullité intermédiaire et respecte la propriété
optionnelle `macAddress?: string`.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 14:10:07 +02:00
parent dc8dbc3cd7
commit 1273368c9a

View File

@@ -30,16 +30,14 @@ function parseIpNeigh(output: string): DiscoveryResult[] {
.split('\n') .split('\n')
.map((line) => line.trim()) .map((line) => line.trim())
.filter(Boolean) .filter(Boolean)
.map((line) => { .flatMap<DiscoveryResult>((line) => {
const ipMatch = line.match(/^(\d{1,3}(?:\.\d{1,3}){3})/); const ipMatch = line.match(/^(\d{1,3}(?:\.\d{1,3}){3})/);
if (!ipMatch) return [];
const macMatch = line.match(/lladdr\s+([0-9a-fA-F:]{17})/); const macMatch = line.match(/lladdr\s+([0-9a-fA-F:]{17})/);
if (!ipMatch) return null; const result: DiscoveryResult = { ipAddress: ipMatch[1] };
return { if (macMatch) result.macAddress = macMatch[1];
ipAddress: ipMatch[1], return [result];
macAddress: macMatch?.[1], });
} satisfies DiscoveryResult;
})
.filter((r): r is DiscoveryResult => r !== null);
} }
function parseArpA(output: string): DiscoveryResult[] { function parseArpA(output: string): DiscoveryResult[] {
@@ -48,14 +46,12 @@ function parseArpA(output: string): DiscoveryResult[] {
.split('\n') .split('\n')
.map((line) => line.trim()) .map((line) => line.trim())
.filter(Boolean) .filter(Boolean)
.map((line) => { .flatMap<DiscoveryResult>((line) => {
const ipMatch = line.match(/\((\d{1,3}(?:\.\d{1,3}){3})\)/); const ipMatch = line.match(/\((\d{1,3}(?:\.\d{1,3}){3})\)/);
if (!ipMatch) return [];
const macMatch = line.match(/([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})/); const macMatch = line.match(/([0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5})/);
if (!ipMatch) return null; const result: DiscoveryResult = { ipAddress: ipMatch[1] };
return { if (macMatch) result.macAddress = macMatch[1];
ipAddress: ipMatch[1], return [result];
macAddress: macMatch?.[1], });
} satisfies DiscoveryResult;
})
.filter((r): r is DiscoveryResult => r !== null);
} }