Functions/Public/Get-GitHubBetaProjectItem.ps1

function Get-GitHubBetaProjectItem {
    <#
    .SYNOPSIS
        EXPERIMENTAL: Gets the items in a GitHub project (Beta).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string] $ProjectNodeId,

        # Optional base URL of the GitHub API, for example "https://ghe.mycompany.com/api/v3/" (including the trailing slash).
        # Defaults to "https://api.github.com"
        [Uri] $BaseUri = [Uri]::new('https://api.github.com'),
        [Security.SecureString] $Token
    )

    process {
        # Paginate in reverse, to get the most recent items first.
        $before = $null
        do {
            Write-Verbose "Requesting previous page (paginating backwards)"
            $result = Invoke-GitHubGraphQlApi `
                -Headers @{ 'GraphQL-Features' = 'projects_next_graphql' } `
                -Query 'query($projectId: ID!, $before: String) {
                    node(id: $projectId) {
                        ... on ProjectNext {
                            items(last: 100, before: $before) {
                                pageInfo {
                                    hasPreviousPage
                                    startCursor
                                }
                                nodes {
                                    id
                                    title
                                    createdAt
                                    updatedAt
                                    fieldValues(first: 20) {
                                        nodes {
                                            value
                                            projectField {
                                                name
                                            }
                                        }
                                    }
                                    content {
                                        ...on Issue {
                                            __typename
                                            number
                                            state
                                            repository {
                                                owner {
                                                    login
                                                }
                                                name
                                                nameWithOwner
                                            }
                                        }
                                        ...on PullRequest {
                                            __typename
                                            number
                                            state
                                            repository {
                                                owner {
                                                    login
                                                }
                                                name
                                                nameWithOwner
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }'
 `
                -Variables @{
                    projectId = $ProjectNodeId
                    before = $before
                } `
                -BaseUri $BaseUri `
                -Token $Token

            $nodes = $result.node.items.nodes
            [array]::Reverse($nodes) | Out-Null
            foreach ($node in $nodes) {
                # Expose fields as ergonomic name=>value hashtable
                $fieldHashTable = @{ }
                foreach ($field in $node.fieldValues.nodes) {
                    $fieldHashTable[$field.projectField.name] = $field.value
                }
                Add-Member -InputObject $node -NotePropertyName 'Fields' -NotePropertyValue $fieldHashTable

                $node
            }

            $before = $result.node.items.pageInfo.startCursor
        } while ($result.node.items.pageInfo.hasPreviousPage)
    }
}