Public/Get-HyperVVMMermaidDiagram.ps1

function Get-HyperVVMMermaidDiagram {
    [CmdletBinding(DefaultParameterSetName = 'ByComputerName')]
    [OutputType([string])]
    param(
        [Parameter(ParameterSetName = 'ByTopology', ValueFromPipeline)]
        [HyperVVMTopology] $Topology,

        [Parameter(ParameterSetName = 'ByComputerName')]
        [ValidateNotNullOrEmpty()]
        [string] $ComputerName = 'localhost',

        [Parameter()]
        [string[]] $Environment,

        [Parameter()]
        [string[]] $Service,

        [Parameter()]
        [string] $OutputPath
    )

    Process {
        if ($PSCmdlet.ParameterSetName -eq 'ByComputerName') {
            $Topology = Get-HyperVVMTopology -ComputerName $ComputerName
        }

        $envList = $Topology.Environment
        if ($Environment) {
            $envList = @($envList | Where-Object { $Environment -contains $_.Name })
        }
        if ($Service) {
            $envList = @(foreach ($env in $envList) {
                $svcFiltered = @($env.Service | Where-Object { $Service -contains $_.Name })
                if ($svcFiltered.Count -gt 0) {
                    $e            = [HyperVVMEnvironment]::new()
                    $e.Name       = $env.Name
                    $e.Service    = $svcFiltered
                    $e.StartOrder = @($env.StartOrder | Where-Object { $Service -contains $_ })
                    $e
                }
            })
        }

        $lines = [System.Collections.Generic.List[string]]::new()
        $lines.Add('graph TD')

        foreach ($env in $envList) {
            $envId = 'ENV_' + ($env.Name -replace '[^a-zA-Z0-9]', '_')
            $lines.Add(" subgraph ${envId}[""$($env.Name)""]")

            foreach ($svc in $env.Service) {
                $svcId = "${envId}_SVC_" + ($svc.Name -replace '[^a-zA-Z0-9]', '_')
                $lines.Add(" ${svcId}[(""$($svc.Name)"")]")

                foreach ($vm in $svc.VM) {
                    $vmId = "${envId}_VM_" + ($vm.Name -replace '[^a-zA-Z0-9]', '_')
                    $lines.Add(" ${vmId}[""$($vm.Name)""] -.->|member| ${svcId}")
                }
            }

            foreach ($svc in $env.Service) {
                $svcId = "${envId}_SVC_" + ($svc.Name -replace '[^a-zA-Z0-9]', '_')
                foreach ($dep in $svc.DependsOn) {
                    if ($env.Service | Where-Object Name -eq $dep) {
                        $depId = "${envId}_SVC_" + ($dep -replace '[^a-zA-Z0-9]', '_')
                        $lines.Add(" ${depId} -->|depends| ${svcId}")
                    }
                }
            }

            $lines.Add(' end')
        }

        $diagram = $lines -join "`n"

        if ($OutputPath) {
            Set-Content -Path $OutputPath -Value $diagram -Encoding UTF8
        }

        $diagram
    }
}