diff --git a/.env.example b/.env.example index 06febbd612..5f74c6e465 100644 --- a/.env.example +++ b/.env.example @@ -1,13 +1,3 @@ -PCC_SITE_ID= -PCC_TOKEN= - -PCC_MANAGEMENT_TOKEN= -SERVE_LOCAL= - -CONTENT_PCC_SITE_ID= -CONTENT_PCC_TOKEN= - - # Either of the following # NEXT_PUBLIC_GA_ID= # NEXT_PUBLIC_GTM_ID= diff --git a/.github/workflows/send-content-to-ingest-api.yml b/.github/workflows/send-content-to-ingest-api.yml deleted file mode 100644 index 2838a20818..0000000000 --- a/.github/workflows/send-content-to-ingest-api.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: on main push - -on: - push: - branches: - - multi-content-publisher-ingest-testing - -jobs: - get-changed-files: - runs-on: ubuntu-latest - - steps: - - name: Checkout repo - uses: actions/checkout@v4 - with: - fetch-depth: 0 # Required to get full history - - - name: Get last successful commit SHA - id: last_success - run: | - last_success_sha=$(gh run list --branch=main --workflow="${{ github.workflow }}" --status=success --limit=1 --json=headSha --jq='.[0].headSha') - echo "Last successful SHA: $last_success_sha" - echo "last_success_sha=$last_success_sha" >> $GITHUB_OUTPUT - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Get changed files since last successful run - run: | - mkdir -p /tmp - if [ -z "${{ steps.last_success.outputs.last_success_sha }}" ]; then - echo "No previous successful build found, listing all files" - git diff --name-only HEAD > /tmp/changed_files.txt - else - echo "Comparing ${{ steps.last_success.outputs.last_success_sha }}..HEAD" - git diff --name-only ${{ steps.last_success.outputs.last_success_sha }} HEAD > /tmp/changed_files.txt - fi - echo "Files changed:" - cat /tmp/changed_files.txt - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: "20" - - - name: Install pnpm - run: npm install -g pnpm - - - name: Install dependencies - run: pnpm install - - - name: Run your Node.js script - run: pnpm run update - env: - PCC_SITE_ID: ${{ secrets.PCC_SITE_ID }} - PCC_TOKEN: ${{ secrets.PCC_TOKEN }} - PCC_MANAGEMENT_TOKEN: ${{ secrets.PCC_MANAGEMENT_TOKEN }} diff --git a/active.json b/active.json deleted file mode 100644 index 5b9f0fbbab..0000000000 --- a/active.json +++ /dev/null @@ -1,4915 +0,0 @@ -[ - { - "children": [ - { - "children": [], - "id": "6ZNZhynGInWy0qSW6p6f", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "AIBwNFbzSIuVWnc8QBYS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HyFYdWkrVPqHSjSubqT7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EFdsdk1IJUNHJIEbwWtH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "BHrphmzguy90hd5XwMXj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TEllQtLbYrTmBZax8Dnc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dwdlKFnGZFBsF6mbHzhm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wUMtx37Za6YRfUl4zJcr", - "isHidden": false, - "type": "article" - } - ], - "id": "AIBwNFbzSIuVWnc8QBYS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "U2YobtqzynhZcv44ktVo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3wdzgyS4upDFnmaJ31PG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5QqyLQWP7a8ZTtXuR9TM", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "rilALmurrj5iQwcswoHc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0fw6ZktVybJfOp8f9NEy", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Gx2rgxFKLw0Gmebtlry9", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zeFioPczTIpjG3WViEES", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "7TRmkUSFF15veixT25Xc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QGnWOQ3AKs9eENQibQm2", - "isHidden": false, - "type": "article" - } - ], - "id": "rilALmurrj5iQwcswoHc", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "BlMKA3V9N0c29MHKW2SE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tDP97MN14pSZd0NZjoDR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NgiBCs4ht5POFaVR2iid", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "BhP9BbJK3GJcoRW8IUUL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vvCLsP4YsjOfHT3o9Z03", - "isHidden": false, - "type": "article" - } - ], - "id": "BlMKA3V9N0c29MHKW2SE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "d2NG198DrCEa8FkAfCsM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NtlmaiadfolUE7AyNKiC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "A36Kpmd3MNsPYvYffz1W", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "bdYyVFNBLuh8qhxyDZrh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bvOyVlwyDhq8fqVeguUV", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VjrjqIcPZKe7o8LCZjXy", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QAfX4fYvPI0fry7u0UWY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "M9qh5O36xf0Ga4lU9DBH", - "isHidden": false, - "type": "article" - } - ], - "id": "bdYyVFNBLuh8qhxyDZrh", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "dsSOUsNpCbHiwrQdDkZK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lPLUyJcog4edU2tOPMqm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ft4vrOOu1zh1XTdkk9Qf", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ywJcA3NtJoRKRqGh01Dw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UCTAZmC2Bg9h8qdAsIEE", - "isHidden": false, - "type": "article" - } - ], - "id": "dsSOUsNpCbHiwrQdDkZK", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "a3Rk2zX0E8x8aOCzaLoj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xPD0YgKLoyI1XYsCdTIv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WzpzXEJ2YCzHxWgKeZm4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tDy0YJ6zkVjsh9M0HJc8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PtFD9836rmVDGu6xnOT3", - "isHidden": false, - "type": "article" - } - ], - "id": "a3Rk2zX0E8x8aOCzaLoj", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "wx7m0wwWt6wVOQ8VcecZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lhgTCZ7OQDsR3NECsEqN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1EBYAmv3dz2QGLmjFphJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "B77vBZOKWlkLTlX3YO6W", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6erZowBA5kopRW11ssUU", - "isHidden": false, - "type": "article" - } - ], - "id": "wx7m0wwWt6wVOQ8VcecZ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "5C3I14cuuiHGSXnXT95D", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vdSJpOiGZOqkgmixhCaC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EdvpWw31wTpK3h1Sgr1Q", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dBEtiLhZI7LLPV4dIZCb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GlSR4ko44JtMKglUh23t", - "isHidden": false, - "type": "article" - } - ], - "id": "5C3I14cuuiHGSXnXT95D", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "7AxScnrlpKqLa64dtcAc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZxL7y5zYALp86xV4pzve", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0gcZeppMKrCpCU65fBKC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PI19YRDRVLhrsWNPOKuq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fGszPgId5pty5DvO0YrM", - "isHidden": false, - "type": "article" - } - ], - "id": "7AxScnrlpKqLa64dtcAc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SmdmxUrae9iNU5Xaa1qS", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "e02neCSqZ22vrBTV4EFQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Jugdp8G1XApYVirC2Yow", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XeU74StRXIJIWMl2Mo2M", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tric82GAK0hEHgOkW616", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tuE1aXqowXiZhQPsfLkv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wHBuBmf3076u0WTSi644", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "jeoxuIklyNB0yXHh1TQL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "X6IZafufWBXTkDl1qXjk", - "isHidden": false, - "type": "article" - } - ], - "id": "e02neCSqZ22vrBTV4EFQ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "rwEjH4zutPgIZaF9qwhO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Mug1lsoMcZ4Uqf7f4E9h", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qzBMUJwreFtUYrWF7sUJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iH0otdeNQvho6G4IbZiE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ozHGXPJayPamCqCGCSd8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3tYXxszQvl5wkPRughrK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MNYjV6A0hcMWZ6U5OMpN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "haoaoGhu8jJOebk22Obb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WlQcNmaquuWdUoKYSeWP", - "isHidden": false, - "type": "article" - } - ], - "id": "rwEjH4zutPgIZaF9qwhO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VkhN1RFAhSotKxQpZ4iY", - "isHidden": false, - "type": "article" - } - ], - "id": "BlMKA3V9N0c29MHKW2SE", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "UdJxon19E6WmFUMFhIT3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Hb00q7KxUwJeyBUOAQ0Y", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "7gEbadwM5DUHUsqRiKDS", - "isHidden": false, - "type": "article" - } - ], - "id": "J1siGOY1OsoWHWwvJvsu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lPiebQLW4VW9NvtQNdXM", - "isHidden": false, - "type": "article" - } - ], - "id": "6ZNZhynGInWy0qSW6p6f", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "guDgyyUMUI9ui1JZvLKL", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "DVtvsqAhnI9tHBEZmeFJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "7SKOCDsWUpbm5r8FXtB9", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "v6ww4x1JDuiwgyI51hpe", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "oCnZFr4nnwFOuxmlmz8h", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "jm5HqM04EPn1Jmaim8Ck", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lE9UGGZtuGqOCbw2B3GY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CYxiGNkgyeTKFxOT7jtb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fBkxDDGUVrzQWqzO1R9d", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4TixnEbAS0yXwBGiGUYI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "81TILGaCLbu0gTYvaZvf", - "isHidden": false, - "type": "article" - } - ], - "id": "v6ww4x1JDuiwgyI51hpe", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "WaS0y82MTytRBjjQIROb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "IPmu44eTMVUo4DbDPAER", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OSCdtULPHKbv4HOuH6ta", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "q6yOi5mgs9Tx8xAQ56cs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EkMpQUnNV5gJimSJVfuQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WV1ntHb74A65mEx7onLJ", - "isHidden": false, - "type": "article" - } - ], - "id": "WaS0y82MTytRBjjQIROb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "BruJO5NfFTgnO644wsMi", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "RYudpNR9hZLKtKv7idgC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gJL7tiPJ3GVw3WUp2PlL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ubCcP6aUJVWhnCxYOnlu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "17hJCDot1jdHbzqyJFgU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OlBooLB5ekNRJ1Ol7NLP", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8QdI0uG44gpuCTQTZRns", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "s4cb4ogD0Ibot7cEWoS7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TuFkHaXsk2oUe8qb5o0V", - "isHidden": false, - "type": "article" - } - ], - "id": "RYudpNR9hZLKtKv7idgC", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Nu9VCvruPTLMQLwaQNM7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nXVX78DtEc7UqnODQw8i", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xJq0H2qnxCd71Fd6crh8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qtkmGPKJVpCbEgelBkeD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "LaWCnwRAqQNl36JWvWkY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "m7vQjX5djlIsCtv6wbMV", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yZmgtqOCe6m3sao3TeYE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kLdlnORuRLt7QAT0t4kg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "cQrxRCHkdfgsVTlqFMA5", - "isHidden": false, - "type": "article" - } - ], - "id": "Nu9VCvruPTLMQLwaQNM7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iQJtTxdLtSCH8EfSm21n", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "P665R4ZCUPiXZiZd81By", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZVTXjagzQRFGTIK3bMtu", - "isHidden": false, - "type": "article" - } - ], - "id": "DVtvsqAhnI9tHBEZmeFJ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "OnxXdVVZukzFOv6R0TYU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Cxs9FvD1d1hf55p9egcT", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TL3FYeVp16ashrDm8a5U", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Itbdx734EVgwlOpNU2Hw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hiyqMQEBGQiSgVk2nd5w", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bBLjVbyFIJOxokEvwarT", - "isHidden": false, - "type": "article" - } - ], - "id": "OnxXdVVZukzFOv6R0TYU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1e6NySEwZEmQZzJkvbrN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SCcDbe4vYUUjAkKA4nIL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZMqdYOtpIrHq9kb4LCAg", - "isHidden": false, - "type": "article" - } - ], - "id": "OnxXdVVZukzFOv6R0TYU", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "V4aoLX0AduQkx3fbFcmY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Utfo2ME1h6Ggcvw3zOaa", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "3Tlq1kvtVWiyIIBYchf2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KCa7hXPfjGEZewysSj91", - "isHidden": false, - "type": "article" - } - ], - "id": "3Tlq1kvtVWiyIIBYchf2", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "mpKk3nEdai2ilUXCrbG7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ERphB3HGCptIl378DyUs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "W2z7D03FAX3wazNcoi2E", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "cxZftdbG6LPOo18bAbLM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GmXp0eoQhkXol8gkqmGu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "k5qp4zDXVQXAyaOwTs0U", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1JHCklnB2GsTckaz34X9", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MXCIIv9NmGydwGBkHw7G", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UiQyUVNcy8wazvUF9hRo", - "isHidden": false, - "type": "article" - } - ], - "id": "mpKk3nEdai2ilUXCrbG7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "G82NR8IWZk44K2T0EIan", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "06HmlVdD0VXBITds5Kqw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qbwoKAhOxD4CzZChHt0U", - "isHidden": false, - "type": "article" - } - ], - "id": "V4aoLX0AduQkx3fbFcmY", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "kYNU1oeAJzb5fHCH5bix", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WRfakB8G6HtlUyznTFIn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lH3kgcyboqqNLLvgP1eJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2gjjuYdm9Zj23uOVaMLl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MjGMwwB07umMt8mwEyXY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GeNNnOKderttdj8TMzY9", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "mul3DSElanPHfJCb2Cmz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QH4MSeg1s758QgUOWmBw", - "isHidden": false, - "type": "article" - } - ], - "id": "kYNU1oeAJzb5fHCH5bix", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "K8RvKer2YW3VRevNSmoC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nYrjKYgPGeT5KuL8exeA", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "R7Yyi48v7M7fXjAPrBZW", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JWHwPqNmHfWMC5KsuIh8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "y9g2g7o1D1HIRWJ4UNPC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WesnXM8zjG0FXvTuxzWy", - "isHidden": false, - "type": "article" - } - ], - "id": "K8RvKer2YW3VRevNSmoC", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "LrjCNfl7KuzmoCSaeOTQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bU21UeCVbpVoGl0Q4wpI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "q95x5D3GFEkz7yr9hQAs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "oLMvMlHjtDzG335vbRko", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "c7HtdfOX4TFX89SG27mG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XevUacHCG9MVRWYhSAGW", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VLbNCgY1a2syul8Xciai", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ujzJNEOJSAJQLaddMgiN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JfkkxsnmcxaRL2tLhIMc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vLWpQfPBsHbn5nfKA9Tk", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "s0X5EulFemxYEkr2H6iz", - "isHidden": false, - "type": "article" - } - ], - "id": "LrjCNfl7KuzmoCSaeOTQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iCTZyut1OgpeN6TyRRxd", - "isHidden": false, - "type": "article" - } - ], - "id": "guDgyyUMUI9ui1JZvLKL", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "xiwCReJt65PYQ7mzRhSa", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Fihmgxs1pU8Ko1GGtF73", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8DPpVQTUGmC0ltHUX5ew", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SM3QWUH646ia7Jd9QOTI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "R7Vro2fnt8qDH4m6baIS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "djJLh4o3eRdopNjgTCET", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DCCGSo4jv8rhZLbuENI1", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gsuo4wMb1UOAMPaOozqF", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DqHylHcPh1bMW2pec6eL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FV2q4tl0M0FKtAnLFAGK", - "isHidden": false, - "type": "article" - } - ], - "id": "Fihmgxs1pU8Ko1GGtF73", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "vRivS3VhmlSjxzL7WNy3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tGIgFWHdGYQEsZaXR7SG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pDzu992cUkyRW6gTWqZa", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "y14LY56HunTngbz2lZIs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Qk30ZciTuXiAfTenLOUO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "m118Cx65yTtVaLBKnAy5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fPcp2LFCz8V0VzPYTiX2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iPxiCJpqMxG9nOpof8HW", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "t5padjIH5ILNkNA4TbNu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Onu7mO00LuiaynaoBQjN", - "isHidden": false, - "type": "article" - } - ], - "id": "vRivS3VhmlSjxzL7WNy3", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "IHsUqEYLTv31q6fw7yOO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KQxOTDmrKbmifVb3g6h7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "e3z8vGL5qiEOB6NZhDAI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4h5sfvoNj6NlkvJGlIxg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "IgLfJWPmj5Hr8aXa8z39", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ywh55kE9Qy8l1gcqCnWe", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Hf4KGAZDFXzhmFRoc2iX", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "swPDqH0yKj9luoLLXvWt", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HMoYfnswxu3CtmAVXYyO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "eXV3f1M1nrS0q1H73a1V", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OAVl3gYild1G3Hzsqv4v", - "isHidden": false, - "type": "article" - } - ], - "id": "A8gGSjZug5IcGt2aSjyY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kUBEIHBdWpjLQmgwjsit", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "V7QiHoCKfsIQGa5PacGo", - "isHidden": false, - "type": "article" - } - ], - "id": "xiwCReJt65PYQ7mzRhSa", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Lcd51nP0JAUR4SJZQNbN", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "y5aBD10BRA7S7xdSC5qE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Gb3rgJ62aciV5is6kFsL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9QU57KYVNCXj2EnMAToq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EXN8TcINRTQG73bsgLNI", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "kNaZ9drkUU6ptjUrTj5H", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "crwnuwGjmm6FUkZ9SXsR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EJtIM8Do5vYVRXLUFryz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ssO7v8VprvxkNZuzsBoH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zy35US8pKtMgoNIBqSwv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "b1WsF0xLklUd59rUqXmK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bnX5d2zkmfbB91xVuYxj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "LXGzn0AZlbL6nytPBRvd", - "isHidden": false, - "type": "article" - } - ], - "id": "kNaZ9drkUU6ptjUrTj5H", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "qWSDliyAHIhNUTEUY2aS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4nKAAiDbDecErzPvNMde", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PeenNg91ITNxRS0CCBdo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PmXtAY03e3X4YHNBGI1L", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "62QAJGuTsq4t9mmAxFqn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QGSYfjG1MaLNxwH5ZtAd", - "isHidden": false, - "type": "article" - } - ], - "id": "qWSDliyAHIhNUTEUY2aS", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "wE8jgqu3IVeg67BZgFLZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "H5sbaj9tojafgeyrS9xL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0ycqTs4KrrnzvfMD6znO", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "S17gc4yEtPHZkW7ukYQf", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0HEg6E52bFA52nTMOHYY", - "isHidden": false, - "type": "article" - } - ], - "id": "wE8jgqu3IVeg67BZgFLZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WN6eKvPiwg1DowkEUEiV", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "aBFeRz8MREp5lyeLjxoP", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fRepyjXWfp9Jl6jdLTSd", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "U1l4GKcnnw0OYOitsF51", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ngzpK8nuE4uDyB0Fl2KN", - "isHidden": false, - "type": "article" - } - ], - "id": "Ps4pE3gZlUbgCuQbeMjp", - "isHidden": false, - "type": "article" - } - ], - "id": "y5aBD10BRA7S7xdSC5qE", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "cgYsxNJLnznUeQhTKoib", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "G0x9LrIeJiRrPvrmp0rG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xFnn2HB08UkH8de9Tteu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YKo4oobXjgl81fQedz2v", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nEeMl2wD7dgOv06s9Xpu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9DTTnVPLgWn1A0jWbKJH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "y41b3D24ud7fcQvkuesu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KDbuGJX62Gh2xNofnWRe", - "isHidden": false, - "type": "article" - } - ], - "id": "Z1UZH4KrKhcHbd0s43YP", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "fGk9j4Qm0eSwLfRIjsbf", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nc4qXQB2quVPB703xSRB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DzgVi7fLVzx9VsM5E3Bc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "cX1fT0GLX1lgOtwmsBvD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "d1c1tEownw9K7XnbJwKf", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Dgm3OinhPwOJsbeBzoqG", - "isHidden": false, - "type": "article" - } - ], - "id": "fGk9j4Qm0eSwLfRIjsbf", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "7x5CARfJ50NnRGmtH1OF", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "i0LRvFf7tX0byHiqzt6c", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kp9AVlkWCpIyzGA9bgv5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xU4zOQlIc74rnY9dtuJ3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UEpmXc58lKJ7Ze26O2Nw", - "isHidden": false, - "type": "article" - } - ], - "id": "7x5CARfJ50NnRGmtH1OF", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "0uVhjxCDrSd4wDdg5ABG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "M5xGQgfbYpra9dH6YCeX", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NhwKkMK8Dm5O0R6FNIc0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TKDIpobATuuZ3ZQQOWLK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "D2ALKaL1SYGJ3AGnVj3p", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "K4IEkCBG7H1OIKqgDKdg", - "isHidden": false, - "type": "article" - } - ], - "id": "0uVhjxCDrSd4wDdg5ABG", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "qTR8DnM0n9jautcUjV9d", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "VY8dLNp9Cw1fqn7beEl2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kua41nd4OjjeeMioNbZo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "m92xKFpppYfmKl3qCRXH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6OrM3phLsYDzx2ZhnTTY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2UPMEBrpaHy0HyMz8TtP", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WwK84eMDFX1H8aikUdc6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ERvRbAndqXvoYydR3IFz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iEMKEDOX2r5lzbmK4obM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ib0u3Q3cYCsvRxgmsyc2", - "isHidden": false, - "type": "article" - } - ], - "id": "VY8dLNp9Cw1fqn7beEl2", - "isHidden": false, - "type": "article" - } - ], - "id": "qTR8DnM0n9jautcUjV9d", - "isHidden": false, - "type": "article" - } - ], - "id": "MqxzRGsa84iJqLSgfCww", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "CCq8RqnJgScqXoLZ32X5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "BHCsGKZOgYkR7RkCcOLi", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Vi4rrvSo4EHmuE3DvzQa", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "uky4dKGVjU6vw4vf8xmf", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "IKSMC5XkwYPMWJN8svx8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DZm93YPVyd0iTcdYZju7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "90TDSnTZefZMIoAiPxlx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Dnl9zA75PICfLW8w4UzG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Ha3lLKUYkV8z2KlfDgPQ", - "isHidden": false, - "type": "article" - } - ], - "id": "CCq8RqnJgScqXoLZ32X5", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "oj65tj5ooZoYBZ7LOCxR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9Bslg2dvTvBMvlZxazK8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EMpevYGtzSiQd6tArYbE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DZYPh7TkUK6AakSgPijv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EJgkyRjP8sawMcwI3iL0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "s4D0xD3XOYeIJWZUDi5J", - "isHidden": false, - "type": "article" - } - ], - "id": "oj65tj5ooZoYBZ7LOCxR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MUk3u2ANonFboe9RWraj", - "isHidden": false, - "type": "article" - } - ], - "id": "oj65tj5ooZoYBZ7LOCxR", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "QrZWeXm5pewYJbI9SWJJ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "APorvE18sh5M0iW7OiOi", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "z3XRlBmSrSfpticSuGvE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ouKlDnJKcibz9tJSnISc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zeOkTTaBSIcRtAC3uOLr", - "isHidden": false, - "type": "article" - } - ], - "id": "APorvE18sh5M0iW7OiOi", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qu81HU71NtvtrTJBRdVD", - "isHidden": false, - "type": "article" - } - ], - "id": "QrZWeXm5pewYJbI9SWJJ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "zvUe1sLhP62w1WwhMly8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QPWzxcNgmNQIMKMHax2b", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GuxR84Lx9zTjrXTxIgAg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0DQhKP006V2An5abza3Q", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nMDhv7DNWofxYuALRaww", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9oVPuSz2TAYTZiK6bayU", - "isHidden": false, - "type": "article" - } - ], - "id": "zvUe1sLhP62w1WwhMly8", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "ktUKcDGk656fDVjZF1YW", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ulKBVt0GjhUSG7qBAG1p", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zY55fmhRQT8sUuZybak0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lE5L8f4QE50jjgjs1V60", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "J7RiN52vrOsHil8N5FMs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZTZzUJCKJwXlM3wHubkB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9dGFZVQcmaAXYB7jeGbZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "swCnZditTPwUu5tFnnyM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Bon5iKI2sU0QSuwV76dN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "owj8jx3RCtR41oLeSbGi", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Png15Ph299d9gyk5aHcr", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "AISRmQd10YXu0Uah6fnT", - "isHidden": false, - "type": "article" - } - ], - "id": "ulKBVt0GjhUSG7qBAG1p", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "OUvzajNW2astOdMjnARx", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "de6PiDkJ3AEOQkXYs5dl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SSpOQWyx9ETRfji9Nv6p", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Jfkk1FcCzhGLV9CogqjD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3mbIhRrytPkj8nJTHfm7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "R2afxHCdXkJjQTvONtJG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CvbYQR8QclxC1YBSBFDm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "eDFbrJOSRrIpVWKeVNUd", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4XBcIJYWNIbrbNI1dK5v", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DMvSmoxNf3RspIG7Alf8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "v4EkvsaaDOoaSlsHgCC2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8hYT2CTQxBHA0fGKppaJ", - "isHidden": false, - "type": "article" - } - ], - "id": "de6PiDkJ3AEOQkXYs5dl", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "jLDDw3rErZvrpHk8dwKB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kALnML6J5JpyCcqxEYek", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yNYjs4toj4liQebAcASo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vCAqm1MTfBcfl3OgcUmv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "i9opvZvxxduVx2mRfQvd", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SGPsZzTtc5Oy3O7JMElD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WDchVD7i6NmB1HzmlpKq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "S8OUD6cYgJBvDle0BJe5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pcguPoxrczaAsHKSMgK0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "G9MqGK7UrH5gFQXVUwra", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "98j7upKWW5400IiEudM9", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "uwsHyvJMdXcstJICsv7K", - "isHidden": false, - "type": "article" - } - ], - "id": "jLDDw3rErZvrpHk8dwKB", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Ds0qGWak7ACDcyUYm02Z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "D5ezorw2fRP4yRpwqTgU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "rPwq6NvsrqeVEOxWMGwZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PmYLn5oKeCne8Syqyz8x", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ep3kyTgjULzojvQsBWwa", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1cZAhuxN2vpoZjU93LRI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5ocvffETEhTXUZQ2zUd2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NkwEmEODLtp6o3MVFjed", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "t8fO2sVIsv8ycpLexOmN", - "isHidden": false, - "type": "article" - } - ], - "id": "Ds0qGWak7ACDcyUYm02Z", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "5UsEtmuhCR0SwLBFgs0S", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "sdOn5ngtwayoRZjXvhr5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3O5UWMMyVwxqVbOpsKKU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "u2sSO36QVlpfWd80kD1S", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vot1dJVwDErY1mdvjd1M", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Ll53rHTHcV7p3XDMChoq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YeTmopP3cDFOCJaNsg1x", - "isHidden": false, - "type": "article" - } - ], - "id": "5UsEtmuhCR0SwLBFgs0S", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "BQhATioccNUuzLrWiUv2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fKHKQnwvOrDcIEAqDiBr", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "B5jiwPas0lEusCgRNggj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KgkJPo8TZOnf4rGveWqw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DEuztGcX4ldXc50a8ilj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6nn7J7qftJLadMbb0ZA3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xUYwoJq6yvTQn5DGasZb", - "isHidden": false, - "type": "article" - } - ], - "id": "BQhATioccNUuzLrWiUv2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "v3FwQAlcn693pAjEYOg8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PidAkz167o59PF3dRsGu", - "isHidden": false, - "type": "article" - } - ], - "id": "OUvzajNW2astOdMjnARx", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "ooQSbVBgmegu2sUrFNnM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "BuLov9oQGD7Hy1gCKXOk", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QhsezyqFmdXWIMYsY7PD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DuIC2WTlpGf1BoXawfZU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "G3p1oJM4rbN8KcBdigSS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iTVz29UttIRjTZUt3Xhv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9ZKdGxqAO4oGqC2CAaTR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "v8xUEpBzh6yrqZbG83r8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UDyKHy16zEN1gUQgPFMx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xmFSyTYir95iy4q7JWiv", - "isHidden": false, - "type": "article" - } - ], - "id": "ooQSbVBgmegu2sUrFNnM", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "QwS029jVrUsoB3haWqRj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "jYWoKrPwoLca4k6gZmcw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "aAWtDs7Qx19xnfLdiHav", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bQ0RMv9ocsMcE6fsxBY7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FhFSFZDDUtrgH47dKUj0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "17aKtDZVtbRzI7DqVUR0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1cDi0LfVATRcExo77epZ", - "isHidden": false, - "type": "article" - } - ], - "id": "QwS029jVrUsoB3haWqRj", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "OGXX9EAKiTNx3SWJANOV", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "V0BKETipMIIgIEUWjJQh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZiYOdISco6oVkIx8r5dD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pMIUipt7ohuSD3aH9lRm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iDtEZ8nfwRoo52Kbelaa", - "isHidden": false, - "type": "article" - } - ], - "id": "OGXX9EAKiTNx3SWJANOV", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "8xsLhJGvBxzA7zZuW8jd", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hFg4oTmfJattcLvUdeqM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Rbch6iM9uWq9y8EVEIdI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5qGZWSkpUl27nu54kJww", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WZHJwm54gDoMN4t07aLz", - "isHidden": false, - "type": "article" - } - ], - "id": "8xsLhJGvBxzA7zZuW8jd", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "uPGYdMLwfMicOD5Y5zNi", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JId7Mp8yPkD44hgMIm1A", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "n7sQpmFskzyvHgCR6LPr", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "l6Z9i5P3fwSXJkYcAjzb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1UnDOzJ8PRxb8dWyafEk", - "isHidden": false, - "type": "article" - } - ], - "id": "uPGYdMLwfMicOD5Y5zNi", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "TWYIanrQ9eH6ndpmXHjj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2e18RY2YrjVPWvAQ0ABe", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OthPOBvNbJhLSakIEG0b", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Wf30iAd4wJ3IBYgmEX89", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "IOXNYML8sgTIZ8KC1tSr", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5q9x8VMtuVsxkU2R8Riw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "uqRsb2XTa1zyssB16fwY", - "isHidden": false, - "type": "article" - } - ], - "id": "TWYIanrQ9eH6ndpmXHjj", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "0kPuGOCRouag86sY6S5K", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VMlgTruQoNokQbjgSpBL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "amjHh01L81TGDviYvhWF", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UEttiivoP80S8Rbnw0WJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UTnogQHKP04Aq8q49NLl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YhmTkKcrEwLV9uhWAKjM", - "isHidden": false, - "type": "article" - } - ], - "id": "0kPuGOCRouag86sY6S5K", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xIr7CvUxzIjxT7m3YRnK", - "isHidden": false, - "type": "article" - } - ], - "id": "ILA5WvOpjLoRp8xYYnad", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZsFhTBEZ3cpk77qN8OtD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "h7ZggrHuwkNL89c9rpeK", - "isHidden": false, - "type": "article" - } - ], - "id": "Lcd51nP0JAUR4SJZQNbN", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [ - { - "children": [], - "id": "sn0WClL2i4bRhscx2fVb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "RmL12MrgCYYclH2jnBsJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kcWUGLEBRbtM0ALtMoQ6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ul5D4b5noS4DWjGfyJoH", - "isHidden": false, - "type": "article" - } - ], - "id": "sn0WClL2i4bRhscx2fVb", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Nl3nJQzHlPUGbxWiR3LU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kEgBQKJhqdSAQuEFhevG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NpmJ7i3PEptUXS8qOcGz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "oe4SgUAqiBG5pzKIb1MV", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VqyL372mgvIcwxOXiZ2l", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QLZoq2smerrzlgLeMcXe", - "isHidden": false, - "type": "article" - } - ], - "id": "Nl3nJQzHlPUGbxWiR3LU", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "S1QOqRUq19u1sLmvKVbg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0cYJ2Ivb9anCANbjhrh3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "d7wzuMK7HFdlnQZQMIcb", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5aK7wpp1yShRiPB2ppWQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KeBrEFQU6M3UDW2o2tAV", - "isHidden": false, - "type": "article" - } - ], - "id": "S1QOqRUq19u1sLmvKVbg", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "MiIBxGUy4D5WuAYZt4m5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JRxRxs42MLGb2TdJeWx2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Pv7Z5MzMPFaIqMM19EUl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HtMqMn1oEkJAxdT4bAda", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "LovFYwXOQTXwe8KkhYIn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Q4wWvMxuaVHZKRbjucTT", - "isHidden": false, - "type": "article" - } - ], - "id": "MiIBxGUy4D5WuAYZt4m5", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "zLGMEoaqWjePckB505Ir", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "rIo7YwHyPVWVn5mcanq6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "R2Us9gj90N2n146RbSIZ", - "isHidden": false, - "type": "article" - } - ], - "id": "zLGMEoaqWjePckB505Ir", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CAa5oLlv2Jxx5rZrJhu6", - "isHidden": false, - "type": "article" - } - ], - "id": "DyD7lPsK8piP1nNjvNJw", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "3slWwbXnLPFEhqPvuqoZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JPKwDoPAUvuPdgD0mj3E", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gsUuXRkUgCxG0QrnB5Tq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qUg9PkL39Vv516mIiCvs", - "isHidden": false, - "type": "article" - } - ], - "id": "3slWwbXnLPFEhqPvuqoZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yeDyCKEuwwtTX9qYf6Yz", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "YvT2MT5VfDaQUQocspDp", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "rkD92GTX6HsGcu8HnX63", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lgASdNGLl3AP4dTF27yI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kjIu3ythel3AusZPKwDA", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YzDgxr8QTfAcM1x86ke4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vBU4k9G0neuMXWMwZf9h", - "isHidden": false, - "type": "article" - } - ], - "id": "YvT2MT5VfDaQUQocspDp", - "isHidden": false, - "type": "article" - } - ], - "id": "3slWwbXnLPFEhqPvuqoZ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "sWKRZDw4EyrL8O35btZT", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "h1FMrZQHC8Gldzq7R3Wq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "vIqniQLtAQwc3C6I7tuq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "W2zIgCqJVb5afYqB0wK5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Wn3UsXVCAIudSmzGRqg4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ISAFC8CZwTwsNhXp3XzM", - "isHidden": false, - "type": "article" - } - ], - "id": "sWKRZDw4EyrL8O35btZT", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "jMIWRYBN2SBI9Qt1WyjE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wagt4XnpIw9bcM24orgT", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GJEJ8QTPGeFz1zBJmSTn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Qn5reeYowdmzAlNKrYw6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6DDAi0orhmmZiwZpMQLD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KajZjyMUSvCRzv5M3g8S", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "83JmIQYQ3vCogYeA52H4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6eswpfgIDZS7qEZoQhdc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lUhF2ay13kGdTLaJ3koo", - "isHidden": false, - "type": "article" - } - ], - "id": "jMIWRYBN2SBI9Qt1WyjE", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "5x2Dz1NjhzXbQkoZqujl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MWdFfAKz1x9nvwSkzYJu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "LORkqr8UBsEJ5W6g6xwH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TcmaHrXgbvZp0jFG7RV7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NX8yWtaXsD1aJqQX5ovG", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dIwuZo5DNZy4jCMScrBe", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zRhaudbeiL4uu2gFEIsa", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qnbx9djEurh2V9avZibp", - "isHidden": false, - "type": "article" - } - ], - "id": "5x2Dz1NjhzXbQkoZqujl", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "noFzQNvJMQXYXQuc8udY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zh3cnJ6zugYhI5cC41D0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OlhhxDZ383kRu2EikBZr", - "isHidden": false, - "type": "article" - } - ], - "id": "noFzQNvJMQXYXQuc8udY", - "isHidden": false, - "type": "article" - } - ], - "id": "sWKRZDw4EyrL8O35btZT", - "isHidden": false, - "type": "article" - } - ], - "id": "DyD7lPsK8piP1nNjvNJw", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "dkNaDbo7hbW2rhq6UhH8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FspD8ai0HbUvjggdZiD3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tVvsPiw7wFAkR6nB68HD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Vm6ewKsUoi9Ao5w5lU2t", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "EEVrSEtFSXQCUpWztBwH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Fva58i72VNpYWNeVr3bR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hZRDo74ezacHRigKGxat", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "6vvnuneJwVgx769v1uRK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "cvnS9yELQ7s0aKELaFVZ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "U5hlcD42G33YlUKhXoOS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Ocy7KJ1P96bN4CxWyJbD", - "isHidden": false, - "type": "article" - } - ], - "id": "uARdIeyprtD8ZqVSyvPt", - "isHidden": false, - "type": "article" - } - ], - "id": "dkNaDbo7hbW2rhq6UhH8", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "ZkxOnOpqZiRV8IzoxFv8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "t5lOENbYNPXCArnqzNCo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "itvIz6JTaF7fL1cY6t07", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ItgcqUUsqmT4XlF76i5A", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "C0BsKx7aKqSYOUWLo054", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lhxikNQdv40ll38Xsyw5", - "isHidden": false, - "type": "article" - } - ], - "id": "ZkxOnOpqZiRV8IzoxFv8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Rq7ksyQoyKhLGjRa7BC0", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "xSRJpiizw3soXlhuFW6E", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VXnnflW9nmk7oxs7OXy8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SrgWGvaduhLeBaqm7UH8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yAVDsBA9Mg3a60cWKycl", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yGeG0hcVhneH5lWr7dvW", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "s4i2rJFdKlryy8PBR8KM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9joU4OAcP1WjD1ehPyuQ", - "isHidden": false, - "type": "article" - } - ], - "id": "xSRJpiizw3soXlhuFW6E", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "SsugrxjnMPxlokghkK5k", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2QeYURqoDXrIPOwhJCed", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZoHU1zBJQ247afxpdGfz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WtIp6DJhDyr3nRHxccHz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DR4BmKH8oSick2XIpI8M", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9XY7rpKAGXvnxXfDQmI1", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HftLDwd2Fi3Tsh7LcpLM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ICMkhqin7eaHsTbE7QSj", - "isHidden": false, - "type": "article" - } - ], - "id": "SsugrxjnMPxlokghkK5k", - "isHidden": false, - "type": "article" - } - ], - "id": "dkNaDbo7hbW2rhq6UhH8", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "FwxPRSdcTDETx9TwjFgc", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "lHncJVyS8TBP9qPVtNfy", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XQ3D4NEYfsKYzLn6eZav", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HohiRIxO2cPKCaZjDc2k", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "azZwoe6uJnrdNHm0eeBJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Dt6X90KvmhkcIdl6x7wL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dXQcoNTTenM57phJFXIY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OvcwtxqGA3pBrogiTanu", - "isHidden": false, - "type": "article" - } - ], - "id": "lHncJVyS8TBP9qPVtNfy", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wmNoBcHehYKkUhU7kfOZ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "uIS8lwOzndtedMmAa7pI", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hBGdBrNuNoS26VVwhcE7", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wFOLhzxBGzQa5biqwa91", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WjopIUMqzA470YHe3e8l", - "isHidden": false, - "type": "article" - } - ], - "id": "uIS8lwOzndtedMmAa7pI", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "BudMuzldV7t5hc76eHfS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YKIMRJosAtJIOs6fCLEB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "OZPWnRPHbETJ63d8ivfp", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xgnkec0rGSYPEBSogPgD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GulGxhMa3laY9WE1jiNC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pB6tN8Q3UlGOl3TRLNCc", - "isHidden": false, - "type": "article" - } - ], - "id": "BudMuzldV7t5hc76eHfS", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "ZCgqQgTQfUHPaa9Yz9CK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yyBYadEoyFoQjR1ViFCB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FkdnXEUK1gzpPOUmpC3c", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8jfYXhTmT2ybX7NyvBmv", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "E3GhwFMgoIUk5JNV9chk", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5a3VQ5hUMsEsc4AQ6qKu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bwTDERfX1VijVddM1xJx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "PWflCvywC06Mvet2n86B", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fxzFMhWTwNk5Jr4zpXB0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hcVGaxQ4tvYPeNkYSm5v", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qvjYGaWZcgOX2lpDqR0n", - "isHidden": false, - "type": "article" - } - ], - "id": "E3GhwFMgoIUk5JNV9chk", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KPvHZeyFgmZ5Ol0x5feh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dmAcalxXTaVY5WOLQAdL", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CV7G2mQeGfiDwYhJ48a6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ZKAvncNvuRWHi5XEzvAv", - "isHidden": false, - "type": "article" - } - ], - "id": "ZCgqQgTQfUHPaa9Yz9CK", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "BWHM8rRssV6evz5AlTiB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tKqsxmUYSGOxbyhPLkGs", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "RqY5NYAeE2oS2zfuxR3z", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "HYpCKM5zqBXPs3LrjSKZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5PtrMfLX6ZJj8tDnI5p3", - "isHidden": false, - "type": "article" - } - ], - "id": "HYpCKM5zqBXPs3LrjSKZ", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "BhFm7uJsbEPlvT2iCJYd", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "fgzQOLvG7mXdBgustZnd", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2CiiQ4JwsaY2u04kXln1", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "x6J1r9xziBT4py8iVh6z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bCc5s5LQ6VbKcP4yHcQR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zsRs9adOr2p7PM7VQ9Xz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hUmfOa2jpsi3rr0QzLzs", - "isHidden": false, - "type": "article" - } - ], - "id": "BhFm7uJsbEPlvT2iCJYd", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "DUrwsO7pisFiszhISfn0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Zd4ljumJnxsXJ8qg42X0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "nPXXO2hawi8eVtqJmUpJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "1HvcW5D5qncdV86nDEPS", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "RixgswqDajhM7xhADARx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9GADFIg16B1gFxQcBn64", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FQH4hXn6a7JmiqeM5Ows", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qAxZf3ohlFTjI6B4gjY5", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qIaxgy7dCJR1hkbPA9YR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "e3fi0oRCbY0EMROfhC63", - "isHidden": false, - "type": "article" - } - ], - "id": "DUrwsO7pisFiszhISfn0", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "jUwQXLLI1nAwj3jMlIcP", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gcpDo7HZKuplGOLjWT5Y", - "isHidden": false, - "type": "article" - } - ], - "id": "jUwQXLLI1nAwj3jMlIcP", - "isHidden": false, - "type": "article" - } - ], - "id": "BWHM8rRssV6evz5AlTiB", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "1FEgWCpRIvYkhOkx58TN", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "xR1AhNgh352BlKA3oeuB", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8kKhI1f4LCrPzBgF91OE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "N9fb6OarVlFSMOUrrltF", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "eO8nBjEnMMkq02PDDfta", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2gXE6eNGmXUCdzaNhtsr", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yP6rRvNZslbgSKB4m8el", - "isHidden": false, - "type": "article" - } - ], - "id": "xR1AhNgh352BlKA3oeuB", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "PUSWXTEHMfURmpc7z5fA", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "KoEf4uxKA7s6O9cp3LKD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "k4kSNTF6u5VqjgqgWV75", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qD3wgzVRwkxLzazh1rk3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "mA4cr66Hok2cPqIvntyU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "n6oVegyk1nNJ9bxR3js8", - "isHidden": false, - "type": "article" - } - ], - "id": "PUSWXTEHMfURmpc7z5fA", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "cSMzWQnkDH4c7dQHNeQg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Bbn6Qynif0MHPrd5zhMx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "JfxxXyB7zwJkW2kbXjJY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "rLZuoYaJYbFEJZc01RFg", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "F8JKxTfad0h0Q0QpAdQK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "2KLmaTaYYC2ZKp1mxOii", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XnbMdey4Gq7hoAWfSVSN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "t3qwuT0zwJ2JTIZbJwFh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3qjsO9mwnKwDTXbKrEQM", - "isHidden": false, - "type": "article" - } - ], - "id": "cSMzWQnkDH4c7dQHNeQg", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "uudH25ji3xVMJ9SnYxRh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YG6neFfh5laFnZ0GMRsp", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "mpEXDI21xLwF062JqET4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ANwuqrAGCpyW7qWOUgI6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zhyzhhQ1W29tttJl7JUx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0EpsGtaEb1oCcxnfizjA", - "isHidden": false, - "type": "article" - } - ], - "id": "uudH25ji3xVMJ9SnYxRh", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "sG1zrZxJLB5V39GmmQV4", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "qZivOqw0GsEVy64PQaO3", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UeIiGh1aixdeR6mBhjBM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CcYnicJZUJCpEEdbzVSE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HdWqKoE16h4upD5pYBZt", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VdWDD2E2vsUPsOuztJMx", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "E4ZirjQ1fz59wMmmd5ZN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "VXCuXleYajKsI5rL3D6f", - "isHidden": false, - "type": "article" - } - ], - "id": "sG1zrZxJLB5V39GmmQV4", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "boQV3pmCAkAcUtGaFen9", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5Zs3SqpqsuxjB4isxnK2", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xQudRJinxXCLdvJ4lMZ8", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ujQQo8KjkKYIpqwEX3EH", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "q7Hz1aEkXOzgLNajMc0h", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "m9OFL8CvH5qmgvkYTFnm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "uvzkHAsQDCldswYN8K53", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5TeiKoPtm1YvQ0ahgho6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "xEZgDoP3Am3kAsOfpM1j", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "HLSp2ZsTnvTW6UsC6khg", - "isHidden": false, - "type": "article" - } - ], - "id": "boQV3pmCAkAcUtGaFen9", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "QGD4o0d4sqGH93zsSd5Z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "hGSkeuZ3a9B9rgN6PmsU", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "CjRstf46XoYuP5k2ic6L", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "lP9U8qB6vI0a0JHzT8Jn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "UMFbPKAPa2EJ2ZXGeab6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0tZ2WTdQg3v3Jx1jdRlo", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "QqpN4D1ubpDTqvj1Wwkb", - "isHidden": false, - "type": "article" - } - ], - "id": "QGD4o0d4sqGH93zsSd5Z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "goOfYBSHWcyZHpbuDRuv", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "iJY2yHzQI8GawEBVUok6", - "isHidden": false, - "type": "article" - } - ], - "id": "1FEgWCpRIvYkhOkx58TN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "9bIGnLRFRl3m3E6Fo5by", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GzncGURL6yc5JrEmvGwu", - "isHidden": false, - "type": "article" - } - ], - "id": "FwxPRSdcTDETx9TwjFgc", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "OUoOb4VajmcsSpfG53sh", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "Rzisbds4MqCrq9LieSMM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MdAiUTaRujaiHGyl9hNm", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "8nU25nA2qoFNb0peKSYY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5pJcs9hmSk8cbB2mFbdM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "66rhdBwOEeqpOdz42JPj", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "veopB625eP1W1zP9CzJq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "zDMCV2IUs4HtyfeSrTQh", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "c7N1NAkHQhuG043PaqB5", - "isHidden": false, - "type": "article" - } - ], - "id": "Rzisbds4MqCrq9LieSMM", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "IBzv3Ipy8JG2n8bSfKCY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "oA8EuN3sfh80d1KdbJsT", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pqYbwcluO9VsulnOwa1p", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "DVIdA3236Zu2T0BqoQ2D", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "B5nz4opGV06Uk3bKj5bu", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "stBRnH74DdeDbqmZu49a", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Sj6GOKJcCKYY4IFIxJ0l", - "isHidden": false, - "type": "article" - } - ], - "id": "IBzv3Ipy8JG2n8bSfKCY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XAlkgIxGOz2G5RMoVe8k", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "WBzDn4br5chhlxJWfK9z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "LY75gBHWH9gs884pEm9S", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pp6A0CqAzu9KUh4ihHtH", - "isHidden": false, - "type": "article" - } - ], - "id": "OUoOb4VajmcsSpfG53sh", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "vgrGM4ov0tJfd8oUUmPL", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "ctvTsZL2HkafhfKhcNgc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4ocRcv1zea6syLpp4eXC", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "dbobTWqv6FMhoJ2pXr5I", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "vAN1dutO101H88dcoPXX", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "RroEPKZsc32NpmZQuovE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "RYU9DFp7ykO5WSfBfLRY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ABqOkzniaQbJ5JMGF12z", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "yBaVjofESltNCHwu4Tof", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "0lIvi1jZMQDxwJSJjEsz", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "NGOmuuFEh3MiJJwcKuQ0", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "tFsIbrFd2GwUOsrE29zp", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "FLALDzrBbNpMnriqtKVJ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "ErNhZuS2EAogmaVI5eas", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "pTa53QRU7eQSkpjuRbVC", - "isHidden": false, - "type": "article" - } - ], - "id": "vAN1dutO101H88dcoPXX", - "isHidden": false, - "type": "article" - } - ], - "id": "ctvTsZL2HkafhfKhcNgc", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [ - { - "children": [], - "id": "0aINPpzFuvsQnjqAHURR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "YNPl7942L5RoZKTHabmn", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gwW1vgkZ9kB9S0gFXHCQ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MbW0lD6O3cPV4t5Hs4j1", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "kT5jCFsudbDfqItpRzZK", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "mEwJ0SvcaXSnlNQkzL09", - "isHidden": false, - "type": "article" - } - ], - "id": "0aINPpzFuvsQnjqAHURR", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "ma1bCwMkgbRV4YGRKMse", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "4Jn1lORYUSTgz2ODuR26", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "gVuBhG0JweeISF0vJO4E", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "XxJ8NLffsev1KXE2Pwma", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "TN5RUI0uJRv1LqzcePGE", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "3P7sABkvezDb531oJAJP", - "isHidden": false, - "type": "article" - } - ], - "id": "ma1bCwMkgbRV4YGRKMse", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "AikYYA314fegLSjk9uby", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "q9n3d1Wp7B8DnV47LXzc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "n4tHuk7tZVF0S5HpE48B", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "i4bOYlhQH0IDrKd8vkKw", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Ie1KPlIXbrOOKwjznJGp", - "isHidden": false, - "type": "article" - } - ], - "id": "AikYYA314fegLSjk9uby", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "MWP568zORdT4Y0IAaqAc", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "s63OuqRXizYZE11TZqMD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "5IBXdSSGUrpN4QY0verZ", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "7X0msVDcl8h9dgeKY1pT", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "AJYsPArMX3ScnFOR13xN", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Djc66hOQTLgX0zJqouaY", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "wUteyTbZoJyeWxguTsLF", - "isHidden": false, - "type": "article" - } - ], - "id": "0aINPpzFuvsQnjqAHURR", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "mYNJbLBooj1rCfSCBBZU", - "isHidden": false, - "type": "article" - } - ], - "id": "vgrGM4ov0tJfd8oUUmPL", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "f88guAbjBmFiMSyEABTs", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "f3hTyTLVGgqTukWYu71f", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "GEWSHfows5rgJDj8WlcM", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Xml0uocVx8nXZ6k97GQy", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "Vfm06YSV4SQrTZKOwwmq", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "SC8OR09fTdra5Tn58oyR", - "isHidden": false, - "type": "article" - } - ], - "id": "f3hTyTLVGgqTukWYu71f", - "isHidden": false, - "type": "article" - }, - { - "children": [ - { - "children": [], - "id": "qs8rFxfhlZsPT5WMyXHD", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "bdFkvtQ956qUC1yD1sR6", - "isHidden": false, - "type": "article" - }, - { - "children": [], - "id": "rvQsgSdnSzfa7ivwJ9QL", - "isHidden": false, - "type": "article" - } - ], - "id": "jzFQtvgiyhWYxH90xE4S", - "isHidden": false, - "type": "article" - } - ], - "id": "f88guAbjBmFiMSyEABTs", - "isHidden": false, - "type": "article" - } -] diff --git a/next.config.js b/next.config.js index 87e244cb68..6f470eac58 100644 --- a/next.config.js +++ b/next.config.js @@ -6,33 +6,10 @@ require("dotenv").config({ path: path.resolve(process.cwd(), ".env.development.local"), }); -function ensureEnvVariable(name) { - if (process.env[name] == null) { - if (process.env.NODE_ENV === "development") { - console.error( - `No ${name} found.\nSee the README.md for information on setting this variable locally.` - ); - } else if (process.env.NODE_ENV === "production") { - console.warn( - `No ${name} environment variable found.\nLink to your PCC Instance or set the ${name} environment variable in the settings tab in the dashboard\nIf your site does not require a backend to build, remove this check from the next.config.js.` - ); - } - } -} - -if (process.env.IS_CICD !== "true") { - ensureEnvVariable("PCC_SITE_ID"); - ensureEnvVariable("PCC_TOKEN"); -} - /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, output: "standalone", - env: { - NEXT_PUBLIC_PCC_SITE_ID: process.env.PCC_SITE_ID, - NEXT_PUBLIC_PCC_HOST: process.env.PCC_HOST, - }, images: { remotePatterns: [ { diff --git a/package-lock.json b/package-lock.json index 345417dbdd..97a763ceca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,6 @@ "@adobe/mdast-util-gridtables": "^4.0.13", "@adobe/remark-gridtables": "^3.0.14", "@next/bundle-analyzer": "^15.4.5", - "@pantheon-systems/pcc-react-sdk": "3.13.0-beta.2", - "@pantheon-systems/pcc-sdk-core": "3.13.0-beta.2", "@pantheon-systems/pds-toolkit-react": "1.0.0-dev.256", "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-slot": "^1.2.3", @@ -156,48 +154,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apollo/client": { - "version": "3.13.9", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.13.9.tgz", - "integrity": "sha512-RStSzQfL1XwL6/NWd7W8avhGQYTgPCtJ+qHkkTTSj9Upp3VVm6Oppv81YWdXG1FgEpDPW4hvCrTUELdcC4inCQ==", - "license": "MIT", - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@wry/caches": "^1.0.0", - "@wry/equality": "^0.5.6", - "@wry/trie": "^0.5.0", - "graphql-tag": "^2.12.6", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.18.0", - "prop-types": "^15.7.2", - "rehackt": "^0.1.0", - "symbol-observable": "^4.0.0", - "ts-invariant": "^0.10.3", - "tslib": "^2.3.0", - "zen-observable-ts": "^1.2.5" - }, - "peerDependencies": { - "graphql": "^15.0.0 || ^16.0.0", - "graphql-ws": "^5.5.5 || ^6.0.3", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", - "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" - }, - "peerDependenciesMeta": { - "graphql-ws": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "subscriptions-transport-ws": { - "optional": true - } - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1180,15 +1136,6 @@ "react": "^16.3 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -2011,827 +1958,36 @@ "node": ">= 8" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk": { - "version": "3.13.0-beta.2", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pcc-react-sdk/-/pcc-react-sdk-3.13.0-beta.2.tgz", - "integrity": "sha512-GgviGq5gxysaGcHW+0v3jmR+Q6Gkc89MkbLIrS5YW0X78pNix+JdT4TVAJ+wTa7xPpiBMjdW3Lis9hxgpVRHkA==", - "license": "MIT", - "dependencies": { - "@apollo/client": "^3.10.3", - "@pantheon-systems/pcc-sdk-core": "3.13.0-beta.2", - "graphql": "^16.8.1", - "lodash": "^4.17.21", - "markdown-to-txt": "^2.0.1", - "react-markdown": "^8.0.7", - "rehype-raw": "^6.1.1", - "remark-heading-id": "^1.0.1", - "unist-util-visit": "^5.0.0" - }, - "engines": { - "node": ">=18.10.0" - }, - "peerDependencies": { - "@types/react": ">=18", - "@types/react-dom": ">=18", - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/hast-util-raw/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/mdast-util-to-hast/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/react-markdown/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@pantheon-systems/pcc-react-sdk/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 8" } }, - "node_modules/@pantheon-systems/pcc-sdk-core": { - "version": "3.13.0-beta.2", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pcc-sdk-core/-/pcc-sdk-core-3.13.0-beta.2.tgz", - "integrity": "sha512-jK+rpab9MOz2KixzTf6QNDotzDh/Q+wmCv1TQKP+V8jCx43PqrxNSYqHvauDmuiIOe+D7OwUNefata3tJiSSNg==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, "license": "MIT", - "dependencies": { - "@apollo/client": "^3.10.3", - "graphql": "^16.8.1", - "graphql-tag": "^2.12.6", - "graphql-ws": "^5.15.0", - "query-string": "^8.2.0", - "typescript": "^5.5.4", - "zod": "^3.22.4", - "zod-validation-error": "^1.5.0" + "engines": { + "node": ">=12.4.0" } }, "node_modules/@pantheon-systems/pds-design-tokens": { @@ -2917,6 +2073,40 @@ "node": ">=18" } }, + "node_modules/@playwright/test/node_modules/playwright": { + "version": "1.54.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz", + "integrity": "sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "playwright-core": "1.54.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/@playwright/test/node_modules/playwright-core": { + "version": "1.54.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz", + "integrity": "sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", @@ -7120,54 +6310,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@wry/caches": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@wry/caches/-/caches-1.0.1.tgz", - "integrity": "sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wry/context": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.7.4.tgz", - "integrity": "sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wry/equality": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.5.7.tgz", - "integrity": "sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wry/trie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@wry/trie/-/trie-0.5.0.tgz", - "integrity": "sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@xobotyi/scrollbar-width": { "version": "1.9.5", "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", @@ -8595,15 +7737,6 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "license": "Apache-2.0" }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -10194,42 +9327,6 @@ "dev": true, "license": "MIT" }, - "node_modules/graphql": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", - "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/graphql-ws": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz", - "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": ">=0.11 <=16" - } - }, "node_modules/gray-matter": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", @@ -12231,15 +11328,6 @@ "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -12358,12 +11446,6 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "license": "MIT" }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "license": "MIT" - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -12389,12 +11471,6 @@ "integrity": "sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==", "license": "MIT" }, - "node_modules/lodash.unescape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", - "integrity": "sha512-DhhGRshNS1aX6s5YdBE3njCCouPgnG29ebyHvImlZzXZf2SHgt+J08DHgytTPnpywNbO1Y8mNUFyQuIDBq2JZg==", - "license": "MIT" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -12517,17 +11593,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdown-to-txt": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/markdown-to-txt/-/markdown-to-txt-2.0.1.tgz", - "integrity": "sha512-Hsj7KTN8k1gutlLum3vosHwVZGnv8/cbYKWVkUyo/D1rzOYddbDesILebRfOsaVfjIBJank/AVOySBlHAYqfZw==", - "license": "MIT", - "dependencies": { - "lodash.escape": "^4.0.1", - "lodash.unescape": "^4.0.1", - "marked": "^4.0.14" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -13972,15 +13037,6 @@ } } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -14692,18 +13748,6 @@ "opener": "bin/opener-bin.js" } }, - "node_modules/optimism": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.1.tgz", - "integrity": "sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==", - "license": "MIT", - "dependencies": { - "@wry/caches": "^1.0.0", - "@wry/context": "^0.7.0", - "@wry/trie": "^0.5.0", - "tslib": "^2.3.0" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -14959,40 +14003,6 @@ "dev": true, "license": "MIT" }, - "node_modules/playwright": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.57.0.tgz", - "integrity": "sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "playwright-core": "1.57.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.57.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.57.0.tgz", - "integrity": "sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -15896,24 +14906,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rehackt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", - "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - } - } - }, "node_modules/rehype-autolink-headings": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-7.1.0.tgz", @@ -16252,43 +15244,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-heading-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/remark-heading-id/-/remark-heading-id-1.0.1.tgz", - "integrity": "sha512-GmJjuCeEkYvwFlvn/Skjc/1Qafj71412gbQnrwUmP/tKskmAf1cMRlZRNoovV+aIvsSRkTb2rCmGv2b9RdoJbQ==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21", - "unist-util-visit": "^1.4.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/remark-heading-id/node_modules/unist-util-is": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", - "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", - "license": "MIT" - }, - "node_modules/remark-heading-id/node_modules/unist-util-visit": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", - "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", - "license": "MIT", - "dependencies": { - "unist-util-visit-parents": "^2.0.0" - } - }, - "node_modules/remark-heading-id/node_modules/unist-util-visit-parents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", - "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", - "license": "MIT", - "dependencies": { - "unist-util-is": "^3.0.0" - } - }, "node_modules/remark-mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", @@ -16736,18 +15691,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -17961,15 +16904,6 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", - "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -18347,18 +17281,6 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, - "node_modules/ts-invariant": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.10.3.tgz", - "integrity": "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-keycode-enum": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/ts-keycode-enum/-/ts-keycode-enum-1.0.6.tgz", @@ -18563,6 +17485,7 @@ "version": "5.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -19036,24 +17959,6 @@ "uuid": "dist/esm/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", @@ -20978,42 +19883,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==", - "license": "MIT" - }, - "node_modules/zen-observable-ts": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz", - "integrity": "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==", - "license": "MIT", - "dependencies": { - "zen-observable": "0.8.15" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-1.5.0.tgz", - "integrity": "sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "zod": "^3.18.0" - } - }, "node_modules/zustand": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", diff --git a/package.json b/package.json index cea9e65372..532dbd6c61 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ "homepage": "https://docs.pantheon.io", "author": "@pantheon-systems", "scripts": { - "update": "tsx seed/update.ts", "build": "next build", "coverage": "vitest run --coverage", "dev": "next dev -p 3002", @@ -22,8 +21,6 @@ "@adobe/mdast-util-gridtables": "^4.0.13", "@adobe/remark-gridtables": "^3.0.14", "@next/bundle-analyzer": "^15.4.5", - "@pantheon-systems/pcc-react-sdk": "3.13.0-beta.2", - "@pantheon-systems/pcc-sdk-core": "3.13.0-beta.2", "@pantheon-systems/pds-toolkit-react": "1.0.0-dev.256", "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-slot": "^1.2.3", @@ -110,7 +107,6 @@ "react": "19.1.5", "react-dom": "19.1.5", "glob": "10.5.0", - "playwright": "1.57.0", "fast-xml-parser": "4.5.4", "@remix-run/router": "1.23.2", "rollup": "4.59.0", diff --git a/playwright-tests/render-all-omni-paths-batched.spec.ts b/playwright-tests/render-all-omni-paths-batched.spec.ts deleted file mode 100644 index 3a0115208c..0000000000 --- a/playwright-tests/render-all-omni-paths-batched.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { test, expect } from "@playwright/test"; -import urls from "./urls.json"; - -test.describe.parallel("Page render checks", () => { - test.setTimeout(60_000); - for (const url of urls) { - test(`Page loads without error: ${url}`, async ({ page }) => { - console.log(`Testing ${url}`); - const consoleErrors: string[] = []; - - page.on("pageerror", (error) => { - consoleErrors.push(error.message); - }); - - page.on("console", (msg) => { - if (msg.type() === "error") { - consoleErrors.push(msg.text()); - } - }); - - const response = await page.goto(url, { waitUntil: "networkidle" }); - expect(response?.ok()).toBeTruthy(); // HTTP status check - - // Optional: check for a body or main wrapper - await expect(page.locator("body")).toBeVisible(); - - // Optional: Fail test if JS errors are found - expect(consoleErrors).toEqual([]); - }); - } -}); diff --git a/playwright-tests/render-all-omni-paths.spec.ts b/playwright-tests/render-all-omni-paths.spec.ts deleted file mode 100644 index e6dc64580d..0000000000 --- a/playwright-tests/render-all-omni-paths.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { test, expect } from "@playwright/test"; -import { getOmniItems } from "@/components/omni-components"; -import { OmniItem } from "@/components/omni-components/helpers"; - -const visitOmniItemRecursively = async ( - page: any, - item: OmniItem, - depth = 0 -) => { - console.log(`Visiting at depth ${depth}`, `${item.link}`); - - let slug = item.link; - if (slug.startsWith("/")) { - slug = slug.slice(1); - } - - if (slug.endsWith("/")) { - slug = slug.slice(0, -1); - } - - try { - await page.goto(`/${slug}`, { - waitUntil: "networkidle", - timeout: 30000, - }); - - // Wait for the page to be fully loaded - await page.waitForLoadState("domcontentloaded"); - - // Check if the page loaded successfully (not a 404 or error page) - const title = await page.title(); - console.log(`Successfully visited ${item.link} - Title: ${title}`); - - // For example, check if the page has some expected content - const bodyText = await page.textContent("body"); - if (bodyText && bodyText.length > 0) { - console.log( - `Page ${item.link} has content (${bodyText.length} characters)` - ); - } else { - console.warn(`Page ${item.link} appears to have no content`); - } - } catch (error) { - console.error(`Failed to visit ${item.link}: ${error}`); - // Don't throw the error to continue with other pages - } - - // Recursively visit children - if (item.children) { - for (const child of item.children) { - await visitOmniItemRecursively(page, child, depth + 1); - } - } -}; - -// Helper function to flatten all omni items into a single array -const flattenOmniItems = (items: OmniItem[]): OmniItem[] => { - const flattened: OmniItem[] = []; - - const flatten = (item: OmniItem) => { - flattened.push(item); - if (item.children) { - item.children.forEach(flatten); - } - }; - - items.forEach(flatten); - return flattened; -}; - -// Create individual tests for each omni item to enable parallelization -test.describe("render all omni paths in parallel", () => { - let allItems: OmniItem[] = []; - - test.beforeAll(async () => { - const items = await getOmniItems(); - allItems = flattenOmniItems(items); - console.log( - `Found ${allItems.length} total omni items to test in parallel` - ); - }); - - // Create a test for each item - this enables parallel execution - for (let i = 0; i < allItems.length; i++) { - const item = allItems[i]; - - test(`render ${item.link}`, async ({ page }) => { - test.setTimeout(60000); // 1 minute per item - - try { - await visitOmniItemRecursively(page, item); - console.log(`Completed testing ${item.link}`); - } catch (error) { - console.error(`Failed to test ${item.link}: ${error}`); - throw error; // Re-throw to mark test as failed - } - }); - } -}); diff --git a/playwright-tests/urls.json b/playwright-tests/urls.json deleted file mode 100644 index 7e59729395..0000000000 --- a/playwright-tests/urls.json +++ /dev/null @@ -1,698 +0,0 @@ -[ - "/", - "/get-started", - "/guides/getstarted", - "/guides/getstarted/signup", - "/guides/getstarted/team", - "/guides/getstarted/addsite", - "/guides/getstarted/purchase", - "/guides/getstarted/launch", - "/guides/getstarted/nextsteps", - "/products", - "/required-reading", - "/tldr", - "/guides/platform-considerations", - "/guides/platform-considerations/platform-site-info", - "/guides/platform-considerations/platform-security", - "/guides/platform-considerations/media-email-support", - "/guides/platform-considerations/php-platform", - "/guides/platform-considerations/terminus-platform", - "/guides/guided", - "/guides/guided/prepare", - "/guides/guided/migrate", - "/guides/guided/troubleshooting", - "/guides/guided/faq", - "/migrate-manual", - "/migrate-wordpress-multisite", - "/unwind-drupal-multisite", - "/guides/kinsta", - "/guides/kinsta/prepare", - "/guides/kinsta/migrate", - "/guides/kinsta/troubleshooting", - "/guides/kinsta/faq", - "/guides/pagely", - "/guides/pagely/prepare", - "/guides/pagely/migrate", - "/guides/pagely/troubleshooting", - "/guides/pagely/faq", - "/guides/wordpressvip", - "/guides/wordpressvip/prepare", - "/guides/wordpressvip/migrate", - "/guides/wordpressvip/troubleshooting", - "/guides/wordpressvip/faq", - "/guides/wpengine", - "/guides/wpengine/prepare", - "/guides/wpengine/migrate", - "/guides/wpengine/troubleshooting", - "/guides/wpengine/faq", - "/guides/platformsh", - "/guides/platformsh/prepare", - "/guides/platformsh/migrate", - "/guides/platformsh/troubleshooting", - "/guides/platformsh/faq", - "/guides/acquia", - "/guides/acquia/prepare", - "/guides/acquia/migrate", - "/guides/acquia/troubleshooting", - "/guides/acquia/faq", - "/migrate-cpanel", - "/guides/drupal-unhosted-composer", - "/guides/drupal-unhosted-composer/prepare", - "/guides/drupal-unhosted-composer/contrib-custom", - "/guides/drupal-unhosted-composer/deploy-dev", - "/guides/drupal-unhosted-composer/database", - "/guides/drupal-unhosted-composer/files", - "/guides/drupal-unhosted-composer/deploy-live", - "/guides/drupal-unhosted-composer/troubleshooting", - "/guides/drupal-unhosted", - "/guides/drupal-unhosted/prepare", - "/guides/drupal-unhosted/copy-config", - "/guides/drupal-unhosted/contrib-custom", - "/guides/drupal-unhosted/deploy-dev", - "/guides/drupal-unhosted/add-database", - "/guides/drupal-unhosted/upload-files", - "/guides/drupal-unhosted/deploy", - "/guides/drupal-unhosted/troubleshooting", - "/add-site-clone", - "/dashboard", - "/site-dashboard", - "/personal-settings", - "/add-site-custom-upstream", - "/faq", - "/develop", - "/pantheon-workflow", - "/start-state", - "/guides/multidev", - "/guides/multidev/create-multidev", - "/guides/multidev/access-branch", - "/guides/multidev/clone-content", - "/guides/multidev/edit-multidev", - "/guides/multidev/compare-environments", - "/guides/multidev/delete-multidev", - "/guides/multidev/multidev-faq", - "/guides/environment-configuration", - "/guides/environment-configuration/read-environment-config", - "/guides/environment-configuration/environment-indicator", - "/guides/environment-configuration/environment-specific-config", - "/guides/environment-configuration/environment-specific-config-drupal", - "/guides/environment-configuration/restore-environment-backup", - "/connection-modes", - "/guides/sftp", - "/guides/sftp/sftp-connection-info", - "/guides/sftp/sftp-development", - "/guides/sftp/rsync-and-sftp", - "/guides/sftp/vscode-sftp", - "/guides/sftp/winscp", - "/guides/sftp/port-2222", - "/guides/sftp/troubleshooting-sftp", - "/guides/git", - "/guides/git/git-config", - "/guides/git/collaborative-development", - "/guides/git/useful-commands", - "/guides/git/undo-commits", - "/guides/git/resolve-merge-conflicts", - "/guides/git/faq-git", - "/guides/git/troubleshooting", - "/guides/git/hotfixes", - "/core-updates", - "/workflow-logs", - "/content-staging", - "/guides/integrated-composer", - "/guides/integrated-composer/create", - "/guides/integrated-composer/dependencies", - "/guides/integrated-composer/ic-upstreams", - "/guides/integrated-composer/ic-support", - "/guides/integrated-composer/ic-troubleshooting", - "/composer-convert", - "/composer-convert-from-empty", - "/upgrade-drupal-with-ic-to-latest", - "/automate", - "/continuous-integration", - "/github-application", - "/github-actions", - "/guides/build-tools", - "/guides/build-tools/create-project", - "/guides/build-tools/pr-workflow", - "/guides/build-tools/configure", - "/guides/build-tools/extend", - "/guides/build-tools/tests", - "/guides/build-tools/merge", - "/guides/build-tools/custom-theme", - "/guides/build-tools/update", - "/deploybot", - "/jenkins", - "/behat", - "/guides/quicksilver", - "/guides/quicksilver/install-script", - "/guides/quicksilver/hooks", - "/guides/quicksilver/variables", - "/guides/quicksilver/asana", - "/guides/quicksilver/jira", - "/guides/quicksilver/trello", - "/guides/quicksilver/troubleshoot-quicksilver", - "/guides/backups", - "/guides/backups/access-backups", - "/guides/backups/create-backups", - "/guides/backups/restore-from-backup", - "/guides/backups/code-archives-backups-log", - "/guides/backups/faqs-backups", - "/guides/local-development", - "/guides/local-development/configuration", - "/guides/local-development/lando-wordpress", - "/guides/local-development/ddev", - "/guides/local-development/wordpress-phpstorm", - "/guides/local-development/drupal-phpstorm", - "/guides/local-development/visual-studio-code", - "/guides/local-development/graphql-requests", - "/guides/local-development/cygwin-windows", - "/guides/local-development/continuous-integration", - "/guides/local-development/jenkins", - "/content-publisher", - "/go-live", - "/guides/launch", - "/guides/launch/create-site-launch", - "/guides/launch/plans", - "/guides/launch/domains", - "/guides/launch/advanced-curls", - "/guides/launch/configure-dns", - "/guides/launch/redirects", - "/guides/launch/launch-check", - "/guides/launch/next-steps", - "/guides/domains", - "/guides/domains/dns", - "/guides/domains/platform-domains", - "/guides/domains/primary-domain", - "/guides/domains/custom-domains", - "/guides/domains/vanity-domains", - "/guides/domains/hosts-file", - "/guides/domains/domain-hijacking", - "/guides/domains/domains-faq", - "/guides/domains/troubleshooting", - "/dns-providers", - "/1-and-1", - "/route53", - "/cloudflare", - "/dreamhost", - "/dns-made-easy", - "/dyn", - "/enom", - "/gandi", - "/godaddy", - "/namecheap", - "/network-solutions", - "/relaunch", - "/http-to-https", - "/platform", - "/application-containers", - "/php-runtime-generation-2", - "/horizontal-scalability", - "/single-application-sites", - "/guides/php", - "/guides/php/php-versions", - "/guides/php/settings-php", - "/guides/php/wp-config-php", - "/guides/php/wordpress-sessions", - "/guides/php/php-errors", - "/guides/php/php-slow-log", - "/guides/php/deprecated-constructor-notices", - "/pantheon-yml", - "/nested-docroot", - "/server_name-and-server_port", - "/date-and-time", - "/outgoing-ips", - "/client-ip", - "/guides/logs-pantheon", - "/guides/logs-pantheon/access-logs", - "/guides/logs-pantheon/automate-log-downloads", - "/guides/logs-pantheon/nginx-access-logs", - "/guides/logs-pantheon/faq-logs", - "/multizone-failover", - "/regions", - "/external-libraries", - "/email", - "/sendgrid", - "/rerouting-outbound-email", - "/cache", - "/object-cache", - "/object-cache/cli", - "/object-cache/drupal", - "/object-cache/errors", - "/object-cache/faq", - "/object-cache/remove", - "/object-cache/wordpress", - "/object-cache/wordpress-deprecated", - "/apcu", - "/guides/global-cdn", - "/guides/global-cdn/experience-protection", - "/guides/global-cdn/global-cdn-caching", - "/guides/global-cdn/test-global-cdn-caching", - "/guides/global-cdn/https", - "/guides/global-cdn/global-cdn-faq", - "/guides/agcdn", - "/guides/agcdn/agcdn-features", - "/guides/agcdn/agcdn-wafio", - "/guides/agcdn/submit-request", - "/guides/agcdn/agcdn-faq", - "/clear-caches", - "/drupal-cache", - "/caching-advanced-topics", - "/cookies", - "/pantheon_stripped", - "/cache-control", - "/drupal-cloudfront", - "/guides/fastly-pantheon", - "/guides/fastly-pantheon/connect-fastly", - "/guides/fastly-pantheon/fastly-amazon-s3", - "/guides/fastly-pantheon/fastly-datadog", - "/guides/fastly-pantheon/fastly-new-relic", - "/guides/fastly-pantheon/fastly-sftp", - "/guides/fastly-pantheon/fastly-splunk", - "/guides/fastly-pantheon/fastly-syslog", - "/guides/fastly-pantheon/fastly-faq", - "/guides/mariadb-mysql", - "/guides/mariadb-mysql/mysql-access", - "/guides/mariadb-mysql/mysql-workbench", - "/guides/mariadb-mysql/database-workflow-tool", - "/guides/mariadb-mysql/myisam-to-innodb", - "/guides/mariadb-mysql/kill-mysql-queries", - "/guides/mariadb-mysql/mysql-slow-log", - "/guides/mariadb-mysql/database-connection-errors", - "/guides/mariadb-mysql/mariadb-mysql-faq", - "/guides/filesystem", - "/guides/filesystem/batch-files", - "/guides/filesystem/large-files", - "/guides/filesystem/files-directories", - "/guides/filesystem/tmp", - "/guides/filesystem/troubleshooting", - "/drupal-s3", - "/guides/wordpress-developer/wordpress-s3?double-menu", - "/pantheon-search/solr", - "/guides/pantheon-search/solr-drupal", - "/guides/pantheon-search/solr-drupal/solr-drupal", - "/guides/pantheon-search/solr-drupal/custom-config", - "/guides/pantheon-search/solr-drupal/solr-drupal-7", - "/opensolr", - "/guides/redirect", - "/guides/redirect/https", - "/guides/redirect/primary-domain", - "/guides/redirect/php", - "/guides/redirect/advanced", - "/guides/redirect/mobile", - "/develop-drupal", - "/drupal-cms", - "/supported-drupal", - "/modules", - "/drupal-launch-check", - "/drupal-configuration-management", - "/services-yml", - "/drupal-cron", - "/drupal-caching-views", - "/drupal-from-dist", - "/drupal-broken-links", - "/cloud-optimization", - "/develop-wordpress", - "/guides/wordpress-pantheon", - "/guides/wordpress-pantheon/create-wp-site", - "/guides/wordpress-pantheon/migrate-existing-wp-site", - "/guides/wordpress-pantheon/wordpress-launch-check", - "/guides/wordpress-pantheon/plugins-recommended", - "/guides/wordpress-pantheon/plugins", - "/guides/wordpress-pantheon/wp-optimization", - "/guides/wordpress-pantheon/wordpress-developers", - "/guides/wordpress-pantheon/wp-security", - "/guides/wordpress-pantheon/wp-content-management", - "/guides/wordpress-pantheon/troubleshooting", - "/guides/wordpress-developer", - "/guides/wordpress-developer/wordpress-best-practices", - "/guides/wordpress-developer/wordpress-development-versions", - "/guides/wordpress-developer/xml-rpc-attacks", - "/guides/wordpress-developer/wordpress-login-attacks", - "/guides/wordpress-developer/wordpress-cron", - "/guides/wordpress-developer/wordpress-s3", - "/guides/wordpress-developer/wordpress-gcs", - "/guides/wordpress-developer/wordpress-broken-links", - "/guides/pantheon-search/solr/wordpress-solr", - "/guides/wordpress-developer/wordpress-secrets-management", - "/guides/wordpress-developer/performant-translations", - "/guides/wordpress-configurations", - "/guides/wordpress-configurations/plugins", - "/guides/wordpress-configurations/mu-plugin", - "/guides/wordpress-configurations/wp-cfm", - "/guides/wordpress-configurations/wordpress-cache-plugin", - "/guides/wordpress-configurations/wordpress-custom-code", - "/guides/wordpress-configurations/wordpress-font-library", - "/guides/wordpress-configurations/installing-updating-from-third-party-sources", - "/guides/wordpress-configurations/sendgrid-wordpress-wp-mail-smtp", - "/guides/multisite", - "/guides/multisite/considerations", - "/guides/multisite/config", - "/guides/multisite/multisite-governance", - "/guides/multisite/workflows", - "/guides/multisite/search-replace", - "/guides/multisite/debug", - "/guides/woocommerce", - "/guides/woocommerce/store-setup", - "/guides/woocommerce/configure", - "/guides/woocommerce/commit", - "/guides/woocommerce/initialize-prod", - "/guides/woocommerce/develop", - "/guides/woocommerce/launch", - "/supported-wp", - "/optimize-wp-options-table-autoloaded-data", - "/guides/decoupled", - "/guides/decoupled/overview", - "/guides/decoupled/overview/considerations", - "/guides/decoupled/overview/site-options", - "/guides/decoupled/overview/site", - "/guides/decoupled/overview/manage-settings", - "/guides/decoupled/overview/fes-multidev", - "/guides/decoupled/overview/support", - "/guides/decoupled/overview/faq", - "/guides/decoupled/overview/troubleshooting", - "/guides/decoupled/overview/v1-pipeline", - "/guides/decoupled/wp-nextjs-frontend-starters", - "/guides/decoupled/wp-nextjs-frontend-starters/create", - "/guides/decoupled/wp-nextjs-frontend-starters/build-details", - "/guides/decoupled/wp-nextjs-frontend-starters/caching", - "/guides/decoupled/wp-nextjs-frontend-starters/manage-settings", - "/guides/decoupled/wp-nextjs-frontend-starters/content-preview", - "/guides/decoupled/wp-nextjs-frontend-starters/robots-indexing", - "/guides/decoupled/wp-backend-starters", - "/guides/decoupled/wp-backend-starters/create", - "/guides/decoupled/wp-backend-starters/caching", - "/guides/decoupled/wp-backend-starters/manage-settings", - "/guides/decoupled/wp-backend-starters/build-hooks", - "/guides/decoupled/wp-gatsby-frontend-starters", - "/guides/decoupled/wp-gatsby-frontend-starters/create", - "/guides/decoupled/wp-gatsby-frontend-starters/build-details", - "/guides/decoupled/wp-gatsby-frontend-starters/manage-settings", - "/guides/decoupled/wp-gatsby-frontend-starters/robots-indexing", - "/guides/decoupled/drupal-backend-starters", - "/guides/decoupled/drupal-backend-starters/create", - "/guides/decoupled/drupal-backend-starters/caching", - "/guides/decoupled/drupal-backend-starters/manage-settings", - "/guides/decoupled/drupal-backend-starters/build-hooks", - "/guides/decoupled/drupal-nextjs-frontend-starters", - "/guides/decoupled/drupal-nextjs-frontend-starters/create", - "/guides/decoupled/drupal-nextjs-frontend-starters/build-details", - "/guides/decoupled/drupal-nextjs-frontend-starters/caching", - "/guides/decoupled/drupal-nextjs-frontend-starters/manage-settings", - "/guides/decoupled/drupal-nextjs-frontend-starters/content-preview", - "/guides/decoupled/drupal-nextjs-frontend-starters/robots-indexing", - "/guides/decoupled/no-starter-kit", - "/guides/decoupled/no-starter-kit/create", - "/guides/decoupled/no-starter-kit/import-repo", - "/guides/decoupled/no-starter-kit/any-framework", - "/guides/decoupled/no-starter-kit/build-details", - "/guides/decoupled/no-starter-kit/manage-settings", - "/static-site-empty-upstream", - "/addons", - "/integrations", - "/guides/account-mgmt", - "/guides/account-mgmt/account", - "/guides/account-mgmt/account/types", - "/guides/account-mgmt/account/recover", - "/guides/account-mgmt/account/delete", - "/guides/account-mgmt/billing", - "/guides/account-mgmt/billing/periods", - "/guides/account-mgmt/billing/methods", - "/guides/account-mgmt/billing/invoices", - "/guides/account-mgmt/billing/transfer", - "/guides/account-mgmt/billing/troubleshooting", - "/guides/enterprise-billing-center", - "/guides/enterprise-billing-center/invoices", - "/guides/enterprise-billing-center/site-portfolio-report", - "/guides/enterprise-billing-center/interacting", - "/guides/enterprise-billing-center/faq", - "/guides/account-mgmt/plans", - "/guides/account-mgmt/plans/resources", - "/guides/account-mgmt/plans/pricing", - "/guides/account-mgmt/plans/site-plans", - "/guides/account-mgmt/plans/workspace-plans", - "/guides/account-mgmt/plans/faq", - "/guides/account-mgmt/traffic", - "/guides/account-mgmt/traffic/overages", - "/guides/account-mgmt/traffic/remedy", - "/tax-exempt-status", - "/guides/sso", - "/guides/sso/sso", - "/guides/sso/sso-organizations", - "/guides/sso/shibboleth-sso", - "/ldap-and-ldaps", - "/guides/wordpress-google-sso", - "/guides/wordpress-google-sso/install", - "/guides/wordpress-google-sso/saml-app", - "/guides/wordpress-google-sso/access-and-mappings", - "/guides/wordpress-google-sso/going-live", - "/guides/wordpress-google-sso/advanced-configuration", - "/guides/account-mgmt/workspace-sites-teams", - "/guides/account-mgmt/workspace-sites-teams/workspaces", - "/guides/account-mgmt/workspace-sites-teams/sites", - "/guides/account-mgmt/workspace-sites-teams/teams", - "/guides/account-mgmt/workspace-sites-teams/offboard", - "/guides/account-mgmt/workspace-sites-teams/tools", - "/guides/custom-upstream", - "/guides/custom-upstream/create-custom-upstream", - "/guides/custom-upstream/manage-dependencies-custom-upstream", - "/guides/custom-upstream/edit-custom-upstream", - "/guides/custom-upstream/delete-custom-upstream", - "/guides/custom-upstream/maintain-custom-upstream", - "/guides/custom-upstream/switch-custom-upstream", - "/guides/custom-upstream/test-custom-upstream", - "/guides/custom-upstream/troubleshooting", - "/guides/autopilot", - "/guides/autopilot/autopilot-preconfiguration", - "/guides/autopilot/enable-autopilot", - "/guides/autopilot/tests-results", - "/guides/autopilot/apply-updates", - "/guides/autopilot/autopilot-deactivate", - "/guides/autopilot/troubleshoot-autopilot", - "/guides/autopilot/autopilot-faq", - "/guides/autopilot-custom-upstream", - "/guides/autopilot-custom-upstream/autopilot-custom-upstream-config", - "/guides/autopilot-custom-upstream/wp-autopilot-custom-upstream", - "/terminus", - "/terminus/install", - "/terminus/examples", - "/terminus/commands", - "/terminus/scripting", - "/terminus/plugins", - "/terminus/directory", - "/terminus/create", - "/terminus/configuration", - "/terminus/supported-terminus", - "/terminus/updates", - "/terminus/terminus-4-0", - "/terminus/terminus-3-0", - "/machine-tokens", - "/ssh-keys", - "/terminus/ci/bitbucket", - "/terminus/ci/circleci", - "/terminus/ci/github-actions", - "/terminus/ci/gitlab", - "/customer-scheduled-cron-jobs", - "/guides/wp-cli", - "/guides/create-wp-site", - "/guides/wp-cli/wp-cli-global-parameters", - "/guides/wp-cli/install-wp-plugins-themes", - "/guides/wp-cli/wp-cli-sql-php-subcommands", - "/guides/wp-cli/wp-cli-pantheon-commands", - "/guides/wp-cli/wp-cli-troubleshoot", - "/guides/drush", - "/guides/drush/drush-versions", - "/guides/drush/drush-commands", - "/guides/drush/drush-import", - "/guides/drush/drush-aliases", - "/guides/drush/drush-sql-queries", - "/guides/drush/drush-known-limitations", - "/guides/drush/troubleshoot-drush", - "/support", - "/guides/support", - "/guides/support/contact-support", - "/guides/support/support-ticket", - "/guides/support/early-access", - "/guides/support/har", - "/guides/support/curl", - "/guides/support/faq", - "/oss-support-levels", - "/guides/disaster-recovery", - "/guides/disaster-recovery/planning-ahead", - "/guides/disaster-recovery/site-goes-down", - "/guides/disaster-recovery/incident-remediation", - "/guides/professional-services", - "/guides/professional-services/website-migration-service", - "/guides/professional-services/onboarding", - "/guides/professional-services/application-performance", - "/guides/professional-services/advanced-global-cdn", - "/guides/professional-services/managed-updates", - "/troubleshoot", - "/basic-troubleshooting", - "/wordpress-known-issues", - "/modules-known-issues", - "/symlinks-assumed-write-access", - "/timeouts", - "/debug-connections", - "/guides/errors-and-server-responses", - "/guides/errors-and-server-responses/4xx-errors", - "/guides/errors-and-server-responses/5xx-errors", - "/guides/errors-and-server-responses/retries-server-containers", - "/guides/errors-and-server-responses/external-web-service-calls", - "/guides/errors-and-server-responses/overloaded-workers", - "/guides/errors-and-server-responses/slow-and-high-queries", - "/mime-types", - "/resetting-passwords", - "/local-dns-cache", - "/tls-compatibility", - "/performance", - "/debug-slow-performance", - "/debug-cache", - "/bots-and-indexing", - "/spider-traps", - "/guides/new-relic", - "/guides/new-relic/activate-new-relic", - "/guides/new-relic/monitor-new-relic", - "/guides/new-relic/new-relic-quicksilver", - "/guides/new-relic/debug-mysql-new-relic", - "/guides/new-relic/troubleshoot-new-relic", - "/guides/new-relic/new-relic-faq", - "/guides/frontend-performance", - "/guides/frontend-performance/metrics", - "/guides/frontend-performance/diagnostics", - "/guides/frontend-performance/caching", - "/guides/frontend-performance/media", - "/guides/frontend-performance/code-css", - "/guides/frontend-performance/queries", - "/guides/frontend-performance/static", - "/guides/frontend-performance/redirects", - "/guides/frontend-performance/additional-resources", - "/load-and-performance-testing", - "/load-testing-with-blazemeter", - "/drupal-migration", - "/guides/drupal-hosted-md", - "/guides/drupal-hosted-md/prepare", - "/guides/drupal-hosted-md/drupal-core-version", - "/guides/drupal-hosted-md/core-updates", - "/guides/drupal-hosted-md/deploy", - "/guides/drupal-hosted-md/troubleshooting", - "/guides/drupal-hosted", - "/guides/drupal-hosted/prepare", - "/guides/drupal-hosted/create-site", - "/guides/drupal-hosted/code", - "/guides/drupal-hosted/deploy", - "/guides/drupal-hosted/troubleshooting", - "/guides/drupal-hosted-createempty-md", - "/guides/drupal-hosted-createempty-md/prepare", - "/guides/drupal-hosted-createempty-md/composer-upstream", - "/guides/drupal-hosted-createempty-md/contrib-custom", - "/guides/drupal-hosted-createempty-md/deploy-dev", - "/guides/drupal-hosted-createempty-md/change-upstream", - "/guides/drupal-hosted-createempty-md/dependency-versions", - "/guides/drupal-hosted-createempty-md/deploy-live", - "/guides/drupal-hosted-createempty-md/troubleshooting", - "/guides/drupal-hosted-createdashboard-set8", - "/guides/drupal-hosted-createdashboard-set8/prepare", - "/guides/drupal-hosted-createdashboard-set8/drupal-core-version", - "/guides/drupal-hosted-createdashboard-set8/core-updates", - "/guides/drupal-hosted-createdashboard-set8/deploy", - "/guides/drupal-hosted-createdashboard-set8/troubleshooting", - "/guides/drupal-hosted-createcustom", - "/guides/drupal-hosted-createcustom/new-branch", - "/guides/drupal-hosted-createcustom/dependencies", - "/guides/drupal-hosted-createcustom/contrib-custom", - "/guides/drupal-hosted-createcustom/site-customizations", - "/guides/drupal-hosted-createcustom/deploy-dev", - "/guides/drupal-hosted-createcustom/deploy-live", - "/guides/drupal-hosted-createcustom/troubleshooting", - "/guides/drupal-hosted-btworkflow", - "/guides/drupal-hosted-btworkflow/prepare", - "/guides/drupal-hosted-btworkflow/copy-config", - "/guides/drupal-hosted-btworkflow/contrib-custom", - "/guides/drupal-hosted-btworkflow/database", - "/guides/drupal-hosted-btworkflow/backup-token", - "/guides/drupal-hosted-btworkflow/upload-files", - "/guides/drupal-hosted-btworkflow/restore-token", - "/guides/drupal-hosted-btworkflow/deploy", - "/guides/drupal-hosted-btworkflow/troubleshooting", - "/guides/drupal-hosted-createbt", - "/guides/drupal-hosted-createbt/prepare", - "/guides/drupal-hosted-createbt/upgrade", - "/guides/drupal-hosted-createbt/core", - "/guides/drupal-hosted-createbt/mariadb", - "/guides/drupal-hosted-createbt/deploy", - "/guides/drupal-hosted-createbt/troubleshooting", - "/switch-drupal-recommended-upstream", - "/drupal-to-build-tools", - "/monthly-maintenance", - "/platform-notifications", - "/guides/security", - "/guides/secure-development", - "/guides/secure-development/secure-integration", - "/guides/secure-development/security-tool", - "/guides/secure-development/private-paths", - "/guides/secure-development/two-factor-authentication", - "/guides/secure-development/ssh-tunnels", - "/guides/secure-development/secure-runtime-access", - "/guides/secure-development/phpinfo", - "/guides/secrets", - "/guides/secrets/overview", - "/guides/secrets/php", - "/guides/secrets/drupal", - "/guides/secrets/composer", - "/guides/secrets/local", - "/guides/secrets/troubleshooting", - "/custom-certificates", - "/certificate-bundles", - "/clamav", - "/drupal-security-patches", - "/learning", - "/certification", - "/certification/about", - "/certification/exam", - "/certification/study-guide", - "/certification/study-guide/webops", - "/certification/study-guide/platform", - "/certification/study-guide/create", - "/certification/study-guide/cdn", - "/certification/study-guide/cms", - "/certification/study-guide/deploy", - "/certification/study-guide/people", - "/certification/study-guide/extend", - "/certification/study-guide/automate", - "/certification/study-guide/custom-upstreams", - "/https://certification.pantheon.io", - "/guides/wordpress-git", - "/guides/wordpress-git/plugins", - "/guides/wordpress-git/themes", - "/guides/wordpress-git/media", - "/guides/wordpress-git/remove-editor", - "/guides/wordpress-git/next-steps", - "/guides/pagerduty", - "/guides/pagerduty/monitor", - "/guides/pagerduty/schedule", - "/guides/pagerduty/notify", - "/guides/pagerduty/slack", - "/guides/pagerduty/next-steps", - "/guides/accessibility", - "/guides/accessibility/get-started", - "/guides/accessibility/best-practices", - "/guides/accessibility/tools", - "/guides/accessibility/resources", - "/drupal-commandline", - "/pingdom-uptime-check", - "/drupal-advanced-page-cache", - "/partial-composer", - "/drupal-commerce", - "/guides", - "/agency-tips", - "/contribute", - "/community", - "/pantheon-community", - "/roadmap", - "/code-of-conduct", - "/trainers", - "/style-guide", - "/glossary", - "/inclusive-language", - "/doc-template", - "/release-notes" -] \ No newline at end of file diff --git a/playwright.config.ts b/playwright.config.ts deleted file mode 100644 index ad348e4f47..0000000000 --- a/playwright.config.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { defineConfig, devices } from "@playwright/test"; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// import dotenv from 'dotenv'; -// import path from 'path'; -// dotenv.config({ path: path.resolve(__dirname, '.env') }); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: "./playwright-tests", - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: 2, - /* Use multiple workers for parallel execution */ - workers: 4, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: "html", - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: "http://localhost:3002", - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: "on-first-retry", - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: "chromium", - use: { ...devices["Desktop Chrome"] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - /* Run your local dev server before starting the tests */ - webServer: { - command: "npm run dev", - url: "http://localhost:3002", - reuseExistingServer: process.env.CI === "true", - timeout: 120000, - }, -}); diff --git a/release-notes-listing.json b/release-notes-listing.json deleted file mode 100644 index e5495ca1bf..0000000000 --- a/release-notes-listing.json +++ /dev/null @@ -1 +0,0 @@ -{"releaseNotes":[{"slug":"release-notes/2025/07/pantheon-advanced-page-cache-2-3-3"},{"slug":"release-notes/2025/07/tls-10-11-eol"},{"slug":"release-notes/2025/07/php-81-82-83-patch-updates"},{"slug":"release-notes/2025/07/wordpress-composer-managed-1-33-0"},{"slug":"release-notes/2025/06/wpcli-2-12"},{"slug":"release-notes/2025/06/push-to-pantheon-action-0-6-1"},{"slug":"release-notes/2025/06/php-8-3-22"},{"slug":"release-notes/2025/06/wp-saml-auth-2-2-0"},{"slug":"release-notes/2025/06/drush-5-7-eol"},{"slug":"release-notes/2025/06/php-53-55-pantheon-yml"},{"slug":"release-notes/2025/05/pantheon-apachesolr-1-1-1"},{"slug":"release-notes/2025/05/terminus-401"},{"slug":"release-notes/2025/05/github-action"},{"slug":"release-notes/2025/05/github-application"},{"slug":"release-notes/2025/05/drops-7-solr-update"},{"slug":"release-notes/2025/05/php-8-3-21"},{"slug":"release-notes/2025/05/workspace-traffic-insights"},{"slug":"release-notes/2025/05/terminus-4-0-0"},{"slug":"release-notes/2025/05/new-relic-agent"},{"slug":"release-notes/2025/05/interstitial-pages"},{"slug":"release-notes/2025/04/wordpress-6-8-1"},{"slug":"release-notes/2025/04/introducing-pantheon-trust-center"},{"slug":"release-notes/2025/04/cp-drupal-contrib"},{"slug":"release-notes/2025/04/wordpress-6-8"},{"slug":"release-notes/2025/04/php-8-3-20"},{"slug":"release-notes/2025/04/drush-5-7-eol"},{"slug":"release-notes/2025/03/new-relic-ip-ranges"},{"slug":"release-notes/2025/03/content-publisher-update"},{"slug":"release-notes/2025/03/php-81-82-83"},{"slug":"release-notes/2025/03/php-eol-53-55"},{"slug":"release-notes/2025/03/pantheon-mu-plugin-1-5-3"},{"slug":"release-notes/2025/03/drupal-module-d11-compatibility"},{"slug":"release-notes/2025/03/terminus-4-0-0-alpha1"},{"slug":"release-notes/2025/03/terminus-362"},{"slug":"release-notes/2025/02/rest-api-v2"},{"slug":"release-notes/2025/02/papc-2.1.1"},{"slug":"release-notes/2025/02/product-roadmap"},{"slug":"release-notes/2025/02/pcc-side-by-side"},{"slug":"release-notes/2025/02/wordpress-composer-managed-1-32-5"},{"slug":"release-notes/2025/02/wordpress-6-7-2"},{"slug":"release-notes/2025/02/wordpress-composer-managed-1-32-4"},{"slug":"release-notes/2025/01/composer-2-8-3"},{"slug":"release-notes/2025/01/new-invoice-status-tags"},{"slug":"release-notes/2025/01/php-53-55-eol"},{"slug":"release-notes/2025/01/drupal-cms-upstream"},{"slug":"release-notes/2025/01/agcdn-change-requests"},{"slug":"release-notes/2025/01/Solr8-version-upgrade"},{"slug":"release-notes/2024/12/drupal-7-d7es"},{"slug":"release-notes/2024/12/solr-plugin-update"},{"slug":"release-notes/2024/12/pantheon-hud-plugin-update"},{"slug":"release-notes/2024/12/drupal-7-103"},{"slug":"release-notes/2024/12/terminus-361"},{"slug":"release-notes/2024/11/php-81-82-83"},{"slug":"release-notes/2024/11/wordpress-6-7-1"},{"slug":"release-notes/2024/11/drupal-7-102"},{"slug":"release-notes/2024/11/content-publisher-beta"},{"slug":"release-notes/2024/11/solr-module-8-2-0"},{"slug":"release-notes/2024/11/new-dashboard-nav"},{"slug":"release-notes/2024/11/wordpress-6.7"},{"slug":"release-notes/2024/10/software-version-status"},{"slug":"release-notes/2024/10/php-82-83"},{"slug":"release-notes/2024/10/gravityforms-bug-fix"},{"slug":"release-notes/2024/10/new-relic-agent"},{"slug":"release-notes/2024/10/drupal-7-lts"},{"slug":"release-notes/2024/10/drupal-11-site-creation"},{"slug":"release-notes/2024/10/php-81-82-83"},{"slug":"release-notes/2024/09/terminus-360"},{"slug":"release-notes/2024/09/rss-bug-fix"},{"slug":"release-notes/2024/09/domain-verification"},{"slug":"release-notes/2024/09/wp-cli-2-11"},{"slug":"release-notes/2024/09/wordpress-composer-managed-1-32-3"},{"slug":"release-notes/2024/09/wordpress-662"},{"slug":"release-notes/2024/09/emergency-ticket-workspace-phase1"},{"slug":"release-notes/2024/09/pantheon-mu-plugin-1-5-1"},{"slug":"release-notes/2024/09/php-82-83"},{"slug":"release-notes/2024/09/wordpress-composer-managed-1-32-2"},{"slug":"release-notes/2024/08/launchcheck-0-8-0"},{"slug":"release-notes/2024/08/pantheon-secrets-limited-availability"},{"slug":"release-notes/2024/08/prevent-filesystem-overload"},{"slug":"release-notes/2024/08/wordpress-composer-managed-1-32-1"},{"slug":"release-notes/2024/08/overage-charges-updates"},{"slug":"release-notes/2024/08/pantheon-advanced-page-cache-2-1-0"},{"slug":"release-notes/2024/08/site-plan-checkout-experience"},{"slug":"release-notes/2024/08/wordpress-composer-managed-1-32-0"},{"slug":"release-notes/2024/07/wordpress-composer-managed-1-31-1-update"},{"slug":"release-notes/2024/07/pantheon-mu-plugin-1-5-0"},{"slug":"release-notes/2024/07/workflow-logs"},{"slug":"release-notes/2024/07/wordpress-6-6-1"},{"slug":"release-notes/2024/07/new-relic-v2-api-migration"},{"slug":"release-notes/2024/07/pantheon-mu-plugin-1-4-5"},{"slug":"release-notes/2024/07/php-defaults"},{"slug":"release-notes/2024/07/wordpress-6-6"},{"slug":"release-notes/2024/07/new-relic-agent-update-released"},{"slug":"release-notes/2024/07/php-82-83"},{"slug":"release-notes/2024/07/rss-feed"},{"slug":"release-notes/2024/07/wordpress-composer-managed-1-31-0-update"},{"slug":"release-notes/2024/07/platform-robots-txt-now-supports-pope-tech"},{"slug":"release-notes/2024/07/domain-validation"},{"slug":"release-notes/2024/06/wordpress-6-5-5"},{"slug":"release-notes/2024/06/quicksilver-examples-new-relic"},{"slug":"release-notes/2024/06/login-update"},{"slug":"release-notes/2024/06/php-81-82-83-updates"},{"slug":"release-notes/2024/06/wordpress-6-5-4"},{"slug":"release-notes/2024/06/drupal-7-101"},{"slug":"release-notes/2024/06/release-note-multi-select-filter"},{"slug":"release-notes/2024/06/pantheon-mu-plugin-1-4-4-wordpress-composer-managed-update"},{"slug":"release-notes/2024/05/pantheon-advanced-page-cache-2-0"},{"slug":"release-notes/2024/05/pantheon-mu-plugin-1-4-3-update"},{"slug":"release-notes/2024/05/5xx-error-messages"},{"slug":"release-notes/2024/05/pantheon-mu-plugin-1-4-2-update"},{"slug":"release-notes/2024/05/load-balancing"},{"slug":"release-notes/2024/05/php-82-83"},{"slug":"release-notes/2024/05/sendgrid-transactional-emails"},{"slug":"release-notes/2024/05/wordpress-6-5-3-update"},{"slug":"release-notes/2024/05/new-relic-agent-update-released"},{"slug":"release-notes/2024/05/Synthetics-Check-Limits"},{"slug":"release-notes/2024/04/wordpress-pantheon-mu-plugin-1-4-1-update"},{"slug":"release-notes/2024/04/ea-workflow-logs"},{"slug":"release-notes/2024/04/pantheon-mu-plugin-1-4-0-update"},{"slug":"release-notes/2024/04/solr-power-2-5-3"},{"slug":"release-notes/2024/04/php-8-3-recommended"},{"slug":"release-notes/2024/04/sftp-authentication-changes"},{"slug":"release-notes/2024/04/enhanced-support-ticket-search-functionality"},{"slug":"release-notes/2024/04/community-slack"},{"slug":"release-notes/2024/04/wordpress-composer-managed-update"},{"slug":"release-notes/2024/04/php-81-82-82"},{"slug":"release-notes/2024/04/wordpress-6-5-2"},{"slug":"release-notes/2024/04/new-relic-agent"},{"slug":"release-notes/2024/04/wordpress-6-5"},{"slug":"release-notes/2024/03/overages-policy-change"},{"slug":"release-notes/2024/03/pantheon-mu-plugin-1-3-2"},{"slug":"release-notes/2024/03/terminus-github-action-sessions-cache"},{"slug":"release-notes/2024/03/papc-drupal-file-cache"},{"slug":"release-notes/2024/03/PHP-7-1-EOS"},{"slug":"release-notes/2024/03/php-8-2-8-3"},{"slug":"release-notes/2024/03/pantheon-advanced-page-cache-1.5.0"},{"slug":"release-notes/2024/03/drupal-7-100"},{"slug":"release-notes/2024/03/pantheon-mu-plugin-1-3-3"},{"slug":"release-notes/2024/02/wp-cli-changes"},{"slug":"release-notes/2024/02/php-8.3.3-8.2.16-8.1.27"},{"slug":"release-notes/2024/02/wp-cli-2-10"},{"slug":"release-notes/2024/01/wordpress-6-4-3"},{"slug":"release-notes/2024/01/pantheon-release-notes-a-new-year-a-new-chapter"},{"slug":"release-notes/2024/01/wp-cli-v2-9-0-release-now-available-on-pantheon"},{"slug":"release-notes/2024/01/wordpress-6-4-2-security-update"},{"slug":"release-notes/2024/01/drupal-7-99-release-bug fixes-and-feature-enhancements"},{"slug":"release-notes/2023/12/upgraded-security-measures-for-uninterrupted-webops-experience"},{"slug":"release-notes/2023/12/optimized-monitoring-for-high-volume-directories"},{"slug":"release-notes/2023/12/elevated-experience-with-front-end-sites-drupal-starter-kit"},{"slug":"release-notes/2023/12/delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management"},{"slug":"release-notes/2023/11/wordpress-native-php-sessions-1-4-update"},{"slug":"release-notes/2023/11/vpat-issued-for-product-accessibility"},{"slug":"release-notes/2023/11/streamlined-user-offboarding"},{"slug":"release-notes/2023/11/front-end-sites-build-caching-and-node-js-versions"},{"slug":"release-notes/2023/11/faster-backups"},{"slug":"release-notes/2023/11/composer-logs-visibility"},{"slug":"release-notes/2023/10/wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent"},{"slug":"release-notes/2023/10/php-memory-limits-updates"},{"slug":"release-notes/2023/10/php-8-1-and-8-2-updated-to-their-latest-patch-releases"},{"slug":"release-notes/2023/10/front-end-sites-settings"},{"slug":"release-notes/2023/10/drupal-security-update"},{"slug":"release-notes/2023/10/design-system-integration-docs"},{"slug":"release-notes/2023/09/drupal-sa-core-2023-006"},{"slug":"release-notes/2023/09/wordpress-multisite-search-and-replace"},{"slug":"release-notes/2023/09/solr-search-for-wordpress-2-5-0-update"},{"slug":"release-notes/2023/09/php-security-updates"},{"slug":"release-notes/2023/09/pantheon-advanced-page-cache-wordpress-plugin-updates"},{"slug":"release-notes/2023/09/object-cache-pro"},{"slug":"release-notes/2023/09/new-php-defaults"},{"slug":"release-notes/2023/09/front-end-sites-enhancements"},{"slug":"release-notes/2023/09/early-access-streamlined-user-offboarding"},{"slug":"release-notes/2023/09/early-access-customer-scheduled-jobs"},{"slug":"release-notes/2023/07/wp-cli-2-8-1"},{"slug":"release-notes/2023/07/integrated-composer"},{"slug":"release-notes/2023/07/drupal-7-98"},{"slug":"release-notes/2023/07/deprecation-of-obsolete-tls-1-2-cipher-suites"},{"slug":"release-notes/2023/06/wp-cli-2-8-0"},{"slug":"release-notes/2023/06/wordpress-6-2-1"},{"slug":"release-notes/2023/06/launch-check-updates"},{"slug":"release-notes/2023/05/wordpress-6-2"},{"slug":"release-notes/2023/05/cache-hit-ratio-metrics"},{"slug":"release-notes/2023/02/wordpress-multisite"},{"slug":"release-notes/2023/02/wordpress-6-1-1"},{"slug":"release-notes/2023/02/roles-and-permissions"},{"slug":"release-notes/2023/02/pantheon-object-cache"},{"slug":"release-notes/2023/02/pantheon-learning"},{"slug":"release-notes/2023/02/localdev"},{"slug":"release-notes/2023/02/front-end-sites"},{"slug":"release-notes/2023/02/enterprise-billing-center"},{"slug":"release-notes/2023/02/drupal-9-5-3"},{"slug":"release-notes/2023/02/drupal-9-4-11"},{"slug":"release-notes/2023/02/drupal-10-0-3"},{"slug":"release-notes/2023/02/documentation"},{"slug":"release-notes/2023/01/drupal-9-5-2"},{"slug":"release-notes/2023/01/drupal-9-4-9"},{"slug":"release-notes/2023/01/drupal-10-0-2"},{"slug":"release-notes/2022/12/wordpress-6-1-1"},{"slug":"release-notes/2022/12/drupal-9-5-0"},{"slug":"release-notes/2022/12/drupal-9-4-8"},{"slug":"release-notes/2022/12/drupal-10"},{"slug":"release-notes/2022/11/wordpress-6-1"},{"slug":"release-notes/2022/11/new-dashboard"},{"slug":"release-notes/2022/11/drupal-9-4-8"},{"slug":"release-notes/2022/11/drupal-9-3-22"},{"slug":"release-notes/2022/11/documentation"},{"slug":"release-notes/2022/11/autopilot"},{"slug":"release-notes/2022/10/new-dashboard"},{"slug":"release-notes/2022/10/drupal-9-4-5"},{"slug":"release-notes/2022/10/drupal-9-3-22"},{"slug":"release-notes/2022/10/documentation"},{"slug":"release-notes/2022/09/wordpress-composer-managed-upstream-in-early-access"},{"slug":"release-notes/2022/09/wordpress-6-0-2"},{"slug":"release-notes/2022/09/php-8-1"},{"slug":"release-notes/2022/09/drupal-9-4-5"},{"slug":"release-notes/2022/09/documentation"},{"slug":"release-notes/2022/08/wordpress-6-0-1"},{"slug":"release-notes/2022/08/drupal-9-4-5"},{"slug":"release-notes/2022/08/drupal-9-3-21"},{"slug":"release-notes/2022/08/documentation"},{"slug":"release-notes/2022/07/wordpress-6-0-1"},{"slug":"release-notes/2022/07/drupal-9-4-1"},{"slug":"release-notes/2022/07/drupal-9-3-17"},{"slug":"release-notes/2022/07/drupal-9-2-20"},{"slug":"release-notes/2022/07/documentation"},{"slug":"release-notes/2022/06/wordpress-6-0"},{"slug":"release-notes/2022/06/drupal-9-3-14"},{"slug":"release-notes/2022/06/drupal-9-2-20"},{"slug":"release-notes/2022/06/documentation"},{"slug":"release-notes/2022/05/drupal-9-3-12"},{"slug":"release-notes/2022/05/drupal-9-2-18"},{"slug":"release-notes/2022/05/documentation"},{"slug":"release-notes/2022/04/drupal-9-3-9"},{"slug":"release-notes/2022/04/drupal-9-2-16"},{"slug":"release-notes/2022/04/documentation"},{"slug":"release-notes/2022/03/wordpress-5-9-1"},{"slug":"release-notes/2022/03/drupal-9-3-6"},{"slug":"release-notes/2022/03/drupal-9-2-13"},{"slug":"release-notes/2022/03/documentation"},{"slug":"release-notes/2022/02/wordpress-5-9"},{"slug":"release-notes/2022/02/email-preferences-in-the-new-dashboard"},{"slug":"release-notes/2022/02/drupal-9-3-3"},{"slug":"release-notes/2022/02/drupal-9-2-11"},{"slug":"release-notes/2022/02/documentation"},{"slug":"release-notes/2022/01/terminus"},{"slug":"release-notes/2022/01/one-click-database-and-php-upgrades"},{"slug":"release-notes/2022/01/new-and-improved-workspace-switcher"},{"slug":"release-notes/2022/01/legacy-edge-shutdown-update"},{"slug":"release-notes/2022/01/drupal-9"},{"slug":"release-notes/2022/01/documentation"},{"slug":"release-notes/2021/12/wordpress-5-8-2"},{"slug":"release-notes/2021/12/drupal-9-2-8"},{"slug":"release-notes/2021/12/drupal-8-9-20"},{"slug":"release-notes/2021/12/documentation"},{"slug":"release-notes/2021/11/drupal-9-2-7"},{"slug":"release-notes/2021/11/documentation"},{"slug":"release-notes/2021/10/wordpress-5-8-1"},{"slug":"release-notes/2021/10/drupal-9-2-6"},{"slug":"release-notes/2021/10/drupal-8-9-19"},{"slug":"release-notes/2021/10/documentation"},{"slug":"release-notes/2021/09/drupal-9-2-3"},{"slug":"release-notes/2021/09/drupal-8-9-18"},{"slug":"release-notes/2021/09/drupal-7-82"},{"slug":"release-notes/2021/09/documentation"},{"slug":"release-notes/2021/08/wordpress-5-8"},{"slug":"release-notes/2021/08/drupal-9-2-0"},{"slug":"release-notes/2021/08/drupal-8-9-17"},{"slug":"release-notes/2021/08/drupal-7-82"},{"slug":"release-notes/2021/08/documentation"},{"slug":"release-notes/2021/07/wordpress-5-7-2"},{"slug":"release-notes/2021/07/drupal-9-2-0"},{"slug":"release-notes/2021/07/drupal-8-9-16"},{"slug":"release-notes/2021/07/drupal-7-81"},{"slug":"release-notes/2021/07/documentation"},{"slug":"release-notes/2021/06/wp-cli-2-5-0"},{"slug":"release-notes/2021/06/wordpress-5-7-2"},{"slug":"release-notes/2021/06/drupal-9-1-8"},{"slug":"release-notes/2021/06/drupal-8-9-15"},{"slug":"release-notes/2021/06/documentation"},{"slug":"release-notes/2021/05/wordpress-5-7-1"},{"slug":"release-notes/2021/05/drupal-9-1-7"},{"slug":"release-notes/2021/05/drupal-8-9-14"},{"slug":"release-notes/2021/05/drupal-7-80"},{"slug":"release-notes/2021/05/documentation"},{"slug":"release-notes/2021/04/wordpress-5-7"},{"slug":"release-notes/2021/04/documentation"},{"slug":"release-notes/2021/04/convert-your-drupal-8-pantheon-site-to-drupal-9-with-integrated-composer"},{"slug":"release-notes/2021/03/wordpress-5-6-1"},{"slug":"release-notes/2021/03/drupal-9-with-one-click-composer-updates"},{"slug":"release-notes/2021/03/documentation"},{"slug":"release-notes/2021/02/localdev-1-0-1"},{"slug":"release-notes/2021/02/drupal-9-with-one-click-composer-updates"},{"slug":"release-notes/2021/02/drupal-8-9-13"},{"slug":"release-notes/2021/02/drupal-7-78"},{"slug":"release-notes/2021/02/documentation"},{"slug":"release-notes/2021/01/wordpress-5-6"},{"slug":"release-notes/2021/01/drupal-9-with-one-click-composer-updates"},{"slug":"release-notes/2021/01/drupal-8-9-11"},{"slug":"release-notes/2021/01/documentation"},{"slug":"release-notes/2020/12/wordpress-5-5-3"},{"slug":"release-notes/2020/12/drupal-9-with-one-click-composer-updates"},{"slug":"release-notes/2020/12/drupal-8-9-9"},{"slug":"release-notes/2020/12/drupal-7-74"},{"slug":"release-notes/2020/12/documentation"},{"slug":"release-notes/2020/11/drupal-9"},{"slug":"release-notes/2020/11/drupal-8-9-7"},{"slug":"release-notes/2020/11/documentation"},{"slug":"release-notes/2020/10/wordpress-5-5-1"},{"slug":"release-notes/2020/10/php-7-3-22-and-7-4-10-updated"},{"slug":"release-notes/2020/10/drupal-9-preview-multidev-script"},{"slug":"release-notes/2020/10/drupal-8-9-6"},{"slug":"release-notes/2020/10/drupal-8-8-10"},{"slug":"release-notes/2020/10/drupal-7-73"},{"slug":"release-notes/2020/10/documentation"},{"slug":"release-notes/2020/09/wordpress-5-5"},{"slug":"release-notes/2020/09/drupal-9-0"},{"slug":"release-notes/2020/09/drupal-8-9-3"},{"slug":"release-notes/2020/08/multidev-and-covid-response-site-offers"},{"slug":"release-notes/2020/08/drupal-9-0"},{"slug":"release-notes/2020/08/drupal-8-9-2"},{"slug":"release-notes/2020/08/dedicated-certificates-&-updated-go-live"},{"slug":"release-notes/2020/07/wordpress-5-4-2"},{"slug":"release-notes/2020/07/traffic-metrics"},{"slug":"release-notes/2020/07/terminus-2-4-0"},{"slug":"release-notes/2020/07/multidev-and-covid-response-site-offers"},{"slug":"release-notes/2020/07/localdev-0-10-1"},{"slug":"release-notes/2020/07/drupal-9-0"},{"slug":"release-notes/2020/07/drupal-8-9-1,-8-8-8,-and-7-72"},{"slug":"release-notes/2020/07/documentation"},{"slug":"release-notes/2020/06/resources-to-navigate-covid-19"},{"slug":"release-notes/2020/06/localdev-0-10-0"},{"slug":"release-notes/2020/06/go-live-enhancements"},{"slug":"release-notes/2020/06/global-cdn"},{"slug":"release-notes/2020/06/drupal-9-0"},{"slug":"release-notes/2020/06/drupal-8-8-6"},{"slug":"release-notes/2020/06/drupal-7-70"},{"slug":"release-notes/2020/06/documentation"},{"slug":"release-notes/2020/05/wordpress-5-4-1"},{"slug":"release-notes/2020/05/multidev-cloud-environments-offer"},{"slug":"release-notes/2020/05/localdev-0-10-0"},{"slug":"release-notes/2020/05/early-access-to-drupal-9-with-integrated-composer"},{"slug":"release-notes/2020/05/drupal-8-8-5"},{"slug":"release-notes/2020/05/documentation"},{"slug":"release-notes/2020/04/wp-cli-2-4-0"},{"slug":"release-notes/2020/04/new-relic-agent-9-7-0-258"},{"slug":"release-notes/2020/04/localdev-0-9-3"},{"slug":"release-notes/2020/04/drupal-8-8-4"},{"slug":"release-notes/2020/04/documentation"},{"slug":"release-notes/2020/03/global-cdn-network-expansion"},{"slug":"release-notes/2020/03/drush-10"},{"slug":"release-notes/2020/03/drupal-8-8-2-released"},{"slug":"release-notes/2020/03/documentation"},{"slug":"release-notes/2020/03/advanced-global-cdn"},{"slug":"release-notes/2020/02/terminus-2-3-0-released"},{"slug":"release-notes/2020/02/php-7-3-14-and-7-2-27-updated"},{"slug":"release-notes/2020/02/localdev-0-7-0-released"},{"slug":"release-notes/2020/02/drush-8-3-2-released"},{"slug":"release-notes/2020/01/wordpress-5-3-2"},{"slug":"release-notes/2020/01/terminus-now-runs-site-local-drush-&-wp-cli"},{"slug":"release-notes/2020/01/security-enhancement-outgoing-udp-traffic-blocked"},{"slug":"release-notes/2020/01/php-7-2-and-7-3-updated"},{"slug":"release-notes/2020/01/localdev-0-6-0-beta-9-released"},{"slug":"release-notes/2020/01/drupal-8-8-1-and-7-69"},{"slug":"release-notes/2019/12/wordpress-5-3"},{"slug":"release-notes/2019/12/php-7-2,-and-7-3-updated"},{"slug":"release-notes/2019/12/drupal-8-7-10"},{"slug":"release-notes/2019/12/documentation"},{"slug":"release-notes/2019/11/wordpress-5-2-4"},{"slug":"release-notes/2019/11/php-7-1,-7-2,-and-7-3-updated"},{"slug":"release-notes/2019/11/pantheon-localdev-0-5-6"},{"slug":"release-notes/2019/11/drupal-8-7-8"},{"slug":"release-notes/2019/11/documentation"},{"slug":"release-notes/2019/10/wordpress-5-2-3"},{"slug":"release-notes/2019/10/platform-robots-txt-now-allows-swiftbot"},{"slug":"release-notes/2019/10/pantheon-now-enforces-https-by-default"},{"slug":"release-notes/2019/10/drupal-core-updates-available"},{"slug":"release-notes/2019/10/documentation"},{"slug":"release-notes/2019/09/php-7-1,-7-2-and-7-3-updated"},{"slug":"release-notes/2019/09/drupal-core-updates-available"},{"slug":"release-notes/2019/08/new-relic-php-agent-upgrade"},{"slug":"release-notes/2019/08/drupal-core-updates-available"},{"slug":"release-notes/2019/07/wordpress-5-2-2-update-available"},{"slug":"release-notes/2019/07/more-consistent-cron-runs"},{"slug":"release-notes/2019/07/general-availability-for-new-regions"},{"slug":"release-notes/2019/07/drupal-core-updates-available"},{"slug":"release-notes/2019/07/dns-recommendations-update"},{"slug":"release-notes/2019/06/wordpress-5-2-1"},{"slug":"release-notes/2019/06/php-7-1,-7-2,-and-7-3-updated"},{"slug":"release-notes/2019/06/drupal-core-updates-available"},{"slug":"release-notes/2019/06/australia-and-canada-regions-in-limited-availability"},{"slug":"release-notes/2019/05/terminus-2-0-1-release"},{"slug":"release-notes/2019/05/site-files-and-backups-moved-to-google-cloud"},{"slug":"release-notes/2019/05/php-7-3-default-for-drupal-8-and-wordpress-sites"},{"slug":"release-notes/2019/05/pantheon-heroes"},{"slug":"release-notes/2019/05/new-relic-agent-upgraded"},{"slug":"release-notes/2019/05/european-union-region-in-limited-availability"},{"slug":"release-notes/2019/05/drupal-core-updates-available"},{"slug":"release-notes/2019/05/disaster-recovery-now-supports-redis-cache"},{"slug":"release-notes/2019/04/wordpress-5-1-1"},{"slug":"release-notes/2019/04/pantheon-heroes"},{"slug":"release-notes/2019/04/drupal-core-upgrades"},{"slug":"release-notes/2019/04/documentation"},{"slug":"release-notes/2019/04/community-updates"},{"slug":"release-notes/2019/03/wordpress-launch-check-shows-vulnerability-info"},{"slug":"release-notes/2019/03/terminus-2-0-released!"},{"slug":"release-notes/2019/03/php-7-2-updated"},{"slug":"release-notes/2019/03/eu-region-early-access"},{"slug":"release-notes/2019/03/drupal-8-6-10,-7-64,-and-wordpress-5-1-now-available-as-1-click-updates"},{"slug":"release-notes/2019/03/documentation"},{"slug":"release-notes/2019/02/php-intl-extension-now-available"},{"slug":"release-notes/2019/02/php-7-2-and-7-1-updated"},{"slug":"release-notes/2019/02/new-relic-php-agent-upgraded"},{"slug":"release-notes/2019/02/drupal-8-6-7,-7-63,-and-wordpress-5-0-3-now-available-as-1-click-updates"},{"slug":"release-notes/2019/01/drupal-8-6-5-and-wordpress-5-0-1-now-available-as-1-click-updates"},{"slug":"release-notes/2019/01/documentation"},{"slug":"release-notes/2019/01/disaster-recovery"},{"slug":"release-notes/2018/12/php-updates"},{"slug":"release-notes/2018/12/partner-program"},{"slug":"release-notes/2018/12/multidev-access"},{"slug":"release-notes/2018/12/drupal-8-6-3-and-7-61-now-available-as-1-click-updates"},{"slug":"release-notes/2018/12/documentation"},{"slug":"release-notes/2018/11/php-7-2-11-and-7-1-23"},{"slug":"release-notes/2018/11/drupal-8-6-2"},{"slug":"release-notes/2018/11/drupal-7-60"},{"slug":"release-notes/2018/10/php-version-updates"},{"slug":"release-notes/2018/10/improve-email-deliverability-with-spf-records"},{"slug":"release-notes/2018/10/drupal-maintenance-mode-imagecache-fix"},{"slug":"release-notes/2018/10/drupal-8-6-1"},{"slug":"release-notes/2018/10/documentation"},{"slug":"release-notes/2018/09/wordpress-4-9-8"},{"slug":"release-notes/2018/09/php-upgrades"},{"slug":"release-notes/2018/09/new-php-default-versions-for-pantheon-maintained-upstreams"},{"slug":"release-notes/2018/09/drupal-8-5-6"},{"slug":"release-notes/2018/09/drupal-7-59"},{"slug":"release-notes/2018/08/php-upgrades"},{"slug":"release-notes/2018/08/https-provisioning-accelerated"},{"slug":"release-notes/2018/08/documentation"},{"slug":"release-notes/2018/08/apache-tika-update"},{"slug":"release-notes/2018/07/wordpress-4-9-7"},{"slug":"release-notes/2018/07/terminus-1-8-1"},{"slug":"release-notes/2018/07/drupal-8-5-5"},{"slug":"release-notes/2018/07/documentation"},{"slug":"release-notes/2018/07/crawler-access-to-platform-domains"},{"slug":"release-notes/2018/05/wordpress-core-upgrade"},{"slug":"release-notes/2018/05/upgrade-to-php-7-1-or-7-2-before-december"},{"slug":"release-notes/2018/05/php-updates"},{"slug":"release-notes/2018/05/php-7-2-ms-sql-support"},{"slug":"release-notes/2018/05/filemount-configuration"},{"slug":"release-notes/2018/05/duplicate-pantheon-sites-with-terminus-site-clone"},{"slug":"release-notes/2018/05/documentation"},{"slug":"release-notes/2018/04/wordpress-core-upgrade"},{"slug":"release-notes/2018/04/testing-seo-now-supported-on-platform-domains"},{"slug":"release-notes/2018/04/ocsp-stapling-enabled-on-global-cdn"},{"slug":"release-notes/2018/04/drupal-core-upgrades"},{"slug":"release-notes/2018/04/documentation"},{"slug":"release-notes/2018/03/wordpress-core-upgrade"},{"slug":"release-notes/2018/03/terminus-1-8"},{"slug":"release-notes/2018/03/php-security-upgrades"},{"slug":"release-notes/2018/03/global-cdn-surrogate-key-raw-disabled-by-default"},{"slug":"release-notes/2018/03/drupal-core-upgrades"},{"slug":"release-notes/2018/02/wordpress-core-upgrade"},{"slug":"release-notes/2018/02/php-updates"},{"slug":"release-notes/2018/02/legacy-ssl-add-on-price-increase"},{"slug":"release-notes/2018/02/drupal-core-upgrades"},{"slug":"release-notes/2018/02/custom-upstream-quicksilver-enhancement"},{"slug":"release-notes/2018/01/wp-cli-upgrades"},{"slug":"release-notes/2018/01/wordpress-core-upgrade"},{"slug":"release-notes/2018/01/registry-rebuild-upgrade"},{"slug":"release-notes/2018/01/php-upgrades"},{"slug":"release-notes/2018/01/pantheon-moves-to-google-cloud-platform"},{"slug":"release-notes/2018/01/new-relic-php-7-2-support"},{"slug":"release-notes/2018/01/launch-check-now-supports-drupal-8"},{"slug":"release-notes/2018/01/drupal-core-upgrades"},{"slug":"release-notes/2018/01/documentation"},{"slug":"release-notes/2017/12/php-upgrades"},{"slug":"release-notes/2017/12/drupal-core-upgrades"},{"slug":"release-notes/2017/12/documentation"},{"slug":"release-notes/2017/12/bug-fixes-and-improvements"},{"slug":"release-notes/2017/11/wordpress-core-upgrades"},{"slug":"release-notes/2017/11/sites-requiring-upgrade-to-global-cdn-now-shown-on-user-&-org-dashboards"},{"slug":"release-notes/2017/11/site-dashboard-update"},{"slug":"release-notes/2017/11/drupal-core-upgrades"},{"slug":"release-notes/2017/11/documentation"},{"slug":"release-notes/2017/10/wordpress-core-upgrades"},{"slug":"release-notes/2017/10/webp-image-support"},{"slug":"release-notes/2017/10/terminus-1-6"},{"slug":"release-notes/2017/10/php-7-1-&-ioncube-decoder"},{"slug":"release-notes/2017/10/documentation"},{"slug":"release-notes/2017/10/custom-upstreams"},{"slug":"release-notes/2017/09/wp-native-php-sessions"},{"slug":"release-notes/2017/09/wp-cli"},{"slug":"release-notes/2017/09/new-relic"},{"slug":"release-notes/2017/09/documentation"},{"slug":"release-notes/2017/08/wordpress-core-upgrades"},{"slug":"release-notes/2017/08/terminus-1-5"},{"slug":"release-notes/2017/08/php-upgrades"},{"slug":"release-notes/2017/08/global-cdn-surrogate-key-cache-clearing-api-improvement"},{"slug":"release-notes/2017/08/drupal-core-upgrades"},{"slug":"release-notes/2017/08/documentation"},{"slug":"release-notes/2017/07/terminus-1-4-1"},{"slug":"release-notes/2017/07/nginx-web-server-integer-overflow-vulnerability-mitigated"},{"slug":"release-notes/2017/07/drupal-core-upgrades"},{"slug":"release-notes/2017/07/drupal-8-with-redirect-and-simple-xml-sitemap-modules-now-supported"},{"slug":"release-notes/2017/07/documentation"},{"slug":"release-notes/2017/07/custom-upstreams-self-serve-github-and-bitbucket"},{"slug":"release-notes/2017/06/wp-cli"},{"slug":"release-notes/2017/06/terminus-1-4-0"},{"slug":"release-notes/2017/06/pantheon-upstream-configuration"},{"slug":"release-notes/2017/06/new-relic"},{"slug":"release-notes/2017/06/documentation"},{"slug":"release-notes/2017/06/default-php-versions"},{"slug":"release-notes/2017/06/core-upgrades"},{"slug":"release-notes/2017/05/platform-security"},{"slug":"release-notes/2017/05/php-upgrade"},{"slug":"release-notes/2017/05/drupal-core-upgrades"},{"slug":"release-notes/2017/05/documentation"},{"slug":"release-notes/2017/04/wordpress-upgrades"},{"slug":"release-notes/2017/04/terminus-1-3-0"},{"slug":"release-notes/2017/04/drupal-core-upgrades"},{"slug":"release-notes/2017/04/documentation"},{"slug":"release-notes/2017/04/bug-fixes"},{"slug":"release-notes/2017/03/wp-cli-upgrade"},{"slug":"release-notes/2017/03/drupal-core-upgrades"},{"slug":"release-notes/2017/03/documentation"},{"slug":"release-notes/2017/02/php-upgrade"},{"slug":"release-notes/2017/02/patched-for-linux-kernel-vulnerability"},{"slug":"release-notes/2017/02/drupal-core-upgrade"},{"slug":"release-notes/2017/02/documentation"},{"slug":"release-notes/2017/01/wordpress-4-7-2-upgrade"},{"slug":"release-notes/2017/01/terminus-plugins"},{"slug":"release-notes/2017/01/terminus-1-0"},{"slug":"release-notes/2017/01/drupal-8-2-5-upgrade"},{"slug":"release-notes/2016/12/wordpress-4-7-security-patches"},{"slug":"release-notes/2016/12/wordpress-4-7-core-update"},{"slug":"release-notes/2016/12/upgraded-wp-cli"},{"slug":"release-notes/2016/12/terminus-manual-and-terminus-1-0-beta-releases"},{"slug":"release-notes/2016/12/supported-mime-types"},{"slug":"release-notes/2016/12/privacy-shield-framework-compliance"},{"slug":"release-notes/2016/12/drupal-core-updates"},{"slug":"release-notes/2016/12/documentation"},{"slug":"release-notes/2016/11/terminus-0-13-4-and-terminus-1-0-alpha"},{"slug":"release-notes/2016/11/platform-security-update"},{"slug":"release-notes/2016/11/php-upgrade"},{"slug":"release-notes/2016/11/new-relic-agent-upgrade"},{"slug":"release-notes/2016/11/early-release-pantheon-advanced-page-cache-plugin"},{"slug":"release-notes/2016/11/drupal-core-updates"},{"slug":"release-notes/2016/11/drupal-6-long-term-support-(lts)-partners"},{"slug":"release-notes/2016/11/chat-support"},{"slug":"release-notes/2016/10/terminus-1-0-alpha-release"},{"slug":"release-notes/2016/10/solr-power-for-wordpress-0-6-update"},{"slug":"release-notes/2016/10/documentation"},{"slug":"release-notes/2016/10/custom-domains-in-multidev-environments"},{"slug":"release-notes/2016/09/terminus-0-13-2"},{"slug":"release-notes/2016/09/kalabox-2-0-is-available"},{"slug":"release-notes/2016/09/drush_version-is-now-managed-in-pantheon-yml"},{"slug":"release-notes/2016/09/documentation"},{"slug":"release-notes/2016/09/dashboard-design-updates"},{"slug":"release-notes/2016/09/bug-fixes"},{"slug":"release-notes/2016/08/terminus-0-12-0"},{"slug":"release-notes/2016/08/solr-power-for-wordpress-0-5-update"},{"slug":"release-notes/2016/08/php-5-6-7-0-released"},{"slug":"release-notes/2016/08/new-hooks-for-quicksilver-platform-integration"},{"slug":"release-notes/2016/08/documentation"},{"slug":"release-notes/2016/08/advanced-site-configurations-available"},{"slug":"release-notes/2016/07/tls-1-0-deprecated"},{"slug":"release-notes/2016/07/terminus-0-11-2"},{"slug":"release-notes/2016/07/migrating-wordpress-sites-to-pantheon-just-got-easier"},{"slug":"release-notes/2016/07/drupal-contrib-module-security-updates"},{"slug":"release-notes/2016/07/documentation"},{"slug":"release-notes/2016/06/new-relic-pro"},{"slug":"release-notes/2016/06/new-reliable-screenshots-microservice-&-user-dashboard-design-update"},{"slug":"release-notes/2016/06/new-migration-button-on-the-dashboard"},{"slug":"release-notes/2016/06/drupal-8-site-imports-now-supported"},{"slug":"release-notes/2016/05/terminus-0-11-1"},{"slug":"release-notes/2016/05/pantheon-enterprise-support-now-available"},{"slug":"release-notes/2016/04/workflow-tab-renamed-to-databases-files"},{"slug":"release-notes/2016/04/terminus-0-11-1-released"},{"slug":"release-notes/2016/04/new-terminus-plugins-for-quicksilver-integrations"},{"slug":"release-notes/2016/04/documentation"},{"slug":"release-notes/2016/03/terminus-0-11-0-released"},{"slug":"release-notes/2016/03/freezing-inactive-sites"},{"slug":"release-notes/2016/03/documentation"},{"slug":"release-notes/2016/02/wordpress-core-updates"},{"slug":"release-notes/2016/02/wordpress-at-scale"},{"slug":"release-notes/2016/02/terminus-0-10-2-released"},{"slug":"release-notes/2016/02/platform-domains"},{"slug":"release-notes/2016/02/end-of-life-for-drupal-6"},{"slug":"release-notes/2016/02/documentation"},{"slug":"release-notes/2016/02/code-archives"},{"slug":"release-notes/2016/02/cloud-integration-tools"},{"slug":"release-notes/2016/01/terminus-0-10-2-released"},{"slug":"release-notes/2016/01/quicksilver-platform-hooks-are-now-available"},{"slug":"release-notes/2016/01/pantheon-hud-plugin"},{"slug":"release-notes/2016/01/machine-token-authentication"},{"slug":"release-notes/2016/01/documentation"},{"slug":"release-notes/2015/12/documentation"},{"slug":"release-notes/2015/10/wp-cli-search-replace"},{"slug":"release-notes/2015/10/terminus-commands-updated"},{"slug":"release-notes/2015/10/terminus-0-9-2-released"},{"slug":"release-notes/2015/10/organization-renaming"},{"slug":"release-notes/2015/10/edge-cache-upgraded-to-varnish-4"},{"slug":"release-notes/2015/10/drupal-8-rc2-released-and-available"},{"slug":"release-notes/2015/10/drupal-7-defaults-to-php-5-5"},{"slug":"release-notes/2015/10/documentation"},{"slug":"release-notes/2015/09/terminus-0-8-0"},{"slug":"release-notes/2015/09/pantheon-enterprise-is-now-available"},{"slug":"release-notes/2015/09/login-destination"},{"slug":"release-notes/2015/09/documentation"},{"slug":"release-notes/2015/08/terminus-cli-version-0-7-1"},{"slug":"release-notes/2015/08/saint-mode-saves-your-images"},{"slug":"release-notes/2015/08/php-default-arg-separator"},{"slug":"release-notes/2015/08/php-5-5-opcache-revalidate-freq-value-is-now-set-to-zero"},{"slug":"release-notes/2015/08/nginx-conf-update-for-photon"},{"slug":"release-notes/2015/08/documentation"},{"slug":"release-notes/2015/07/wordpress-4-2-3-is-live"},{"slug":"release-notes/2015/07/scripts-to-quickly-make-a-drupal-7-project-using-composer"},{"slug":"release-notes/2015/07/multidev-ui-updated"},{"slug":"release-notes/2015/07/kalabox-2-pantheon"},{"slug":"release-notes/2015/07/documentation"},{"slug":"release-notes/2015/06/walkme-tours"},{"slug":"release-notes/2015/06/single-sign-on-sso-release"},{"slug":"release-notes/2015/06/improved-workflows-notifications"},{"slug":"release-notes/2015/06/documentation"},{"slug":"release-notes/2015/05/webinars"},{"slug":"release-notes/2015/05/free-backups"},{"slug":"release-notes/2015/05/dashboard-load-times"},{"slug":"release-notes/2015/05/barrel-roll-reboots"},{"slug":"release-notes/2015/04/wordpress-launch-check"},{"slug":"release-notes/2015/04/wordpress-core-updates-to-4-2-1"},{"slug":"release-notes/2015/04/styx-to-appserver-encryption"},{"slug":"release-notes/2015/04/saml-users"},{"slug":"release-notes/2015/04/fedora-update"},{"slug":"release-notes/2015/04/edge-cache-configuration-update"},{"slug":"release-notes/2015/04/documentation"},{"slug":"release-notes/2015/03/terminus-improvement"},{"slug":"release-notes/2015/03/drupal-7-35-update"},{"slug":"release-notes/2015/03/documentation"},{"slug":"release-notes/2015/03/dashboard-optimization"},{"slug":"release-notes/2015/02/varnish-testing-harness"},{"slug":"release-notes/2015/02/try-drupal-8-beta"},{"slug":"release-notes/2015/02/terminus-0-5-released"},{"slug":"release-notes/2015/02/new-wordpress-upstream"},{"slug":"release-notes/2015/02/documentation"},{"slug":"release-notes/2015/01/supporting-orgs-multi-org"},{"slug":"release-notes/2015/01/php-upgrade"},{"slug":"release-notes/2015/01/concerned-about-cve-2015-0235-aka-ghost"}],"categories":["drupal","modules","action-required","infrastructure","security","wordpress","tools-apis","new-feature","user-interface","performance","content-publisher","plugins","deprecated","general","billing","account-management","documentation","policy","front-end-sites"]} \ No newline at end of file diff --git a/seed/create-content-structure.ts b/seed/create-content-structure.ts deleted file mode 100644 index 4e514151f0..0000000000 --- a/seed/create-content-structure.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { getOmniItems } from "@/components/omni-components"; -import { OmniItem } from "@/components/omni-components/helpers"; -import { ContentStructureItem, updateContentStructure } from "@/lib/ingestion"; -import { fetchArticleBySlug, singleSlugForFetch } from "@/lib/page-utils"; -import { writeFileSync } from "fs"; -import { join } from "path"; - -let processed = 0; -const token = process.env.PCC_TOKEN || ""; -const siteId = process.env.PCC_SITE_ID || ""; -const managementToken = process.env.PCC_MANAGEMENT_TOKEN || ""; - -const processOmniItems = async ( - omniItem: OmniItem -): Promise => { - processed++; - console.log(`Processed: ${processed}`); - let { link, title, children } = omniItem; - - console.log(`Processing link:`, link); - - if (link.startsWith("/")) { - link = link.slice(1); - } - if (link.endsWith("/")) { - link = link.slice(0, -1); - } - - let slug = singleSlugForFetch(link); - - console.log(`Processing slug:`, slug); - - const article = await fetchArticleBySlug(slug, siteId, token, { - withContent: false, - withMetadata: false, - }); - - if (!article) { - return null; - } - - let updatedChildren: ContentStructureItem[] = []; - - if (children && children.length > 0) { - // process in batches of 20 - const batchSize = 20; - const batches = []; - for (let i = 0; i < children.length; i += batchSize) { - batches.push(children.slice(i, i + batchSize)); - } - - for (const batch of batches) { - let innerChilren: ContentStructureItem[] = []; - for (const child of batch) { - try { - const result = await processOmniItems(child); - if (result) { - innerChilren.push(result); - } - } catch (error) { - console.error(`Error processing child:`, error); - } - } - updatedChildren.push(...innerChilren); - // wait for 500ms - await new Promise((resolve) => setTimeout(resolve, 1_000)); - } - } - - console.log(`Updated children:`, updatedChildren); - - return { - children: updatedChildren, - id: article.id, - isHidden: false, - type: "article", - name: omniItem.title, - slug: singleSlugForFetch(omniItem.link), - published: true, - }; -}; - -const main = async () => { - const omniItems = await getOmniItems(); - - const active: ContentStructureItem[] = []; - - for (const omniItem of omniItems) { - const contentStructureItem = await processOmniItems(omniItem); - if (contentStructureItem) { - active.push(contentStructureItem); - } - } - - writeFileSync( - join(process.cwd(), "active.json"), - JSON.stringify(active, null, 2) - ); - - await updateContentStructure( - siteId, - { - contentStructure: { - active, - uncategorized: [], - }, - }, - managementToken - ); -}; - -main().then(console.log).catch(console.error); diff --git a/seed/helper.ts b/seed/helper.ts deleted file mode 100644 index 91406137ba..0000000000 --- a/seed/helper.ts +++ /dev/null @@ -1,648 +0,0 @@ -import { getGlossaryPageData } from "@/lib/glossary"; -import { - createArticle, - disconnectArticle, - ingestMarkdown, - updateMetadata, -} from "@/lib/ingestion"; -import { - BasePageDataWithoutComponent, - fetchArticleBySlug, - PageDataWithoutComponent, - singleSlugForFetch as normalizeSlug, - getAllReleaseNotes, -} from "@/lib/page-utils"; -import { getFilesByExtension } from "@/server/processor/helper"; -import { ProcessedJsonFile, processFile } from "@/server/processor/json"; -import { processDirectoryForMarkDown } from "@/server/processor/mdx"; -import { ProcessedYamlFile, processYamlFile } from "@/server/processor/yaml"; -import { writeFileSync } from "fs"; -import path, { join } from "path"; - -const getDateFromFilename = (filename: string): Date | null => { - // Extract date from filename like "2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md" - const dateMatch = filename.match(/^(\d{4}-\d{2}-\d{2})-/); - - if (dateMatch) { - const dateString = dateMatch[1]; - const date = new Date(dateString); - - // Check if the date is valid - if (!isNaN(date.getTime())) { - return date; - } - } - - return null; -}; - -async function saveDataAfterPreProcessing( - content: string, - page: Omit, - article: { id: string }, - ingestDate: Date = new Date() -) { - const lines = content - .replaceAll("![", "__IMAGE_REPLACEMENT_MARKER__") - .split("\n"); - const batches: string[] = []; - for (let i = 0; i < lines.length; i += 10000) { - batches.push(lines.slice(i, i + 10000).join("\n")); - } - - let i = 0; - console.log("Processing. Ingest Markdown", page.uri); - - for (const batch of batches) { - i++; - if (i > 1) { - console.error("Breaking"); - break; - } - try { - await ingestMarkdown(article.id, { - content: JSON.stringify({ content: batch }), - publishLevel: "prod", - contentType: "markdown", - docName: page.title, - docRevisionDate: ingestDate.getTime(), - }); - console.log(i); - } catch (err) { - console.error(err); - throw err; - } - } -} - -export const processPage = async ( - page: PageDataWithoutComponent, - allowFetch: boolean = true, - siteId: string = process.env.PCC_SITE_ID || "", - token: string = process.env.PCC_TOKEN || "" -) => { - if (page.uri.startsWith("wordpress-known-issues")) { - return; - } - - if (page.uri.startsWith("terminus/commands")) { - return; - } - - if (!allowFetch) { - console.log({ - uri: page.uri, - type: page.type, - title: page.title, - normalized: normalizeSlug(page.uri), - }); - - if (page.type !== "doc") { - return; - } - - let article = await fetchArticleBySlug( - normalizeSlug(page.uri), - siteId, - token, - { - withContent: false, - withMetadata: true, - } - ); - - if (!article) { - return; - } - - if (article.title !== page.title) { - console.log("Updating metadata", article.id, page.title); - await updateMetadata(article.id, { - title: page.title, - metadataFields: { - ...article.metadata, - title: page.title, - description: page.description, - }, - }); - console.log("Updated metadata", article.id, page.title); - } - - return; - } - - console.log("processing", page.type, page.uri, page.relativeFilePath); - - if (page.type === "release-note") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - const { content, internal, ...doc } = page.data.node; - const date = getDateFromFilename( - doc.relativePath.split("releasenotes/")[1] - ); - - if (!date) { - console.log("No date found for release note", doc.relativePath); - throw new Error("No date found for release note" + page.uri); - } - - if (article) { - return; - } - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: doc.frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing( - page.rawFileData, - page, - article, - getDateFromFilename(doc.relativePath) ?? new Date() - ); - } - - if (page.type === "guide") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.guide; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "doc") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - if (article) { - return; - } - - const { content, frontmatter, internal, ...doc } = page.data.doc; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "landing") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - console.log(page); - - if (article) { - return; - } - - console.log(article); - - const landing = page.data.landing; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - description: page.description, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(JSON.stringify(landing), page, article); - } - - if (page.type === "iframe-embed") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.iframeEmbed; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } -}; - -export const updatePartials = async ( - allowFetch: boolean = true, - filter: (filePath: string) => boolean = (filePath) => { - return filePath.endsWith(".md") || filePath.endsWith(".mdx"); - } -) => { - if (!allowFetch) { - return; - } - - const files = processDirectoryForMarkDown("source/content/partials", { - filter, - }); - - for (const file of files) { - const slug = normalizeSlug( - file.relativePath.split("source/content/partials/")[1] - ); - console.log({ slug }); - let article = await fetchArticleBySlug(slug); - if (article) { - continue; - } - - if (!article) { - article = await createArticle({ - title: file.frontmatter.title ?? "partial-file", - contentType: "TEXT_MARKDOWN", - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: slug, - type: "partial", - relativePath: file.relativePath, - }, - tags: [], - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing( - file.internal.content, - { - uri: slug, - title: file.frontmatter.title ?? "partial-file", - description: file.frontmatter.description ?? "partial-file", - rawFileData: file.content, - }, - article - ); - - console.log("Updated article", article); - } -}; - -export const updateGlossary = async (allowFetch: boolean = true) => { - if (!allowFetch) { - return; - } - - const { allDefs, letters } = await getGlossaryPageData(); - - const slug = "glossary"; - let article = await fetchArticleBySlug(slug); - - if (!article) { - article = await createArticle({ - title: "Glossary", - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: slug, - type: "glossary", - relativePath: "glossary.md", - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing( - JSON.stringify({ allDefs, letters }), - { - uri: slug, - title: "Glossary", - description: "Glossary", - rawFileData: JSON.stringify({ allDefs, letters }), - }, - article - ); -}; -export const updateJSONFiles = async ( - allowFetch = true, - filter: (filePath: string) => boolean = (filePath) => { - return filePath.endsWith(".json"); - } -) => { - if (!allowFetch) { - return; - } - - const files = getFilesByExtension( - join(path.resolve(process.cwd(), "src"), "source"), - [".json"] - ); - - const filteredFiles = files.filter(filter); - - const jsonFiles = filteredFiles - .map(processFile) - .filter((file): file is ProcessedJsonFile => file !== null); - - for (const file of jsonFiles) { - if (file.fileName.startsWith(".")) { - continue; - } - - console.log("fetching", normalizeSlug(`${file.fileName}-json-file`)); - let article = await fetchArticleBySlug( - normalizeSlug(`${file.fileName}-json-file`) - ); - if (article) { - continue; - } - - if (!article) { - console.log("article not found", file.fileName); - article = await createArticle({ - title: `${file.fileName}-json-file`, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - title: file.fileName, - slug: `${file.fileName}-json-file`, - type: "json", - relativePath: file.relativePath, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - } - - try { - await saveDataAfterPreProcessing( - JSON.stringify({ content: file.content }), - { - uri: file.fileName, - title: file.fileName, - description: file.fileName, - rawFileData: JSON.stringify({ content: file.content }), - }, - article - ); - } catch (err) { - try { - await disconnectArticle(article.id); - } catch {} - console.log("disconnected article", article.id); - continue; - } - } -}; - -export const updateYamlFiles = async ( - allowFetch = true, - filter: (filePath: string) => boolean = (filePath) => { - return filePath.endsWith(".yaml"); - } -) => { - if (!allowFetch) { - return; - } - - const files = getFilesByExtension( - join(path.resolve(process.cwd(), "src"), "source"), - [".yaml", ".yml"] - ); - - const filteredFiles = files.filter(filter); - - const yamlFiles = filteredFiles - .map(processYamlFile) - .filter((file): file is ProcessedYamlFile => file !== null); - - for (const file of yamlFiles) { - if (file.fileName.startsWith(".")) { - continue; - } - - console.log("fetching", normalizeSlug(`${file.fileName}-yaml-file`)); - let article = await fetchArticleBySlug( - normalizeSlug(`${file.fileName}-yaml-file`) - ); - if (article) { - continue; - } - - if (!article) { - console.log("article not found", file.fileName); - article = await createArticle({ - title: `${file.fileName}-yaml-file`, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - title: file.fileName, - slug: `${file.fileName}-yaml-file`, - type: "yaml", - relativePath: file.relativePath, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - } - - try { - await saveDataAfterPreProcessing( - JSON.stringify({ content: file.content }), - { - uri: file.fileName, - title: file.fileName, - description: file.fileName, - rawFileData: JSON.stringify({ content: file.content }), - }, - article - ); - } catch (err) { - try { - await disconnectArticle(article.id); - } catch {} - console.log("disconnected article", article.id); - continue; - } - } -}; - -export const updateReleaseNotesListing = async (allowFetch = true) => { - if (!allowFetch) { - return; - } - - const allReleaseNotes = getAllReleaseNotes(); - const categories = allReleaseNotes.map((releaseNote) => { - return { - node: { - frontmatter: { - categories: releaseNote.frontmatter.categories ?? [], - }, - }, - }; - }); - const releaseNotes = getAllReleaseNotes().map((releaseNote) => { - const { content, internal, ...doc } = releaseNote; - return { slug: doc.fields.slug }; - }); - const allCategories = Array.from( - new Set(categories.map((c) => c.node.frontmatter.categories).flat()) - ); - - const slug = "release-notes-listing"; - - let article = await fetchArticleBySlug(slug); - - if (!article) { - article = await createArticle({ - title: "Release Notes Listing", - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: slug, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log(article); - - const content = JSON.stringify({ releaseNotes, categories: allCategories }); - - console.log(content); - - writeFileSync("release-notes-listing.json", content); - - await saveDataAfterPreProcessing( - content, - { - uri: slug, - title: "Release Notes Listing", - description: "Release Notes Listing", - rawFileData: content, - }, - article - ); - - // map categories to release note slugs - { - const categoryToReleaseNoteSlugs: Record = {}; - allReleaseNotes.map((e) => { - e.frontmatter.categories?.map((category) => { - if (!categoryToReleaseNoteSlugs[category]) { - categoryToReleaseNoteSlugs[category] = []; - } - categoryToReleaseNoteSlugs[category].push(e.fields.slug); - }); - }); - - const slug = "release-notes-listing-with-categories"; - - let article = await fetchArticleBySlug(slug); - - if (!article) { - article = await createArticle({ - title: "Release Notes Listing with Categories", - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: slug, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - } - - await saveDataAfterPreProcessing( - JSON.stringify({ categoryToReleaseNoteSlugs }), - { - uri: slug, - title: "Release Notes Listing with Categories", - description: "Release Notes Listing with Categories", - rawFileData: JSON.stringify({ categoryToReleaseNoteSlugs }), - }, - article - ); - } -}; diff --git a/seed/initial-without-stringify.ts b/seed/initial-without-stringify.ts deleted file mode 100644 index 584f7792e9..0000000000 --- a/seed/initial-without-stringify.ts +++ /dev/null @@ -1,616 +0,0 @@ -import { - BasePageDataWithoutComponent, - fetchArticleBySlug, - getAllPages, - getAllReleaseNotes, - PageDataWithoutComponent, - singleSlugForFetch as normalizeSlug, -} from "@/lib/page-utils"; -import { - createArticle, - disconnectArticle, - ingestMarkdown, - updateMetadata, -} from "../src/lib/ingestion"; -import { ProcessedJsonFile, processFile } from "@/server/processor/json"; -import { getFilesByExtension } from "@/server/processor/helper"; -import path from "path"; -import { join } from "path"; -import { getGlossaryPageData } from "@/lib/glossary"; -import { processDirectoryForMarkDown } from "@/server/processor/mdx"; - -const allowFetch = true; -process.env.SERVE_LOCAL = "true"; - -const token = process.env.PCC_TOKEN || ""; -const siteId = process.env.PCC_SITE_ID || ""; -const managementToken = process.env.PCC_MANAGEMENT_TOKEN || ""; - -const getDateFromFilename = (filename: string): Date | null => { - // Extract date from filename like "2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md" - const dateMatch = filename.match(/^(\d{4}-\d{2}-\d{2})-/); - - if (dateMatch) { - const dateString = dateMatch[1]; - const date = new Date(dateString); - - // Check if the date is valid - if (!isNaN(date.getTime())) { - return date; - } - } - - return null; -}; - -const processPage = async (page: PageDataWithoutComponent) => { - if (page.uri.startsWith("wordpress-known-issues")) { - return; - } - - if (page.uri.startsWith("terminus/commands")) { - return; - } - - if (!allowFetch) { - console.log({ - uri: page.uri, - type: page.type, - title: page.title, - normalized: normalizeSlug(page.uri), - }); - - if (page.type === "doc") { - console.log("Skipping doc", page.uri); - return; - } - - let article = await fetchArticleBySlug( - normalizeSlug(page.uri), - siteId, - token, - { - withContent: false, - withMetadata: true, - } - ); - - if (!article) { - return; - } - - if (article.title !== page.title) { - console.log("Updating metadata", article.id, page.title); - await updateMetadata( - article.id, - { - title: page.title, - metadataFields: { - ...article.metadata, - title: page.title, - description: page.description, - }, - }, - managementToken - ); - console.log("Updated metadata", article.id, page.title); - } - - return; - } - - if (page.type === "release-note") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - const { content, internal, ...doc } = page.data.node; - const date = getDateFromFilename( - doc.relativePath.split("releasenotes/")[1] - ); - - if (!date) { - console.log("No date found for release note", doc.relativePath); - throw new Error("No date found for release note" + page.uri); - } - - if (article) { - return; - } - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle( - { - title: page.title, - siteId: siteId, - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: doc.frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing( - page.rawFileData, - page, - article, - getDateFromFilename(doc.relativePath) ?? new Date() - ); - } - - if (page.type === "guide") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.guide; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle( - { - title: page.title, - siteId: siteId, - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "doc") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - if (article) { - return; - } - - const { content, frontmatter, internal, ...doc } = page.data.doc; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle( - { - title: page.title, - siteId: siteId, - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "landing") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - console.log(page); - - if (article) { - return; - } - - console.log(article); - - const landing = page.data.landing; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle( - { - title: page.title, - siteId: siteId, - metadataFields: { - slug: page.uri, - type: page.type, - description: page.description, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(JSON.stringify(landing), page, article); - } - - if (page.type === "iframe-embed") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.iframeEmbed; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle( - { - title: page.title, - siteId: siteId, - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } -}; - -const updateReleaseNotesListing = async () => { - if (!allowFetch) { - return; - } - - const allReleaseNotes = getAllReleaseNotes(); - const categories = allReleaseNotes.map((releaseNote) => { - return { - node: { - frontmatter: { - categories: releaseNote.frontmatter.categories ?? [], - }, - }, - }; - }); - const releaseNotes = getAllReleaseNotes().map((releaseNote) => { - const { content, internal, ...doc } = releaseNote; - return { slug: doc.fields.slug }; - }); - const allCategories = Array.from( - new Set(categories.map((c) => c.node.frontmatter.categories).flat()) - ); - - const slug = "release-notes-listing"; - let article = await fetchArticleBySlug(slug); - - if (!article) { - article = await createArticle( - { - title: "Release Notes Listing", - siteId: siteId, - metadataFields: { - slug: slug, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - console.log(article); - - const content = JSON.stringify({ releaseNotes, categories: allCategories }); - - console.log(content); - - // writeFileSync("release-notes-listing.json", content); - - await saveDataAfterPreProcessing( - content, - { - uri: slug, - title: "Release Notes Listing", - description: "Release Notes Listing", - rawFileData: content, - }, - article - ); -}; - -const updateAllJSON = async () => { - if (!allowFetch) { - return; - } - - const files = getFilesByExtension( - join(path.resolve(process.cwd(), "src"), "source"), - [".json"] - ); - - const jsonFiles = files - .map(processFile) - .filter((file): file is ProcessedJsonFile => file !== null); - - for (const file of jsonFiles) { - if (file.fileName.startsWith(".")) { - continue; - } - - console.log("fetching", normalizeSlug(`${file.fileName}-json-file`)); - let article = await fetchArticleBySlug( - normalizeSlug(`${file.fileName}-json-file`) - ); - if (article) { - continue; - } - - if (!article) { - console.log("article not found", file.fileName); - article = await createArticle( - { - title: `${file.fileName}-json-file`, - siteId: siteId, - metadataFields: { - title: file.fileName, - slug: `${file.fileName}-json-file`, - type: "json", - relativePath: file.relativePath, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - } - - try { - await saveDataAfterPreProcessing( - JSON.stringify({ content: file.content }), - { - uri: file.fileName, - title: file.fileName, - description: file.fileName, - rawFileData: JSON.stringify({ content: file.content }), - }, - article - ); - } catch (err) { - try { - await disconnectArticle(article.id, managementToken); - } catch {} - console.log("disconnected article", article.id); - continue; - } - } -}; - -const updateGlossary = async () => { - if (!allowFetch) { - return; - } - - const { allDefs, letters } = await getGlossaryPageData(); - - const slug = "glossary"; - let article = await fetchArticleBySlug(slug); - - if (!article) { - article = await createArticle( - { - title: "Glossary", - siteId: siteId, - metadataFields: { - slug: slug, - type: "glossary", - relativePath: "glossary.md", - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }, - managementToken - ); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing( - JSON.stringify({ allDefs, letters }), - { - uri: slug, - title: "Glossary", - description: "Glossary", - rawFileData: JSON.stringify({ allDefs, letters }), - }, - article - ); -}; - -const updatePartials = async () => { - if (!allowFetch) { - return; - } - - const files = processDirectoryForMarkDown("source/content/partials", {}); - - if (files.length > 0) { - // Process files in batches of 25 - const batchSize = 25; - for (let i = 0; i < files.length; i += batchSize) { - const batch = files.slice(i, i + batchSize); - if (allowFetch) { - console.log( - `Processing partials batch ${Math.floor(i / batchSize) + 1} of ${Math.ceil(files.length / batchSize)}` - ); - } - - // Process batch in parallel - await Promise.all( - batch.map(async (file) => { - const slug = normalizeSlug( - file.relativePath.split("source/content/partials/")[1] - ); - console.log(slug); - let article = await fetchArticleBySlug(slug); - if (article) { - return; - } - - if (!article) { - article = await createArticle( - { - title: file.frontmatter.title ?? "partial-file", - contentType: "TEXT_MARKDOWN", - siteId: siteId, - metadataFields: { - slug: slug, - type: "partial", - relativePath: file.relativePath, - }, - tags: [], - }, - managementToken - ); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing( - file.internal.content, - { - uri: slug, - title: file.frontmatter.title ?? "partial-file", - description: file.frontmatter.description ?? "partial-file", - rawFileData: file.content, - }, - article - ); - }) - ); - } - } -}; - -const main = async () => { - await updatePartials(); - await updateGlossary(); - await updateAllJSON(); - await updateReleaseNotesListing(); - - let pages: PageDataWithoutComponent[] = await getAllPages(); - pages = pages.slice(60); - if (pages.length > 0) { - // Process pages in batches of 8 - const batchSize = 8; - for (let i = 0; i < pages.length; i += batchSize) { - const batch = pages.slice(i, i + batchSize); - if (allowFetch) { - console.log( - `Processing batch ${Math.floor(i / batchSize) + 1} of ${Math.ceil(pages.length / batchSize)}` - ); - } - - // Process batch in parallel - await Promise.all(batch.map((page) => processPage(page))); - } - } - - // store JSON and YAML files -}; - -main().catch(console.error); - -async function saveDataAfterPreProcessing( - content: string, - page: Omit, - article: { id: string }, - ingestDate: Date = new Date() -) { - const lines = content - .replaceAll("![", "__IMAGE_REPLACEMENT_MARKER__") - .split("\n"); - const batches: string[] = []; - for (let i = 0; i < lines.length; i += 10000) { - batches.push(lines.slice(i, i + 10000).join("\n")); - } - - let i = 0; - console.log("Processing. Ingest Markdown", page.uri); - - for (const batch of batches) { - i++; - if (i > 1) { - console.error("Breaking"); - break; - } - try { - const processedContent = (() => { - let stringContent = JSON.stringify({ - __PATHEON_SEPARATOR_CONTENT__: batch, - }); - // remove {"__PATHEON_SEPARATOR_CONTENT__": - stringContent = stringContent.replace( - `{"__PATHEON_SEPARATOR_CONTENT__":"`, - "" - ); - //remove last "}" - stringContent = stringContent.replace(`"}`, ""); - return stringContent; - })(); - - await ingestMarkdown( - article.id, - { - content: processedContent, - publishLevel: "prod", - contentType: "markdown", - docName: page.title, - docRevisionDate: ingestDate.getTime(), - }, - managementToken - ); - console.log(i); - } catch (err) { - console.error(err); - throw err; - } - } -} diff --git a/seed/initial.ts b/seed/initial.ts deleted file mode 100644 index 9140c1cd80..0000000000 --- a/seed/initial.ts +++ /dev/null @@ -1,341 +0,0 @@ -import { - BasePageDataWithoutComponent, - fetchArticleBySlug, - getAllPages, - PageDataWithoutComponent, - singleSlugForFetch as normalizeSlug, -} from "@/lib/page-utils"; -import { - createArticle, - ingestMarkdown, - updateMetadata, -} from "../src/lib/ingestion"; -import { - updateGlossary, - updateJSONFiles, - updatePartials, - updateReleaseNotesListing, -} from "./helper"; - -const allowFetch = false; -process.env.SERVE_LOCAL = "true"; - -const token = process.env.PCC_TOKEN || ""; -const siteId = process.env.PCC_SITE_ID || ""; - -const getDateFromFilename = (filename: string): Date | null => { - // Extract date from filename like "2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md" - const dateMatch = filename.match(/^(\d{4}-\d{2}-\d{2})-/); - - if (dateMatch) { - const dateString = dateMatch[1]; - const date = new Date(dateString); - - // Check if the date is valid - if (!isNaN(date.getTime())) { - return date; - } - } - - return null; -}; - -const processPage = async (page: PageDataWithoutComponent) => { - if (page.uri.startsWith("wordpress-known-issues")) { - return; - } - - if (page.uri.startsWith("terminus/commands")) { - return; - } - - if (!allowFetch) { - console.log({ - uri: page.uri, - type: page.type, - title: page.title, - normalized: normalizeSlug(page.uri), - }); - - if (page.type !== "doc") { - return; - } - - let article = await fetchArticleBySlug( - normalizeSlug(page.uri), - siteId, - token, - { - withContent: false, - withMetadata: true, - } - ); - - if (!article) { - return; - } - - if (article.title !== page.title) { - console.log("Updating metadata", article.id, page.title); - await updateMetadata(article.id, { - title: page.title, - metadataFields: { - ...article.metadata, - title: page.title, - description: page.description, - }, - }); - console.log("Updated metadata", article.id, page.title); - } - - return; - } - - if (page.type === "release-note") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - const { content, internal, ...doc } = page.data.node; - const date = getDateFromFilename( - doc.relativePath.split("releasenotes/")[1] - ); - - if (!date) { - console.log("No date found for release note", doc.relativePath); - throw new Error("No date found for release note" + page.uri); - } - - if (article) { - return; - } - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: doc.frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing( - page.rawFileData, - page, - article, - getDateFromFilename(doc.relativePath) ?? new Date() - ); - } - - if (page.type === "guide") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.guide; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - prev: page.data.prev, - next: page.data.next, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "doc") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - if (article) { - return; - } - - const { content, frontmatter, internal, ...doc } = page.data.doc; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } - - if (page.type === "landing") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - console.log(page); - - if (article) { - return; - } - - console.log(article); - - const landing = page.data.landing; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - description: page.description, - }, - tags: [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - await saveDataAfterPreProcessing(JSON.stringify(landing), page, article); - } - - if (page.type === "iframe-embed") { - let article: { id: string } = await fetchArticleBySlug( - normalizeSlug(page.uri) - ); - - if (article) { - return; - } - const { content, frontmatter, internal, ...doc } = page.data.iframeEmbed; - - if (!article) { - console.log("article not found", page.uri); - article = await createArticle({ - title: page.title, - siteId: process.env.PCC_SITE_ID || "", - metadataFields: { - slug: page.uri, - type: page.type, - relativePath: doc.relativePath, - description: page.description, - title: page.title, - }, - tags: frontmatter.tags ?? [], - contentType: "TEXT_MARKDOWN", - }); - console.log("Created article", article); - } - - console.log("saving data", page.uri); - - await saveDataAfterPreProcessing(page.rawFileData, page, article); - } -}; - -const main = async () => { - await updatePartials(allowFetch); - await updateGlossary(allowFetch); - await updateJSONFiles(allowFetch); - await updateReleaseNotesListing(allowFetch); - - const pages: PageDataWithoutComponent[] = await getAllPages(); - if (pages.length > 0) { - // Process pages in batches of 8 - const batchSize = 8; - for (let i = 0; i < pages.length; i += batchSize) { - const batch = pages.slice(i, i + batchSize); - if (allowFetch) { - console.log( - `Processing batch ${Math.floor(i / batchSize) + 1} of ${Math.ceil(pages.length / batchSize)}` - ); - } - - // Process batch in parallel - await Promise.all(batch.map((page) => processPage(page))); - } - } - - // store JSON and YAML files -}; - -main().catch(console.error); - -async function saveDataAfterPreProcessing( - content: string, - page: Omit, - article: { id: string }, - ingestDate: Date = new Date() -) { - const lines = content - .replaceAll("![", "__IMAGE_REPLACEMENT_MARKER__") - .split("\n"); - const batches: string[] = []; - for (let i = 0; i < lines.length; i += 10000) { - batches.push(lines.slice(i, i + 10000).join("\n")); - } - - let i = 0; - console.log("Processing. Ingest Markdown", page.uri); - - for (const batch of batches) { - i++; - if (i > 1) { - console.error("Breaking"); - break; - } - try { - await ingestMarkdown(article.id, { - content: JSON.stringify({ content: batch }), - publishLevel: "prod", - contentType: "markdown", - docName: page.title, - docRevisionDate: ingestDate.getTime(), - }); - console.log(i); - } catch (err) { - console.error(err); - throw err; - } - } -} diff --git a/seed/update.ts b/seed/update.ts deleted file mode 100644 index 32fb6801e3..0000000000 --- a/seed/update.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { getAllPages } from "@/lib/page-utils"; -import { readFileSync } from "node:fs"; -import { - processPage, - updateGlossary, - updateJSONFiles, - updatePartials, - updateReleaseNotesListing, - updateYamlFiles, -} from "./helper"; - -process.env.SERVE_LOCAL = "true"; - -if (!process.env.PCC_SITE_ID) { - throw new Error("PCC_SITE_ID is not set"); -} - -if (!process.env.PCC_TOKEN) { - throw new Error("PCC_TOKEN is not set"); -} - -if (!process.env.PCC_MANAGEMENT_TOKEN) { - throw new Error("PCC_MANAGEMENT_TOKEN is not set"); -} - -const files = readFileSync("/tmp/changed_files.txt", "utf-8") - .toString() - .split("\n"); - -const filteredFiles = files.filter((e) => e.startsWith("src/source")); - -const main = async () => { - const mdxFiles = filteredFiles.filter( - (e) => e.endsWith(".md") || e.endsWith(".mdx") - ); - - console.log({ mdxFiles }); - // if mdx, then we need to update the page - const pages = await getAllPages(); - const pagesToUpdate = pages.filter((page) => - mdxFiles.includes(page.relativeFilePath) - ); - - console.log({ pagesToUpdate: pagesToUpdate.map((e) => e.relativeFilePath) }); - - const batchSize = 8; - - for (let i = 0; i < pagesToUpdate.length / batchSize; i++) { - const batch = pagesToUpdate.slice(i * batchSize, (i + 1) * batchSize); - await Promise.all(batch.map((page) => processPage(page))); - console.log( - `Processed batch ${i + 1} of ${pagesToUpdate.length / batchSize}` - ); - } - - // if partials encountered, then we need to update the partials - await updatePartials(true, (page) => { - const splitPage = page.split("/src/source/"); - return mdxFiles.includes(`src/source/${splitPage[1]}`); - }); - - // if glossary encountered, then we need to update the glossary - // always update glossary - await updateGlossary(true); - - // if .json encountered, then we need to update the .json - const jsonFiles = filteredFiles.filter((e) => e.endsWith(".json")); - await updateJSONFiles(true, (page) => { - const splitPage = page.split("/src/source"); - - return jsonFiles.includes(`src/source${splitPage[1]}`); - }); - - // if .yaml encountered, then we need to update the .yaml - const yamlFiles = filteredFiles.filter( - (e) => e.endsWith(".yaml") || e.endsWith(".yml") - ); - - await updateYamlFiles(true, (page) => { - const splitPage = page.split("/src/source"); - const result = yamlFiles.includes(`src/source${splitPage[1]}`); - return result; - }); - - // if release-notes/ updated, then we need to update release-notes listing - if (mdxFiles.some((e) => e.includes("src/source/releasenotes/"))) { - await updateReleaseNotesListing(true); - } -}; - -main().catch(console.error); diff --git a/src/app/[...uri]/page.tsx b/src/app/[...uri]/page.tsx index 6e753a9337..5174dd5211 100644 --- a/src/app/[...uri]/page.tsx +++ b/src/app/[...uri]/page.tsx @@ -1,14 +1,7 @@ "use server"; import { notFound } from "next/navigation"; -import { - fetchArticleBySlug, - getAllPages, - singleSlugForFetch, -} from "@/lib/page-utils"; -import { resolveComponent, serveLocalAsync } from "@/lib/resolve-component"; -import { LandingTemplate } from "@/templates/landing"; -import { getMdxProcessed } from "@/server/processor/mdx"; -import { basename, join } from "path"; +import { getAllPages } from "@/lib/page-utils"; +import { resolveComponent } from "@/lib/resolve-component"; import { generateMetadataFromUri, GenerateMetadataParams, @@ -16,11 +9,6 @@ import { export interface DynamicViewProps { params: { uri: string[] }; - searchParams: { - publishingLevel: "PRODUCTION" | "REALTIME"; - pccGrant: string | undefined; - local: "true" | "false" | undefined; - }; } const getPages = async ( @@ -90,7 +78,6 @@ const getPages = async ( export default async function Page(props: { params: Promise; - searchParams: Promise; }) { // create landing pages for each of the pages in the data/landings.yaml file @@ -100,10 +87,7 @@ export default async function Page(props: { return notFound(); } - const { Component } = await getPages( - uri, - // await serveLocalAsync(props.searchParams) - ); + const { Component } = await getPages(uri); if (Component === null) { return notFound(); @@ -114,7 +98,6 @@ export default async function Page(props: { export async function generateMetadata(props: { params: Promise; - searchParams: Promise; }) { const { uri } = await props.params; @@ -125,10 +108,7 @@ export async function generateMetadata(props: { }; } - const { seoMetadata } = await getPages( - uri, - // await serveLocalAsync(props.searchParams) - ); + const { seoMetadata } = await getPages(uri); const { authors, ...returnData } = generateMetadataFromUri({ ...seoMetadata, diff --git a/src/app/glossary/page.tsx b/src/app/glossary/page.tsx index e1c0838393..b47f6ae8c6 100644 --- a/src/app/glossary/page.tsx +++ b/src/app/glossary/page.tsx @@ -8,41 +8,13 @@ import { DocsSidebarLayout } from "@/components/pds-middleware/docs-sidebar-layo import { MOBILE_MENU_BREAKPOINT } from "@/constants"; import HeaderBody from "@/components/common/header-body"; import { TOC } from "@/components/common/toc"; -import { AllDefs, getGlossaryPageData } from "@/lib/glossary"; -import { serveLocalAsync } from "@/lib/resolve-component"; -import { fetchArticleBySlug } from "@/lib/page-utils"; +import { getGlossaryPageData } from "@/lib/glossary"; import { generateMetadataFromUri } from "@/lib/site-metadata"; const converter = new showdown.Converter(); -const getPageData = async (useLocal: boolean) => { - if (!useLocal) { - try { - const article = await fetchArticleBySlug("glossary"); - const parsedContent = JSON.parse(JSON.parse(article.content).content); - - const { allDefs, letters } = parsedContent; - return { allDefs, letters } as { allDefs: AllDefs; letters: string[] }; - } catch (error) { - console.error("Error fetching glossary page data", error); - return { allDefs: [], letters: [] }; - } - } +export default async function GlossaryPage() { const { allDefs, letters } = await getGlossaryPageData(); - return { allDefs, letters }; -}; - -export default async function GlossaryPage(props: { - searchParams: Promise<{ - local: "true" | "false" | undefined; - }>; -}) { - // @todo, consider un-hardcoding this value. - // See https://github.com/pantheon-systems/documentation-in-nextjs/issues/32 - //const useLocal = await serveLocalAsync(props.searchParams); - const useLocal = true; - - const { allDefs, letters } = await getPageData(useLocal); return ( diff --git a/src/app/page.tsx b/src/app/page.tsx index 2d87dfb934..bc38fcc295 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,14 +10,6 @@ import { generateMetadataFromUri } from "@/lib/site-metadata"; const containerWidth = "standard"; export default async function Home() { - // Fetch the articles and site in parallel - // const [{ data: articles }, site] = await Promise.all([ - // PCCConvenienceFunctions.getPaginatedArticles({ - // pageSize: 3, - // }), - // PCCConvenienceFunctions.getSite(), - // ]); - const homeYaml = processDirectoryForYaml("source/data", { filter: (filePath) => filePath.includes("home.yaml"), })[0].content[0]; diff --git a/src/app/release-notes/[...uri]/page.tsx b/src/app/release-notes/[...uri]/page.tsx index 152450ba64..af4ed6f457 100644 --- a/src/app/release-notes/[...uri]/page.tsx +++ b/src/app/release-notes/[...uri]/page.tsx @@ -1,35 +1,19 @@ "use server"; -import { - fetchArticleBySlug, - getAllPages, - singleSlugForFetch, -} from "@/lib/page-utils"; -import { serveLocalAsync } from "@/lib/resolve-component"; +import { getAllPages } from "@/lib/page-utils"; import { generateMetadataFromUri } from "@/lib/site-metadata"; -import { getMdxProcessed } from "@/server/processor/mdx"; import { ReleaseNoteTemplate } from "@/templates/release-note"; import { ReleaseNoteListingTemplate } from "@/templates/release-note-listing"; -import { - getArticleBySlugOrId, - PCCConvenienceFunctions, -} from "@pantheon-systems/pcc-react-sdk/server"; import { notFound } from "next/navigation"; -import { basename, join } from "path"; export interface DynamicViewProps { params: Promise<{ uri: string[] }>; searchParams: Promise<{ - local: "true" | "false" | undefined; category?: string[]; }>; } -const getPage = async ( - uri: string[], - useLocal: boolean, - category?: string[] -) => { +const getPage = async (uri: string[], category?: string[]) => { if (uri.length === 1 && !Number.isNaN(parseInt(uri[0]))) { // list of articles @@ -80,7 +64,7 @@ export default async function Page(props: DynamicViewProps) { const { category } = await props.searchParams; - const { Component } = await getPage(uri, false, category); + const { Component } = await getPage(uri, category); if (Component === null) { return notFound(); diff --git a/src/components/grid.tsx b/src/components/grid.tsx deleted file mode 100644 index 2d8a7dffbe..0000000000 --- a/src/components/grid.tsx +++ /dev/null @@ -1,154 +0,0 @@ -"use client"; - -import type { - ArticleWithoutContent, - Site, -} from "@pantheon-systems/pcc-react-sdk"; -import { getArticleURLFromSite } from "@pantheon-systems/pcc-react-sdk/server"; -import Link from "next/link"; -import { useState } from "react"; -import { cn } from "@/lib/utils"; -import { Button } from "./ui/button"; - -export function HomepageArticleGrid({ - articles, - site, -}: { - articles: ArticleWithoutContent[]; - site: Site; -}) { - return ( -
- {articles.map((article, index) => ( - 2 && index === 2)} - site={site} - /> - ))} -
- ); -} - -export function ArticleGrid({ - articles, - basePath = "/articles", - site, -}: { - articles: ArticleWithoutContent[]; - basePath?: string; - site: Site; -}) { - return ( -
- {articles.map((article) => ( - - ))} -
- ); -} - -interface ArticleGridCardProps { - article: ArticleWithoutContent; - basePath?: string; - imageAltText?: string; - isWide?: boolean; - site: Site; -} - -export function ArticleGridCard({ - article, - basePath = "/articles", - imageAltText, - isWide = false, - site, -}: ArticleGridCardProps) { - const targetHref = getArticleURLFromSite(article, site, basePath); - const imageSrc = (article.metadata?.["image"] as string) || null; - - return ( -
-
- -
-
-
-

- {article.title} -

- {article.metadata?.["Description"] ? ( -

- {article.metadata?.["Description"]?.toString() || ""} -

- ) : null} -
- - - -
-
- ); -} - -function GridItemCoverImage({ - imageSrc, - imageAltText, -}: { - imageSrc: string | null; - imageAltText?: string | null | undefined; -}) { - const [hasLoaded, setHasLoaded] = useState(false); - - return ( - <> - {imageSrc != null ? ( - // eslint-disable-next-line @next/next/no-img-element - {imageAltText setHasLoaded(true)} - className={cn("h-full w-full object-cover", { - block: hasLoaded, - hidden: !hasLoaded, - })} - /> - ) : null} - - {imageSrc == null || !hasLoaded ? ( -
- ) : null} - - ); -} diff --git a/src/components/omniSideBarNav.tsx b/src/components/omniSideBarNav.tsx index 7d4f8e35fc..66950239f2 100644 --- a/src/components/omniSideBarNav.tsx +++ b/src/components/omniSideBarNav.tsx @@ -1,58 +1,21 @@ "use server"; -import { - findSubMenuItemsToUse, - getOmniSidebarActiveSection, -} from "./omni-components/helpers"; +import { getOmniSidebarActiveSection } from "./omni-components/helpers"; import { SideNavCompact } from "./ui/pds-re-export"; -import { Navbar } from "./common/navbar"; import { MOBILE_MENU_BREAKPOINT } from "@/constants"; import { getOmniItems } from "./omni-components"; import { turnItemsIntoLinks } from "./omni-components/client-helper"; export const OmniSidebarNav = async ({ activePage, - fallbackItems = null, - fallbackTitle = "", - submenuPathToUse = "", - slot = "", }: { activePage: string; - fallbackItems?: any[] | null; - fallbackTitle: string; - submenuPathToUse: string; - slot?: string; }) => { const OmniItems = await getOmniItems(); - /* Reporting debug code - const flattenedOmniItems = flattenOmniItems(OmniItems); - const results = CalculateFilteredPathsInMenu( - filteredWrittenPaths, - flattenedOmniItems, -); - console.log(results); - */ - const menuItems = getOmniSidebarActiveSection(activePage, OmniItems); - // If the caller is asking for a specific submenu, use that directly. - if (submenuPathToUse.length > 0) { - const submenuItems = findSubMenuItemsToUse(submenuPathToUse, OmniItems); - if (!submenuItems) { - return null; - } - const submenuLinks = turnItemsIntoLinks(submenuItems, activePage); - return ( - - ); - } else if (menuItems) { + if (menuItems) { const OmniLinks = turnItemsIntoLinks(menuItems, activePage); return ( ); - } else if (fallbackItems && fallbackItems.length > 0) { - return ( - <> - - - ); } else { return
; } diff --git a/src/components/ui/mdx-wrapper/default-components.tsx b/src/components/ui/mdx-wrapper/default-components.tsx index 66cddf1f3c..84a517d02b 100644 --- a/src/components/ui/mdx-wrapper/default-components.tsx +++ b/src/components/ui/mdx-wrapper/default-components.tsx @@ -1,5 +1,4 @@ -import { ComponentProps } from "react"; -import { ArticleRenderer } from "../pds-re-export"; +import { ReactNode } from "react"; import { Alert } from "@/components/common/alert"; import { Callout } from "@/components/common/callout"; import { Accordion } from "@/components/common/accordion"; @@ -29,7 +28,14 @@ import { Popover } from "@/components/common/popover"; import { Wistia } from "@/components/common/wistia"; import Enablement from "@/components/common/enablement"; -export type MdxWrapperProps = ComponentProps; +export interface MdxWrapperArticle { + content?: string; +} + +export interface MdxWrapperProps { + article: MdxWrapperArticle; + componentMap?: Record>; +} const ImageRenderer = async ({ src = "", alt }: any) => { let resolvedSrc = path.join(process.cwd(), "src", "source", "images", src); diff --git a/src/components/ui/pds-re-export.ts b/src/components/ui/pds-re-export.ts index f28b0ce980..3f468d8cdd 100644 --- a/src/components/ui/pds-re-export.ts +++ b/src/components/ui/pds-re-export.ts @@ -1,3 +1,2 @@ "use client"; export * from "@pantheon-systems/pds-toolkit-react"; -export * from "@pantheon-systems/pcc-react-sdk/components"; diff --git a/src/hooks/usePagination.ts b/src/hooks/usePagination.ts deleted file mode 100644 index 84b5c1f12a..0000000000 --- a/src/hooks/usePagination.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - ArticleWithoutContent, - PaginatedArticle, -} from "@pantheon-systems/pcc-react-sdk"; -import { useEffect, useState } from "react"; - -interface Props { - cursor?: string; - initialArticles?: PaginatedArticle[] | ArticleWithoutContent[]; - fetcher: (cursor: string | null | undefined) => Promise<{ - data: PaginatedArticle[] | ArticleWithoutContent[]; - newCursor: string; - }>; -} - -export function usePagination({ cursor, initialArticles, fetcher }: Props) { - const [currentCursor, setCurrentCursor] = useState(cursor); - const [articlePages, setArticlePages] = useState( - initialArticles ? [initialArticles] : [], - ); - const [fetching, setFetching] = useState(false); - const [currentPage, setCurrentPage] = useState(0); - - useEffect(() => { - (async () => { - if (articlePages[currentPage]) return; - - setFetching(true); - const { data, newCursor } = await fetcher(currentCursor); - setFetching(false); - setArticlePages((prev) => { - const result = [...prev]; - result[currentPage] = data; - return result; - }); - setCurrentCursor(newCursor); - })(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [currentPage]); - - return { - // Return last page if current page doesn't exist - data: articlePages[currentPage] || articlePages[articlePages.length - 1], - fetching, - onPageChange: setCurrentPage, - currentPage, - }; -} diff --git a/src/lib/ingestion.ts b/src/lib/ingestion.ts deleted file mode 100644 index 150c67b976..0000000000 --- a/src/lib/ingestion.ts +++ /dev/null @@ -1,242 +0,0 @@ -// Types for article creation -export type CreateArticleRequest = { - title: string; - siteId: string; - metadataFields: { - slug: string; - [key: string]: any; - }; - tags: string[]; - contentType: string; -}; - -export type CreateArticleResponse = { - id: string; -}; - -// Types for markdown ingestion -export type IngestMarkdownRequest = { - content: string; - publishLevel: "prod" | "realtime"; - contentType: "html" | "markdown"; - docName: string; - docRevisionDate: number; -}; - -export type IngestMarkdownResponse = { - success: boolean; - message?: string; -}; - -/** - * Creates an article using the Pantheon Content Cloud API - * @param articleData - The article data to create - * @returns Promise - The response containing the created article ID - */ -export const createArticle = async ( - articleData: CreateArticleRequest, - bearerToken: string = process.env.PCC_MANAGEMENT_TOKEN || "" -): Promise => { - const url = "https://addonapi-gfttxsojwq-uc.a.run.app/articles/create"; - - console.log( - "Creating article", - articleData.title, - articleData.metadataFields?.slug, - articleData.metadataFields?.uri - ); - try { - const response = await fetch(url, { - method: "POST", - headers: { - Authorization: `Bearer ${bearerToken}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(articleData), - }); - - if (!response.ok) { - console.error(await response.text()); - - throw new Error( - `HTTP error! status: ${response.status} ${JSON.stringify( - articleData.metadataFields - )}` - ); - } - - const data: CreateArticleResponse = await response.json(); - return data; - } catch (error) { - console.error("Error creating article:", error); - throw error; - } -}; - -/** - * Ingests markdown content using the Pantheon Content Cloud API - * @param articleId - The ID of the article to ingest content into - * @param ingestData - The markdown content and metadata to ingest - * @returns Promise - The response from the ingestion API - */ -export const ingestMarkdown = async ( - articleId: string, - ingestData: IngestMarkdownRequest, - token: string = process.env.PCC_MANAGEMENT_TOKEN || "" -): Promise => { - const url = `https://addonapi-gfttxsojwq-uc.a.run.app/articles/${articleId}/ingest`; - - try { - const response = await fetch(url, { - method: "POST", - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(ingestData), - }); - - if (!response.ok) { - console.error("Error ingesting markdown:", await response.text()); - throw new Error( - `HTTP failed to ingest markdown: ${response.status} ${response.statusText}` - ); - } - - const data: IngestMarkdownResponse = await response.json(); - return data; - } catch (error) { - console.error("Error ingesting markdown:", error); - throw error; - } -}; - -/** - * Disconnects an article from the content structure - * @param articleId - The ID of the article to disconnect - * @param bearerToken - The bearer token for the API - * @returns Promise - The response from the disconnect API - */ -export async function disconnectArticle( - articleId: string, - bearerToken: string = process.env.PCC_MANAGEMENT_TOKEN || "" -): Promise { - const baseUrl = "https://addonapi-gfttxsojwq-uc.a.run.app"; - - try { - const response = await fetch( - `${baseUrl}/articles/${articleId}/disconnect`, - { - method: "POST", - headers: { - Authorization: `Bearer ${bearerToken}`, - "Content-Type": "application/json", - }, - } - ); - - if (!response.ok) { - console.log(await response.text()); - throw new Error(`HTTP error! status: ${response.status}`); - } - - console.log(`Successfully disconnected article: ${articleId}`); - } catch (error) { - console.error(`Error disconnecting article ${articleId}:`, error); - throw error; - } -} - -export type ContentStructureItem = { - id: string; - hidden?: boolean; - isHidden?: boolean; - children: ContentStructureItem[]; -} & ( - | { - type: "article"; - name: string; - published: boolean; - slug: string; - } - | { - type: "category"; - name: string; - } -); - -export interface PantheonSite { - contentStructure: { - active: ContentStructureItem[]; - uncategorized: ContentStructureItem[]; - }; -} - -/** - * Updates the content structure for a site - * @param siteId - The ID of the site to update - * @param contentStructure - The content structure to update - * @param bearerToken - The bearer token for the API - * @returns Promise - The response from the update API - */ -export async function updateContentStructure( - siteId: string, - contentStructure: PantheonSite, - bearerToken: string = process.env.PCC_MANAGEMENT_TOKEN || "" -) { - const url = `https://addonapi-gfttxsojwq-uc.a.run.app/sites/${siteId}/contentStructure`; - - try { - const response = await fetch(url, { - method: "PATCH", - headers: { - Authorization: `Bearer ${bearerToken}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(contentStructure), - }); - - if (!response.ok) { - console.error("Error updating content structure:", await response.text()); - throw new Error(`HTTP error! status: ${response.status}`); - } - - console.log(`Successfully updated content structure for site: ${siteId}`); - - return response.text(); - } catch (error) { - console.error("Error updating content structure:", error); - throw error; - } -} - -export async function updateMetadata( - articleId: string, - metadata: any, - bearerToken: string = process.env.PCC_MANAGEMENT_TOKEN || "" -) { - const url = `https://addonapi-gfttxsojwq-uc.a.run.app/articles/${articleId}`; - - try { - const response = await fetch(url, { - method: "PATCH", - headers: { - Authorization: `Bearer ${bearerToken}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(metadata), - }); - - if (!response.ok) { - console.error("Error updating metadata:", await response.text()); - throw new Error(`HTTP error! status: ${response.status}`); - } - - console.log(`Successfully updated metadata for article: ${articleId}`); - - return response.text(); - } catch (error) { - console.error("Error updating metadata:", error); - throw error; - } -} diff --git a/src/lib/page-utils.ts b/src/lib/page-utils.ts index 7e02fed419..cd6f576925 100644 --- a/src/lib/page-utils.ts +++ b/src/lib/page-utils.ts @@ -143,21 +143,6 @@ export type PageData = PageDataWithoutComponent & { Component: React.ReactNode; }; -/* This helper function helps determine which template should be applied to a piece of content */ -export const calculateTemplate = ( - node: ProcessedFile, - defaultTemplate: "doc" | "terminuspage" | "certificationpage" | "video" -) => { - if ( - node.frontmatter && - node.frontmatter.layout && - node.frontmatter.layout !== null - ) { - return node.frontmatter.layout; - } - return defaultTemplate; -}; - export const normalizeSlug = (slug: string): string => { let normalizedSlug = slug; if (normalizedSlug.startsWith("/")) { @@ -622,154 +607,3 @@ export const getAllPages = async ( ...landingPages, ]; }; - -export const fetchArticleById = async (id: string) => { - const query = ` - query GetArticle($id: String, $contentType: ContentType, $publishingLevel: PublishingLevel) { - article(id: $id, contentType: $contentType, publishingLevel: $publishingLevel) { - id - title - content - slug - tags - siteId - metadata - publishedDate - publishingLevel - contentType - updatedAt - previewActiveUntil - } - } - `; - - const variables = { - id: id, - contentType: "TEXT_MARKDOWN", - publishingLevel: "PRODUCTION", - }; - - try { - const response = await fetch( - `${process.env.PCC_HOST || "https://gql.prod.pcc.pantheon.io"}/sites/${process.env.PCC_SITE_ID}/query`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - "PCC-TOKEN": process.env.PCC_TOKEN || "", - }, - body: JSON.stringify({ - query, - variables, - }), - } - ); - - if (!response.ok) { - const error = await response.text(); - throw new Error(`HTTP error! status: ${response.status} ${error} ${id}`); - } - - const data = await response.json(); - return data.data.article; - } catch (error) { - console.error("Fetch error:", error); - throw error; - } -}; - -// Using fetch with the same GraphQL query -export const fetchArticleBySlug = async ( - slug: string, - siteId: string = process.env.PCC_SITE_ID || "", - token: string = process.env.PCC_TOKEN || "", - options: { withContent: boolean; withMetadata: boolean } = { - withContent: true, - withMetadata: true, - }, - tries: number = 2 -) => { - console.debug("fetching article by slug", slug); - - const query = ` - query GetArticle($slug: String, $contentType: ContentType, $publishingLevel: PublishingLevel) { - article(slug: $slug, contentType: $contentType, publishingLevel: $publishingLevel) { - id - title - ${options.withContent === true ? "content" : ""} - slug - tags - siteId - ${options.withMetadata === true ? "metadata" : ""} - publishedDate - publishingLevel - contentType - updatedAt - previewActiveUntil - } - } - `; - - const variables = { - slug: slug, - contentType: "TEXT_MARKDOWN", - publishingLevel: "PRODUCTION", - }; - - while (tries > 0) { - tries -= 1; - try { - const response = await fetch( - `${process.env.PCC_HOST || "https://gql.prod.pcc.pantheon.io"}/sites/${siteId}/query`, - { - method: "POST", - headers: { - "Content-Type": "application/json", - "PCC-TOKEN": token, - }, - body: JSON.stringify({ - query, - variables, - }), - } - ); - - if (!response.ok) { - if (response.status === 404) { - return null; - } - - const error = await response.text(); - throw new Error( - `HTTP error! status: ${response.status} ${error} ${slug}` - ); - } - - const data = await response.json(); - return data.data.article; - } catch (error) { - console.error("Fetch error:", error, { tries }); - if (tries === 0) { - throw error; - } - } - } -}; - -export const singleSlugForFetch = (slug: string) => { - if (slug.startsWith("_")) { - slug = slug.slice(1); - } - - return slug - .replaceAll("/", "-") - .replaceAll("_", "-") - .replaceAll(".", "-") - .replaceAll(" ", "-") - .replaceAll("-&-", "-") - .replaceAll(",-", "-") - .replaceAll("!", "") - .replaceAll("(", "") - .replaceAll(")", "") - .toLowerCase(); -}; diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index a3c49ec160..6751fe2587 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -1,96 +1,26 @@ -import { PageDataWithoutComponent, calculateTemplate } from "./page-utils"; - -export const serveLocal = (search?: { local?: "true" | "false" }) => { - let useLocal = false; - if (process.env.SERVE_LOCAL === "false") { - return false; - } - - if (process.env.SERVE_LOCAL === "true") { - return true; - } - - if (process.env.NODE_ENV === "development") { - useLocal = true; - if (search?.local === "false") { - useLocal = false; - } - } - - return useLocal; -}; - -export const serveLocalAsync = async ( - searchParams?: Promise<{ - local?: "true" | "false"; - }> -) => { - const search = await searchParams; - - // @todo, don't hard code this to true - // https://github.com/pantheon-systems/documentation-in-nextjs/issues/84 - return true; - // return serveLocal(search); -}; +import { PageDataWithoutComponent } from "./page-utils"; export const resolveComponent = async ( pageData: PageDataWithoutComponent & { relativeFilePath?: string } ): Promise<{ Component: React.ReactNode; template: string }> => { switch (pageData.type) { case "doc": { - const template = calculateTemplate(pageData.data.doc, "doc"); - - if (template === "doc") { - const Doc = await import(`@/templates/doc`); - return { - Component: , - template: "doc", - }; - } else if (template === "terminuspage") { - const Terminus = await import(`@/templates/terminus`); - return { - Component: , - template: "terminuspage", - }; - } else if (template === "certificationpage") { - const Certification = await import(`@/templates/certification`); - return { - Component: ( - - ), - template: "certification", - }; - } else if (template === "video") { - const Video = await import(`@/templates/guide`); - return { - Component: ( - - ), - template: "video", - }; - } else { - const Doc = await import(`@/templates/doc`); - return { - Component: , - template: "doc", - }; - } + const Doc = await import(`@/templates/doc`); + return { + Component: , + template: "doc", + }; } case "guide": { - const Guide = await import(`@/templates/guide`); + const Doc = await import(`@/templates/doc`); return { Component: ( - ), template: "guide", diff --git a/src/lib/utils.ts b/src/lib/utils.ts index b4dfcf451c..74ddcabd5f 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,9 +1,4 @@ -import { - Article, - ArticleWithoutContent, -} from "@pantheon-systems/pcc-react-sdk"; import { clsx, type ClassValue } from "clsx"; -import { Metadata } from "next"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { @@ -19,70 +14,6 @@ export function formatDate(input: string | number): string { }); } -export function getSeoMetadata( - article: ArticleWithoutContent | null -): Metadata { - if (article == null) { - return { - openGraph: { - type: "website", - }, - }; - } - - const tags: string[] = - article.tags && article.tags.length > 0 ? article.tags : []; - const imageProperties = [ - article.metadata?.image, - article.metadata?.["image"], - // Extend as needed - ] - .filter((url): url is string => typeof url === "string") - .map((url) => ({ url })); - const description = article.metadata?.description - ? String(article.metadata?.description) - : "Article hosted using Pantheon Content Cloud"; - - const authors: Metadata["authors"] = []; - - // Collecting data from metadata fields - Object.entries(article.metadata || {}).forEach(([k, v]) => { - const key = k.toLowerCase().trim(); - - switch (key) { - case "author": { - if (typeof v === "string") { - authors.push({ name: v }); - } - break; - } - case "complex-author": { - if (typeof v === "string") { - const authorName = undefined; - - if (authorName) { - authors.push({ name: v }); - } - } - break; - } - } - }); - - return { - title: article.title, - description, - keywords: tags, - authors, - openGraph: { - type: "website", - title: article.title || undefined, - images: imageProperties, - description, - }, - }; -} - export const isExternalLink = (url: string) => { // Empty URLs if (!url) { diff --git a/src/server/processor/json.tsx b/src/server/processor/json.tsx index ff5912f357..3bdc2ed08e 100644 --- a/src/server/processor/json.tsx +++ b/src/server/processor/json.tsx @@ -1,5 +1,5 @@ import fs from "fs"; -import path, { join } from "path"; +import path from "path"; import { BaseFields, BaseInternal, @@ -19,8 +19,6 @@ import { safeProcessFile, getFileInfo, } from "./helper"; -import { serveLocal, serveLocalAsync } from "@/lib/resolve-component"; -import { fetchArticleBySlug, singleSlugForFetch } from "@/lib/page-utils"; export type JsonFileContent = Record; @@ -75,47 +73,6 @@ export const processDirectoryForJson = async ( fileName: string | null, baseDirectory = path.resolve(process.cwd(), "src") ): Promise => { - const useLocal = serveLocal(); - - if (useLocal === false && fileName) { - fileName = fileName.split(".")[0]; - - const article = await fetchArticleBySlug( - singleSlugForFetch(`${fileName}-json-file`), - undefined, - undefined, - undefined, - 1 - ); - - if (article) { - const content = JSON.parse(article.content); - const parsedContent = JSON.parse(content.content).content; - - const relativePath = article.metadata.relativePath; - - return [ - { - id: generateId(join(process.cwd(), relativePath)), - fileAbsolutePath: join(process.cwd(), relativePath), - relativePath: relativePath, - fileName: article.fileName, - content: parsedContent, - fields: generateBaseFields( - join(process.cwd(), relativePath), - article.fileName, - parsedContent - ), - internal: { - type: "Json", - content: parsedContent, - contentDigest: generateContentDigest(content.content), - }, - }, - ]; - } - } - const options = { extensions: [".json"], filter: (filePath: string) => { diff --git a/src/source/content/cache.md b/src/source/content/cache.md index 3a0b73f668..bdf4ce7c01 100644 --- a/src/source/content/cache.md +++ b/src/source/content/cache.md @@ -4,9 +4,7 @@ description: Understand frontend and backend caching on our platform. contributors: [dwayne] permalink: docs/cache tags: [cache] -layout: video searchboost: 50 -type: video contenttype: [doc] innav: [true] categories: [cache] diff --git a/src/source/content/certification/about.md b/src/source/content/certification/about.md index f79249e3d0..2398aeb280 100644 --- a/src/source/content/certification/about.md +++ b/src/source/content/certification/about.md @@ -1,9 +1,6 @@ --- title: "Benefits of Becoming WebOps Certified" subtitle: "Learn about the Pantheon WebOps Certification program" -showtoc: true -contributors: [] -layout: certificationpage permalink: docs/certification/about --- diff --git a/src/source/content/certification/exam.md b/src/source/content/certification/exam.md index 9181270e34..b5639e7a9a 100644 --- a/src/source/content/certification/exam.md +++ b/src/source/content/certification/exam.md @@ -1,9 +1,6 @@ --- title: "WebOps Certification: Exam Overview" subtitle: "Pantheon WebOps Certification Exam Overview" -contributors: [] -showtoc: true -layout: certificationpage permalink: docs/certification/exam --- ## Exam Instructions diff --git a/src/source/content/certification/study-guide-cms/00-intro.md b/src/source/content/certification/study-guide-cms/00-intro.md index 437ca3b87a..47792cbbf1 100644 --- a/src/source/content/certification/study-guide-cms/00-intro.md +++ b/src/source/content/certification/study-guide-cms/00-intro.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: Study Guide Introduction description: Learn about the three failure modes of website operations. -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] nexturl: /certification/study-guide/webops --- diff --git a/src/source/content/certification/study-guide-cms/01-webops.md b/src/source/content/certification/study-guide-cms/01-webops.md index 186a20f423..9caf7ad08b 100644 --- a/src/source/content/certification/study-guide-cms/01-webops.md +++ b/src/source/content/certification/study-guide-cms/01-webops.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 1: WebOps" description: Learn about the principles and benefits of WebOps. -certificationpage: true -showtoc: true -type: certificationpage -layout: certificationpage -tags: [] permalink: docs/certification/study-guide/webops -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide nexturl: /certification/study-guide/platform --- diff --git a/src/source/content/certification/study-guide-cms/02-platform.md b/src/source/content/certification/study-guide-cms/02-platform.md index 4fefe124a0..2bbfce97dc 100644 --- a/src/source/content/certification/study-guide-cms/02-platform.md +++ b/src/source/content/certification/study-guide-cms/02-platform.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 2: Pantheon Platform" description: Understand the layers of Pantheon's platform and how it can be used to solve problems using WebOps best practicies. -certificationpage: true -showtoc: true -type: certificationpage -layout: certificationpage -tags: [] permalink: docs/certification/study-guide/platform -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/webops nexturl: /certification/study-guide/create --- diff --git a/src/source/content/certification/study-guide-cms/03-create.md b/src/source/content/certification/study-guide-cms/03-create.md index 882a5fe414..be311c875e 100644 --- a/src/source/content/certification/study-guide-cms/03-create.md +++ b/src/source/content/certification/study-guide-cms/03-create.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 3: Site Creation" description: Learn how to create a site on Pantheon. -certificationpage: true -showtoc: true -type: certificationpage -layout: certificationpage -tags: [] permalink: docs/certification/study-guide/create -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/platform nexturl: /certification/study-guide/cdn --- diff --git a/src/source/content/certification/study-guide-cms/04-cdn.md b/src/source/content/certification/study-guide-cms/04-cdn.md index 0659fb2083..978c534b78 100644 --- a/src/source/content/certification/study-guide-cms/04-cdn.md +++ b/src/source/content/certification/study-guide-cms/04-cdn.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 4: Content Delivery Network" description: Pantheon's edge layer increases the speed and scalability of all sites on the platform. The Advanced Global CDN can be customized for tailored usage. -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/cdn -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/create nexturl: /certification/study-guide/cms --- diff --git a/src/source/content/certification/study-guide-cms/05-cms.md b/src/source/content/certification/study-guide-cms/05-cms.md index af2cee8cde..71256688b9 100644 --- a/src/source/content/certification/study-guide-cms/05-cms.md +++ b/src/source/content/certification/study-guide-cms/05-cms.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 5: CMS Infrastructure" description: Pantheon's containerized infrastructure makes CMS applications faster, more scalable, and more secure. -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/cms -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/cdn nexturl: /certification/study-guide/deploy --- diff --git a/src/source/content/certification/study-guide-cms/06-deploy.md b/src/source/content/certification/study-guide-cms/06-deploy.md index ecf2268a48..55b84533a9 100644 --- a/src/source/content/certification/study-guide-cms/06-deploy.md +++ b/src/source/content/certification/study-guide-cms/06-deploy.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 6: The Deployment Pipeline" description: Learn about the deployment pipeline for CMS Sites on Pantheon as it relates to code, files, and databases. -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/deploy -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/cms nexturl: /certification/study-guide/people --- diff --git a/src/source/content/certification/study-guide-cms/07-people.md b/src/source/content/certification/study-guide-cms/07-people.md index 900f8fcd3b..08474300c4 100644 --- a/src/source/content/certification/study-guide-cms/07-people.md +++ b/src/source/content/certification/study-guide-cms/07-people.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 7: Connecting People" description: Learn how to manage teams, workspaces and permissions before connecting DNS. -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/people -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/deploy nexturl: /certification/study-guide/extend --- diff --git a/src/source/content/certification/study-guide-cms/08-extend.md b/src/source/content/certification/study-guide-cms/08-extend.md index b62a124b48..ecffee8436 100644 --- a/src/source/content/certification/study-guide-cms/08-extend.md +++ b/src/source/content/certification/study-guide-cms/08-extend.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 8: Extend with CLI and Hooks" description: "Terminus and Quicksilver can work together to help facilitate complex WebOps workflows" -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/extend -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/people nexturl: /certification/study-guide/automate --- diff --git a/src/source/content/certification/study-guide-cms/09-automate.md b/src/source/content/certification/study-guide-cms/09-automate.md index 7e7dc30773..1052c8bc90 100644 --- a/src/source/content/certification/study-guide-cms/09-automate.md +++ b/src/source/content/certification/study-guide-cms/09-automate.md @@ -2,19 +2,8 @@ title: WebOps Certification subtitle: "Chapter 9: Additional Automation" description: "Learn how to leverage Integrated Composer and Autopilot" -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] permalink: docs/certification/study-guide/automate -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/extend nexturl: /certification/study-guide/custom-upstreams --- diff --git a/src/source/content/certification/study-guide-cms/10-custom-upstreams.md b/src/source/content/certification/study-guide-cms/10-custom-upstreams.md index a9591517f8..acaeadba66 100644 --- a/src/source/content/certification/study-guide-cms/10-custom-upstreams.md +++ b/src/source/content/certification/study-guide-cms/10-custom-upstreams.md @@ -1,20 +1,9 @@ --- title: WebOps Certification subtitle: "Chapter 10: Custom Upstreams" -description: "Understand the relationship between Pantheon’s Core Upstreams, Custom Upstreams, and individual site repositories." -certificationpage: true -type: certificationpage -layout: certificationpage -showtoc: true -tags: [] +description: "Understand the relationship between Pantheon's Core Upstreams, Custom Upstreams, and individual site repositories." permalink: docs/certification/study-guide/custom-upstreams -contenttype: [guide] -innav: [false] -categories: [] cms: [drupal, wordpress] -audience: [] -product: [] -integration: [--] previousurl: /certification/study-guide/automate --- diff --git a/src/source/content/guides/launch/02-create-site-launch.md b/src/source/content/guides/launch/02-create-site-launch.md index 8be48f69e6..75434bfe42 100644 --- a/src/source/content/guides/launch/02-create-site-launch.md +++ b/src/source/content/guides/launch/02-create-site-launch.md @@ -4,7 +4,6 @@ subtitle: Create Your Site on Pantheon description: Learn how to create your site on Pantheon. tags: [cms,] contributors: [whitneymeredith] -showtoc: true permalink: docs/guides/launch/create-site-launch contenttype: [guide] innav: [false] @@ -16,7 +15,7 @@ integration: [--] image: launchGuide-twitterLarge.png --- -This section provides information on how to create your Live environment. +This section provides information on how to create your Live environment. 1. [Create a New Site](/guides/getstarted/addsite/). diff --git a/src/source/content/terminus/01-introduction.md b/src/source/content/terminus/01-introduction.md index 6f33a4773a..b2d5578016 100644 --- a/src/source/content/terminus/01-introduction.md +++ b/src/source/content/terminus/01-introduction.md @@ -2,20 +2,15 @@ title: Terminus Guide subtitle: Introduction description: Learn about Terminus, the command line interface for advanced interaction with the Pantheon platform. -terminuspage: true -type: terminuspage -layout: terminuspage contributors: [whitneymeredith] -contenttype: [guide] -innav: [true] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus reviewed: "2020-02-05" +showtoc: false --- Terminus is a command line interface that provides advanced interaction with Pantheon. Terminus enables you to do almost everything in a terminal that you can do in the Dashboard, as well as scripting and much more. diff --git a/src/source/content/terminus/02-install.md b/src/source/content/terminus/02-install.md index 8a6397e416..ea411e37ce 100644 --- a/src/source/content/terminus/02-install.md +++ b/src/source/content/terminus/02-install.md @@ -2,19 +2,13 @@ title: Terminus Guide subtitle: Install and Update Terminus description: Learn how to install and update Terminus to your local computer. -terminuspage: true -type: terminuspage -layout: terminuspage contributors: [whitneymeredith,jazzsequence] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/install -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] showtoc: true reviewed: "2025-07-22" --- diff --git a/src/source/content/terminus/03-examples.md b/src/source/content/terminus/03-examples.md index 935a179d42..5e25894789 100644 --- a/src/source/content/terminus/03-examples.md +++ b/src/source/content/terminus/03-examples.md @@ -2,19 +2,14 @@ title: Terminus Guide subtitle: Get Started description: Learn how to apply updates, deploy code, switch upstreams, and install Drush and WP-CLI with Terminus. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/examples -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] reviewed: "2025-01-23" +showtoc: false --- This section provides information on how to apply updates, deploy code, switch upstreams, and install Drush and WP-CLI with Terminus, as well as information on command structure and automatic site and environment detection. diff --git a/src/source/content/terminus/04-commands.md b/src/source/content/terminus/04-commands.md index ca751d68f3..dad5cfe41c 100644 --- a/src/source/content/terminus/04-commands.md +++ b/src/source/content/terminus/04-commands.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Command Directory description: Review a complete list of Terminus commands. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/commands -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides a comprehensive list of Terminus commands. diff --git a/src/source/content/terminus/05-scripting.md b/src/source/content/terminus/05-scripting.md index b319df9470..22cb2f6aa7 100644 --- a/src/source/content/terminus/05-scripting.md +++ b/src/source/content/terminus/05-scripting.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Scripting with Terminus description: Automate your workflow with scripting via Terminus. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/scripting -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides information on how to automate your workflow with Terminus scripting. diff --git a/src/source/content/terminus/06-plugins.md b/src/source/content/terminus/06-plugins.md index b219337936..82671c1506 100644 --- a/src/source/content/terminus/06-plugins.md +++ b/src/source/content/terminus/06-plugins.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Install Plugins description: Learn how to install plugins with Terminus. -terminuspage: true -type: terminuspage -layout: terminuspage -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/plugins +showtoc: false --- This section provides information on how to install plugins with Terminus, and how to add new commands through third-party plugins. diff --git a/src/source/content/terminus/07-create.md b/src/source/content/terminus/07-create.md index 410f75bc9d..8612c809f6 100644 --- a/src/source/content/terminus/07-create.md +++ b/src/source/content/terminus/07-create.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Create Terminus Plugins description: Learn how to create your own Terminus plugins. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/create -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides information on how to create Terminus plugins. diff --git a/src/source/content/terminus/08-directory.md b/src/source/content/terminus/08-directory.md index 1fc26c3a1c..0b97e9fd91 100644 --- a/src/source/content/terminus/08-directory.md +++ b/src/source/content/terminus/08-directory.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Plugin Directory description: A non-exclusive directory of plugins to extend Terminus features. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/directory -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- You can extend Terminus functionality and add commands by installing [third-party plugins](https://github.com/terminus-plugin-project) or by [creating your own plugins](/terminus/create). diff --git a/src/source/content/terminus/09-configuration.md b/src/source/content/terminus/09-configuration.md index f44bc1ac9f..89f27263e5 100644 --- a/src/source/content/terminus/09-configuration.md +++ b/src/source/content/terminus/09-configuration.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Terminus Configuration File description: Learn how to configure your local Terminus configuration file. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/configuration -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides information on how to configure your local Terminus configuration file. diff --git a/src/source/content/terminus/10-supported-terminus.md b/src/source/content/terminus/10-supported-terminus.md index 87da7efe3e..81d00a991b 100644 --- a/src/source/content/terminus/10-supported-terminus.md +++ b/src/source/content/terminus/10-supported-terminus.md @@ -2,19 +2,14 @@ title: Terminus Guide subtitle: Supported Terminus and PHP Versions description: Learn which versions of Terminus and PHP are currently supported. -terminuspage: true -type: terminuspage -layout: terminuspage contributors: [wordsmither] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/supported-terminus -contenttype: [guide] -innav: [false] categories: [git] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- Each major and minor version of Terminus is fully supported for one year from the release of the subsequent version. During the supported period, serious bugs and security issues that have been reported are fixed in patch releases. Refer to the documentation on [Semantic Versioning](https://semver.org/) for more information on versioning. diff --git a/src/source/content/terminus/11-updates.md b/src/source/content/terminus/11-updates.md index 52f74a1607..2139e771f3 100644 --- a/src/source/content/terminus/11-updates.md +++ b/src/source/content/terminus/11-updates.md @@ -2,18 +2,13 @@ title: Terminus Guide subtitle: Terminus Changelog description: Stay up to date on the latest Terminus version. -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/updates -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- ## Changelog diff --git a/src/source/content/terminus/12-terminus-3-0.md b/src/source/content/terminus/12-terminus-3-0.md index ac039bb701..88a35ece52 100644 --- a/src/source/content/terminus/12-terminus-3-0.md +++ b/src/source/content/terminus/12-terminus-3-0.md @@ -2,19 +2,14 @@ title: Terminus Guide subtitle: Terminus 3 description: Learn what's new with the latest Terminus major version upgrade. -terminuspage: true -type: terminuspage -layout: terminuspage contributors: [greg-1-anderson] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/terminus-3-0 -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides information about Terminus 3.0. Terminus 3.0 is the most recent major version of Terminus and is recommended in place of Terminus 2.0. diff --git a/src/source/content/terminus/13-terminus-4-0.md b/src/source/content/terminus/13-terminus-4-0.md index 94b6a034a8..5412508d17 100644 --- a/src/source/content/terminus/13-terminus-4-0.md +++ b/src/source/content/terminus/13-terminus-4-0.md @@ -2,19 +2,14 @@ title: Terminus Guide subtitle: Terminus 4 description: Learn what's new with the latest Terminus major version upgrade. -terminuspage: true -type: terminuspage -layout: terminuspage contributors: [kporras07] tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/terminus-4-0 -contenttype: [guide] -innav: [false] categories: [cli] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] +showtoc: false --- This section provides information about Terminus 4.0. Terminus 4.0 is the most recent major version of Terminus and is recommended in place of Terminus 3.x. diff --git a/src/source/content/terminus/ci/bitbucket.md b/src/source/content/terminus/ci/bitbucket.md index ea087b8690..95f3f448d4 100644 --- a/src/source/content/terminus/ci/bitbucket.md +++ b/src/source/content/terminus/ci/bitbucket.md @@ -4,18 +4,13 @@ subtitle: Authenticate Terminus in a Bitbucket CI Pipeline description: Learn how to authenticate Terminus in a Bitbucket CI pipeline without receiving errors. permalink: docs/terminus/ci/bitbucket contributors: [stovak] -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] -contenttype: [guide] -innav: [false] categories: [automate] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] reviewed: "2023-06-08" +showtoc: false --- This section provides information on how to to authenticate Terminus in a Bitbucket CI pipeline without receiving errors and avoiding authentication rate limits. diff --git a/src/source/content/terminus/ci/circleci.md b/src/source/content/terminus/ci/circleci.md index 9e429d815b..cc8e110cda 100644 --- a/src/source/content/terminus/ci/circleci.md +++ b/src/source/content/terminus/ci/circleci.md @@ -3,19 +3,14 @@ title: Terminus Guide subtitle: Authenticate Terminus in a CircleCI Pipeline description: Learn how to authenticate Terminus in a CircleCI pipeline without errors. contributors: [stovak] -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] permalink: docs/terminus/ci/circleci -contenttype: [guide] -innav: [false] categories: [automate] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] reviewed: "2023-06-08" +showtoc: false --- This section provides information on how to authenticate Terminus in a CircleCI pipeline without receiving errors and avoiding authentication rate limits. diff --git a/src/source/content/terminus/ci/github-actions.md b/src/source/content/terminus/ci/github-actions.md index 0420fac3ea..89378d524f 100644 --- a/src/source/content/terminus/ci/github-actions.md +++ b/src/source/content/terminus/ci/github-actions.md @@ -4,18 +4,13 @@ subtitle: Authenticate Terminus in a GitHub Actions Pipeline description: Learn how to authenticate Terminus in a GitHub Actions CI pipeline without receiving errors. permalink: docs/terminus/ci/github-actions contributors: [stovak] -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] -contenttype: [guide] -innav: [false] categories: [automate] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] reviewed: "2025-12-10" +showtoc: false --- This section provides information on how to to authenticate Terminus in a GitHub Actions CI pipeline without receiving errors and avoiding authentication rate limits. diff --git a/src/source/content/terminus/ci/gitlab.md b/src/source/content/terminus/ci/gitlab.md index d1499798e9..84c0374340 100644 --- a/src/source/content/terminus/ci/gitlab.md +++ b/src/source/content/terminus/ci/gitlab.md @@ -4,18 +4,13 @@ subtitle: Authenticate Terminus in a GitLab Pipeline description: Learn how to authenticate Terminus in a GitLab CI pipeline without receiving errors. permalink: docs/terminus/ci/gitlab contributors: [stovak] -terminuspage: true -type: terminuspage -layout: terminuspage tags: [reference, cli, local, terminus, workflow] -contenttype: [guide] -innav: [false] categories: [automate] cms: [drupal, wordpress] audience: [development] product: [terminus] -integration: [--] reviewed: "2023-06-08" +showtoc: false --- This section provides information on how to to authenticate Terminus in a GitLab CI pipeline without receiving errors and avoiding authentication rate limits. diff --git a/src/templates/certification.tsx b/src/templates/certification.tsx deleted file mode 100644 index 4a95d799b8..0000000000 --- a/src/templates/certification.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import Layout from "@/components/layout"; -import { OmniSidebarNav } from "@/components/omniSideBarNav"; -import { DocsSidebarLayout } from "@/components/pds-middleware/docs-sidebar-layout"; -import { ProcessedFile } from "@/server/processor/mdx"; -import SearchBar from "@/components/header/search-bar"; -import { MdxWrapper } from "@/components/ui/mdx-wrapper"; -import HeaderBody from "@/components/common/header-body"; -import NavButtons from "@/components/common/nav-buttons"; -import { TOC } from "@/components/common/toc"; - -const ContainerDiv = ({ children }: { children: React.ReactNode }) => ( -
{children}
-); - -const ContentLayoutType = ({ - children, - hasTOC, -}: { - children: React.ReactNode; - hasTOC: boolean; -}) => { - if (hasTOC) { - return ( - - {children} - - ); - } - - return {children}; -}; - -export const CertificationTemplate = ({ - certification, -}: { - certification: ProcessedFile; -}) => { - const items: any[] = []; // todo: add items @aniketbiprojit - - const hasTOC = certification.frontmatter.showtoc ?? false; - - let image = "/images/" + certification.frontmatter.image; - if (image === "/images/null") { - image = "/images/default-thumb-guides.png"; - } - - return ( - - -
- -
- -
- -
- -
-
-
-
- - - -
-
-
- {hasTOC && ( -
- -
- )} -
-
-
-
- ); -}; diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index c79fd0c31c..7858013144 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -5,20 +5,55 @@ import { ProcessedFile } from "@/server/processor/mdx"; import SearchBar from "@/components/header/search-bar"; import { MdxWrapper } from "@/components/ui/mdx-wrapper"; import HeaderBody from "@/components/common/header-body"; +import NavButtons from "@/components/common/nav-buttons"; import { TOC } from "@/components/common/toc"; const ContainerDiv = ({ children }: { children: React.ReactNode }) => (
{children}
); -export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { - const items: any[] = []; // todo: add items @aniketbiprojit - - let image = "/images/" + doc.frontmatter.image; - if (image === "/images/null") { - image = "/images/default-thumb-guides.png"; +const ContentLayoutType = ({ + children, + hasTOC, +}: { + children: React.ReactNode; + hasTOC: boolean; +}) => { + if (hasTOC) { + return ( + + {children} + + ); } + return {children}; +}; + +export const DocTemplate = ({ + doc, + prev, + next, + tocDefault = true, +}: { + doc: ProcessedFile; + prev?: { fields: { slug: string } } | null; + next?: { fields: { slug: string } } | null; + tocDefault?: boolean; +}) => { + // Use props if provided, otherwise fall back to frontmatter + const prevUrl = prev?.fields.slug ?? doc.frontmatter.previousurl ?? ""; + const nextUrl = next?.fields.slug ?? doc.frontmatter.nexturl ?? ""; + + // Use frontmatter if set, otherwise use the default for this content type + const hasTOC = doc.frontmatter.showtoc ?? tocDefault; + return ( { >
- +
@@ -64,27 +89,21 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { // isoDate={guide.frontmatter.reviewed} /> + {(prevUrl || nextUrl) && ( + + )}
-
- -
-
+ {hasTOC && ( +
+ +
+ )} +
diff --git a/src/templates/guide.tsx b/src/templates/guide.tsx deleted file mode 100644 index 9e0df04cbd..0000000000 --- a/src/templates/guide.tsx +++ /dev/null @@ -1,127 +0,0 @@ -import Layout from "@/components/layout"; -import { OmniSidebarNav } from "@/components/omniSideBarNav"; -import { DocsSidebarLayout } from "@/components/pds-middleware/docs-sidebar-layout"; -import { ProcessedFile } from "@/server/processor/mdx"; -import SearchBar from "@/components/header/search-bar"; -import { MdxWrapper } from "@/components/ui/mdx-wrapper"; -import HeaderBody from "@/components/common/header-body"; -import NavButtons from "@/components/common/nav-buttons"; -import { TOC } from "@/components/common/toc"; - -const ContainerDiv = ({ children }: { children: React.ReactNode }) => ( -
{children}
-); - -const ContentLayoutType = ({ - children, - hasTOC, -}: { - children: React.ReactNode; - hasTOC: boolean; -}) => { - if (hasTOC) { - return ( - - {children} - - ); - } - - return {children}; -}; - -export const GuideTemplate = ({ - guide, - prev, - next, -}: { - prev: null | { fields: { slug: string; guide_directory: string } }; - guide: ProcessedFile; - next: null | { fields: { slug: string; guide_directory: string } }; -}) => { - const items: any[] = []; // todo: add items @aniketbiprojit - - const hasTOC = guide.frontmatter.showtoc ?? false; - - let image = "/images/" + guide.frontmatter.image; - if (image === "/images/null") { - image = "/images/default-thumb-guides.png"; - } - - return ( - - -
- -
- -
- -
- -
-
-
-
- - - -
-
-
- {hasTOC && ( -
- -
- )} -
-
-
-
- ); -}; diff --git a/src/templates/landing.tsx b/src/templates/landing.tsx index 439083869d..94e03fcb92 100644 --- a/src/templates/landing.tsx +++ b/src/templates/landing.tsx @@ -90,11 +90,7 @@ export const LandingTemplate = ({ topic }: { topic: Landing }) => { >
diff --git a/src/templates/release-note-listing/index.tsx b/src/templates/release-note-listing/index.tsx index e20fc6ba41..6348732357 100644 --- a/src/templates/release-note-listing/index.tsx +++ b/src/templates/release-note-listing/index.tsx @@ -147,18 +147,7 @@ export const ReleaseNoteListingTemplate = async ({ /> */} (
{children}
@@ -37,75 +37,6 @@ const ContentLayoutType = ({ return {children}; }; -// @TODO relocate this list -// - To a YAML file and use GraphQL to pull data. -// - To a GraphQL query order by frontmatter weight/order/index field. -const items = [ - { - id: "docs-terminus", - link: "/terminus", - title: "Introduction", - }, - { - id: "docs-terminus-install", - link: "/terminus/install", - title: "Install Terminus", - }, - { - id: "docs-terminus-examples", - link: "/terminus/examples", - title: "Get Started", - }, - { - id: "docs-terminus-commands", - link: "/terminus/commands", - title: "Command Directory", - }, - { - id: "docs-terminus-scripting", - link: "/terminus/scripting", - title: "Scripting with Terminus", - }, - { - id: "docs-terminus-plugins", - link: "/terminus/plugins", - title: "Install Plugins", - }, - { - id: "docs-terminus-directory", - link: "/terminus/directory", - title: "Plugin Directory", - }, - { - id: "docs-terminus-create", - link: "/terminus/create", - title: "Create Terminus Plugins", - }, - { - id: "docs-terminus-configuration", - link: "/terminus/configuration", - title: "Terminus Configuration File", - }, - - { - id: "docs-supported-terminus", - link: "/terminus/supported-terminus", - title: "Supported Terminus and PHP Versions", - }, - - { - id: "docs-terminus-updates", - link: "/terminus/updates", - title: "Terminus Changelog", - }, - - { - id: "docs-terminus-terminus-4-0", - link: "/terminus/terminus-4-0", - title: "Terminus 4", - }, -]; - export const TerminusCommandTemplate = ({ command, slug, @@ -137,9 +68,7 @@ export const TerminusCommandTemplate = ({ className="pds-container pds-container--x-wide" >
-
diff --git a/src/templates/terminus.tsx b/src/templates/terminus.tsx deleted file mode 100644 index 7d8fde5698..0000000000 --- a/src/templates/terminus.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import Layout from "@/components/layout"; -import { OmniSidebarNav } from "@/components/omniSideBarNav"; -import { DocsSidebarLayout } from "@/components/pds-middleware/docs-sidebar-layout"; -import { ProcessedFile } from "@/server/processor/mdx"; -import SearchBar from "@/components/header/search-bar"; -import { MdxWrapper } from "@/components/ui/mdx-wrapper"; -import HeaderBody from "@/components/common/header-body"; -import { TOC } from "@/components/common/toc"; - -const ContainerDiv = ({ children }: { children: React.ReactNode }) => ( -
{children}
-); - -const ContentLayoutType = ({ - children, - hasTOC, -}: { - children: React.ReactNode; - hasTOC: boolean; -}) => { - if (hasTOC) { - return ( - - {children} - - ); - } - - return {children}; -}; - -export const TerminusTemplate = ({ terminus }: { terminus: ProcessedFile }) => { - const items: any[] = []; // todo: add items @aniketbiprojit - - const hasTOC = terminus.frontmatter.showtoc ?? false; - - let image = "/images/" + terminus.frontmatter.image; - if (image === "/images/null") { - image = "/images/default-thumb-guides.png"; - } - - return ( - - -
- -
- -
- -
- -
-
-
-
- - -
-
-
- {hasTOC && ( -
- -
- )} -
-
-
-
- ); -};