Private/WinGet/New-IntuneWin32AppPayload.ps1

function New-IntuneWin32AppPayload {
    [CmdletBinding()]
    [OutputType([hashtable])]
    param(
        [Parameter(Mandatory)]
        [hashtable]$Configuration,

        [Parameter()]
        [string]$PackageFileName,

        [Parameter()]
        [string]$SetupFilePath,

        [Parameter()]
        [string]$IconBase64,

        [Parameter()]
        [string]$IconMimeType = 'image/png',

        [Parameter()]
        [string]$ScriptRootPath
    )

    $packageInformation = Get-ConfigurationSection -InputObject $Configuration -Name 'PackageInformation'
    $information = Get-ConfigurationSection -InputObject $Configuration -Name 'Information'
    $program = Get-ConfigurationSection -InputObject $Configuration -Name 'Program'
    $requirementConfig = Get-ConfigurationSection -InputObject $Configuration -Name 'RequirementRule'

    $detectionRules = @(foreach ($rule in @($Configuration.DetectionRule)) {
            if ($null -ne $rule) {
                ConvertTo-IntuneWinDetectionRule -Rule $rule -ScriptRootPath $ScriptRootPath
            }
        })

    $requirementRules = @(foreach ($rule in @($Configuration.CustomRequirementRule)) {
            if ($null -ne $rule) {
                ConvertTo-IntuneWinRequirementRule -Rule $rule -ScriptRootPath $ScriptRootPath
            }
        })

    $packageName = if ($PackageFileName) {
        $PackageFileName
    } elseif ($packageInformation.SetupFile) {
        $packageInformation.SetupFile
    } else {
        $null
    }

    $setupFile = if ($SetupFilePath) {
        $SetupFilePath
    } elseif ($packageInformation.SetupFile) {
        $packageInformation.SetupFile
    } else {
        $null
    }

    $payload = @{
        '@odata.type'                   = '#microsoft.graph.win32LobApp'
        displayName                     = $information.DisplayName
        description                     = ($information.Description ?? '')
        publisher                       = ($information.Publisher ?? '')
        developer                       = ($information.Developer ?? '')
        owner                           = ($information.Owner ?? '')
        notes                           = ($information.Notes ?? '')
        appVersion                      = ($information.AppVersion ?? '')
        informationUrl                  = if ([string]::IsNullOrWhiteSpace($information.InformationURL)) { $null } else { $information.InformationURL }
        privacyInformationUrl           = if ([string]::IsNullOrWhiteSpace($information.PrivacyURL)) { $null } else { $information.PrivacyURL }
        fileName                        = $packageName
        setupFilePath                   = $setupFile
        installCommandLine              = $program.InstallCommand
        uninstallCommandLine            = $program.UninstallCommand
        minimumSupportedOperatingSystem = Resolve-MinimumSupportedOperatingSystem -Release ($requirementConfig.MinimumSupportedWindowsRelease ?? $requirementConfig.MinimumRequiredOperatingSystem)
        installExperience               = @{ runAsAccount = ($program.InstallExperience ?? 'system') }
        minimumFreeDiskSpaceInMB        = ($requirementConfig.MinimumFreeDiskSpaceInMB ?? $null)
        minimumMemoryInMB               = ($requirementConfig.MinimumMemoryInMB ?? $null)
        returnCodes                     = @(
            @{ returnCode = 0; type = 'success' }
            @{ returnCode = 1707; type = 'success' }
            @{ returnCode = 3010; type = 'softReboot' }
            @{ returnCode = 1641; type = 'hardReboot' }
            @{ returnCode = 1618; type = 'retry' }
        )
    }

    $applicableArchitecture = Resolve-ApplicableArchitecture -Architecture $requirementConfig.Architecture
    if ($applicableArchitecture) {
        $payload.applicableArchitectures = $applicableArchitecture
    }

    if ($program.DeviceRestartBehavior) {
        $payload.deviceRestartBehavior = $program.DeviceRestartBehavior
    }

    if ($program.ContainsKey('AllowAvailableUninstall')) {
        $payload.allowAvailableUninstall = ConvertTo-HydrationBoolValue -Value $program.AllowAvailableUninstall
    }

    if ($information.ContainsKey('RoleScopeTagIds') -and @($information.RoleScopeTagIds).Count -gt 0) {
        $payload.roleScopeTagIds = @($information.RoleScopeTagIds)
    }

    if ($IconBase64) {
        $payload.largeIcon = @{
            '@odata.type' = '#microsoft.graph.mimeContent'
            type          = $IconMimeType
            value         = $IconBase64
        }
    }

    $combinedRules = @($detectionRules + $requirementRules)
    if ($combinedRules.Count -gt 0) {
        $payload.rules = $combinedRules
    }

    Write-Debug "Created Win32 app payload for '$($payload.displayName)' with FileName='$($payload.fileName)', SetupFilePath='$($payload.setupFilePath)', AppVersion='$($payload.appVersion)', DetectionRules=$($detectionRules.Count), RequirementRules=$($requirementRules.Count), CombinedRules=$($combinedRules.Count), RoleScopeTags=$(@($payload.roleScopeTagIds).Count), HasIcon=$([bool]$IconBase64)."

    return $payload
}