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')
.map((line) => line.trim())
.filter(Boolean)
.map((line) => {
.flatMap<DiscoveryResult>((line) => {
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})/);
if (!ipMatch) return null;
return {
ipAddress: ipMatch[1],
macAddress: macMatch?.[1],
} satisfies DiscoveryResult;
})
.filter((r): r is DiscoveryResult => r !== null);
const result: DiscoveryResult = { ipAddress: ipMatch[1] };
if (macMatch) result.macAddress = macMatch[1];
return [result];
});
}
function parseArpA(output: string): DiscoveryResult[] {
@@ -48,14 +46,12 @@ function parseArpA(output: string): DiscoveryResult[] {
.split('\n')
.map((line) => line.trim())
.filter(Boolean)
.map((line) => {
.flatMap<DiscoveryResult>((line) => {
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})/);
if (!ipMatch) return null;
return {
ipAddress: ipMatch[1],
macAddress: macMatch?.[1],
} satisfies DiscoveryResult;
})
.filter((r): r is DiscoveryResult => r !== null);
const result: DiscoveryResult = { ipAddress: ipMatch[1] };
if (macMatch) result.macAddress = macMatch[1];
return [result];
});
}