From 287f3ff45e0b5291762aa35eb69cbc947d9e55cf Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 16:42:25 -0600 Subject: [PATCH 01/46] deleting duplicative templates --- src/lib/resolve-component.tsx | 10 +++------- src/templates/certification.tsx | 1 + src/templates/doc.tsx | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index a3c49ec160..6406606ede 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -53,14 +53,10 @@ export const resolveComponent = async ( template: "terminuspage", }; } else if (template === "certificationpage") { - const Certification = await import(`@/templates/certification`); + const Doc = await import(`@/templates/doc`); return { - Component: ( - - ), - template: "certification", + Component: , + template: "doc", }; } else if (template === "video") { const Video = await import(`@/templates/guide`); diff --git a/src/templates/certification.tsx b/src/templates/certification.tsx index 4a95d799b8..afd5095969 100644 --- a/src/templates/certification.tsx +++ b/src/templates/certification.tsx @@ -33,6 +33,7 @@ const ContentLayoutType = ({ ); } + return {children}; }; diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index c79fd0c31c..3ce77a1a47 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -5,12 +5,14 @@ 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 @@ -19,6 +21,14 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { image = "/images/default-thumb-guides.png"; } + // Determine submenuPathToUse based on content path + const slug = doc.fields.slug ?? ""; + const submenuPathToUse = slug.startsWith("certification/") ? "/learning" : ""; + + // Get prev/next URLs from frontmatter for NavButtons + const prevUrl = doc.frontmatter.previousurl ?? ""; + const nextUrl = doc.frontmatter.nexturl ?? ""; + return ( { activePage={doc.fields.slug} fallbackTitle={doc.frontmatter.title ?? ""} fallbackItems={items} - submenuPathToUse="" + submenuPathToUse={submenuPathToUse} /> @@ -78,6 +88,9 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { }} componentMap={{}} /> + {(prevUrl || nextUrl) && ( + + )} From 1b1d7de51777dac4367a717cc1af129a9627d442 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 16:47:08 -0600 Subject: [PATCH 02/46] simplify template --- src/templates/doc.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index 3ce77a1a47..adb2194515 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -8,10 +8,6 @@ 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 @@ -21,10 +17,6 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { image = "/images/default-thumb-guides.png"; } - // Determine submenuPathToUse based on content path - const slug = doc.fields.slug ?? ""; - const submenuPathToUse = slug.startsWith("certification/") ? "/learning" : ""; - // Get prev/next URLs from frontmatter for NavButtons const prevUrl = doc.frontmatter.previousurl ?? ""; const nextUrl = doc.frontmatter.nexturl ?? ""; @@ -44,7 +36,7 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { activePage={doc.fields.slug} fallbackTitle={doc.frontmatter.title ?? ""} fallbackItems={items} - submenuPathToUse={submenuPathToUse} + submenuPathToUse="" /> From c343650648237e4df32f2310edaf724655dae03f Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 16:50:36 -0600 Subject: [PATCH 03/46] removing unused frontmatter. --- .../content/certification/study-guide-cms/00-intro.md | 11 ----------- .../certification/study-guide-cms/01-webops.md | 11 ----------- .../certification/study-guide-cms/02-platform.md | 11 ----------- 3 files changed, 33 deletions(-) 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 --- From d32f7c4cddb00db471ca8eb4a25c33ebdfc5626c Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 16:54:44 -0600 Subject: [PATCH 04/46] removing unused frontmatter. --- src/source/content/certification/about.md | 3 --- src/source/content/certification/exam.md | 3 --- .../certification/study-guide-cms/03-create.md | 11 ----------- .../content/certification/study-guide-cms/04-cdn.md | 11 ----------- .../content/certification/study-guide-cms/05-cms.md | 11 ----------- .../certification/study-guide-cms/06-deploy.md | 11 ----------- .../certification/study-guide-cms/07-people.md | 11 ----------- .../certification/study-guide-cms/08-extend.md | 11 ----------- .../certification/study-guide-cms/09-automate.md | 11 ----------- .../study-guide-cms/10-custom-upstreams.md | 13 +------------ 10 files changed, 1 insertion(+), 95 deletions(-) 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/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 --- From 576eae05a2e6897881502fa03c0d1cbfd3d137dd Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 16:58:38 -0600 Subject: [PATCH 05/46] removing now unused code. --- src/lib/page-utils.ts | 2 +- src/lib/resolve-component.tsx | 6 -- src/templates/certification.tsx | 126 -------------------------------- 3 files changed, 1 insertion(+), 133 deletions(-) delete mode 100644 src/templates/certification.tsx diff --git a/src/lib/page-utils.ts b/src/lib/page-utils.ts index 7e02fed419..2ed8ccf98d 100644 --- a/src/lib/page-utils.ts +++ b/src/lib/page-utils.ts @@ -146,7 +146,7 @@ export type PageData = PageDataWithoutComponent & { /* 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" + defaultTemplate: "doc" | "terminuspage" | "video" ) => { if ( node.frontmatter && diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index 6406606ede..0f3d0984b1 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -52,12 +52,6 @@ export const resolveComponent = async ( Component: , template: "terminuspage", }; - } else if (template === "certificationpage") { - const Doc = await import(`@/templates/doc`); - return { - Component: , - template: "doc", - }; } else if (template === "video") { const Video = await import(`@/templates/guide`); return { diff --git a/src/templates/certification.tsx b/src/templates/certification.tsx deleted file mode 100644 index afd5095969..0000000000 --- a/src/templates/certification.tsx +++ /dev/null @@ -1,126 +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 && ( -
- -
- )} -
-
-
-
- ); -}; From 3b685ff949f24f66858b43445777e91910799528 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:03:30 -0600 Subject: [PATCH 06/46] deleting unused code --- src/templates/doc.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index adb2194515..49efdee072 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -12,11 +12,6 @@ import { TOC } from "@/components/common/toc"; 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"; - } - // Get prev/next URLs from frontmatter for NavButtons const prevUrl = doc.frontmatter.previousurl ?? ""; const nextUrl = doc.frontmatter.nexturl ?? ""; From 849c67a8f9e03442db6dc200f29569f4f3e08fb0 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:21:46 -0600 Subject: [PATCH 07/46] show TOC logic --- src/lib/resolve-component.tsx | 6 +++--- src/source/content/terminus/01-introduction.md | 7 +------ src/source/content/terminus/02-install.md | 6 ------ src/source/content/terminus/03-examples.md | 7 +------ src/source/content/terminus/04-commands.md | 7 +------ src/source/content/terminus/05-scripting.md | 7 +------ src/source/content/terminus/06-plugins.md | 7 +------ src/source/content/terminus/07-create.md | 7 +------ src/source/content/terminus/08-directory.md | 7 +------ src/source/content/terminus/09-configuration.md | 7 +------ src/source/content/terminus/10-supported-terminus.md | 7 +------ src/source/content/terminus/11-updates.md | 7 +------ src/source/content/terminus/12-terminus-3-0.md | 7 +------ src/source/content/terminus/13-terminus-4-0.md | 7 +------ src/source/content/terminus/ci/bitbucket.md | 7 +------ src/source/content/terminus/ci/circleci.md | 7 +------ src/source/content/terminus/ci/github-actions.md | 7 +------ src/source/content/terminus/ci/gitlab.md | 7 +------ src/templates/doc.tsx | 11 ++++++++--- 19 files changed, 27 insertions(+), 108 deletions(-) diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index 0f3d0984b1..45994fc132 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -47,10 +47,10 @@ export const resolveComponent = async ( template: "doc", }; } else if (template === "terminuspage") { - const Terminus = await import(`@/templates/terminus`); + const Doc = await import(`@/templates/doc`); return { - Component: , - template: "terminuspage", + Component: , + template: "doc", }; } else if (template === "video") { const Video = await import(`@/templates/guide`); 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 db9ead42a8..8dee36299c 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/doc.tsx b/src/templates/doc.tsx index 49efdee072..957cb7c32a 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -16,6 +16,9 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { const prevUrl = doc.frontmatter.previousurl ?? ""; const nextUrl = doc.frontmatter.nexturl ?? ""; + // Show TOC by default, but allow hiding via frontmatter + const hasTOC = doc.frontmatter.showtoc ?? true; + return ( { -
- -
+ {hasTOC && ( +
+ +
+ )}
From 7c0c5f88cf18e916b3f5c9df79efb31c8064e803 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:25:32 -0600 Subject: [PATCH 08/46] width handling with sidebar --- src/templates/doc.tsx | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index 957cb7c32a..4cfa08ae76 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -8,6 +8,33 @@ 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 DocTemplate = ({ doc }: { doc: ProcessedFile }) => { const items: any[] = []; // todo: add items @aniketbiprojit @@ -39,13 +66,7 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => {
- +
@@ -89,7 +110,7 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => {
)} - +
From 78d370a42d18dd9769f2e46ea744b2cb6f8311fe Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:28:25 -0600 Subject: [PATCH 09/46] deleting unused terminus template code --- src/lib/page-utils.ts | 2 +- src/lib/resolve-component.tsx | 6 -- src/templates/terminus.tsx | 114 ---------------------------------- 3 files changed, 1 insertion(+), 121 deletions(-) delete mode 100644 src/templates/terminus.tsx diff --git a/src/lib/page-utils.ts b/src/lib/page-utils.ts index 2ed8ccf98d..e8c8628548 100644 --- a/src/lib/page-utils.ts +++ b/src/lib/page-utils.ts @@ -146,7 +146,7 @@ export type PageData = PageDataWithoutComponent & { /* This helper function helps determine which template should be applied to a piece of content */ export const calculateTemplate = ( node: ProcessedFile, - defaultTemplate: "doc" | "terminuspage" | "video" + defaultTemplate: "doc" | "video" ) => { if ( node.frontmatter && diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index 45994fc132..505448db6c 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -46,12 +46,6 @@ export const resolveComponent = async ( Component: , template: "doc", }; - } else if (template === "terminuspage") { - const Doc = await import(`@/templates/doc`); - return { - Component: , - template: "doc", - }; } else if (template === "video") { const Video = await import(`@/templates/guide`); return { 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 && ( -
- -
- )} -
-
-
-
- ); -}; From d829b1e6e6904da79e1fe250ac9c326d96613dda Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:40:21 -0600 Subject: [PATCH 10/46] deleting unused code in omniSideBarNav --- src/components/omniSideBarNav.tsx | 19 +------------------ src/templates/doc.tsx | 6 ------ src/templates/guide.tsx | 6 ------ src/templates/landing.tsx | 4 ---- 4 files changed, 1 insertion(+), 34 deletions(-) diff --git a/src/components/omniSideBarNav.tsx b/src/components/omniSideBarNav.tsx index 7d4f8e35fc..c9330af8c4 100644 --- a/src/components/omniSideBarNav.tsx +++ b/src/components/omniSideBarNav.tsx @@ -5,23 +5,16 @@ import { } 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; + submenuPathToUse?: string; }) => { const OmniItems = await getOmniItems(); @@ -63,16 +56,6 @@ export const OmniSidebarNav = async ({ menuItems={OmniLinks.links} /> ); - } else if (fallbackItems && fallbackItems.length > 0) { - return ( - <> - - - ); } else { return
; } diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index 4cfa08ae76..80ea392aa3 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -37,8 +37,6 @@ const ContentLayoutType = ({ }; export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { - const items: any[] = []; // todo: add items @aniketbiprojit - // Get prev/next URLs from frontmatter for NavButtons const prevUrl = doc.frontmatter.previousurl ?? ""; const nextUrl = doc.frontmatter.nexturl ?? ""; @@ -57,11 +55,7 @@ export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { >
diff --git a/src/templates/guide.tsx b/src/templates/guide.tsx index 9e0df04cbd..aeeb63d6d7 100644 --- a/src/templates/guide.tsx +++ b/src/templates/guide.tsx @@ -45,8 +45,6 @@ export const GuideTemplate = ({ 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; @@ -65,11 +63,7 @@ export const GuideTemplate = ({ >
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 }) => { >
From 09384db0339d9fbc3254fca5b7ad8508d84b706e Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Tue, 30 Dec 2025 17:42:49 -0600 Subject: [PATCH 11/46] removing unused code --- src/components/omniSideBarNav.tsx | 34 ++----------------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/src/components/omniSideBarNav.tsx b/src/components/omniSideBarNav.tsx index c9330af8c4..66950239f2 100644 --- a/src/components/omniSideBarNav.tsx +++ b/src/components/omniSideBarNav.tsx @@ -1,8 +1,5 @@ "use server"; -import { - findSubMenuItemsToUse, - getOmniSidebarActiveSection, -} from "./omni-components/helpers"; +import { getOmniSidebarActiveSection } from "./omni-components/helpers"; import { SideNavCompact } from "./ui/pds-re-export"; import { MOBILE_MENU_BREAKPOINT } from "@/constants"; @@ -11,41 +8,14 @@ import { turnItemsIntoLinks } from "./omni-components/client-helper"; export const OmniSidebarNav = async ({ activePage, - submenuPathToUse = "", }: { activePage: string; - submenuPathToUse?: 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 ( Date: Tue, 30 Dec 2025 18:12:08 -0600 Subject: [PATCH 12/46] removing extraneous guide and video template --- src/lib/page-utils.ts | 15 --- src/lib/resolve-component.tsx | 41 ++---- src/source/content/cache.md | 2 - .../guides/launch/02-create-site-launch.md | 3 +- src/templates/doc.tsx | 22 +++- src/templates/guide.tsx | 121 ------------------ 6 files changed, 27 insertions(+), 177 deletions(-) delete mode 100644 src/templates/guide.tsx diff --git a/src/lib/page-utils.ts b/src/lib/page-utils.ts index e8c8628548..0ede8c97e1 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" | "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("/")) { diff --git a/src/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index 505448db6c..0ffc7d2d4e 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -1,4 +1,4 @@ -import { PageDataWithoutComponent, calculateTemplate } from "./page-utils"; +import { PageDataWithoutComponent } from "./page-utils"; export const serveLocal = (search?: { local?: "true" | "false" }) => { let useLocal = false; @@ -38,43 +38,22 @@ export const resolveComponent = async ( ): 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 === "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/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/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/templates/doc.tsx b/src/templates/doc.tsx index 80ea392aa3..a14de0ba07 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -36,13 +36,23 @@ const ContentLayoutType = ({ return {children}; }; -export const DocTemplate = ({ doc }: { doc: ProcessedFile }) => { - // Get prev/next URLs from frontmatter for NavButtons - const prevUrl = doc.frontmatter.previousurl ?? ""; - const nextUrl = doc.frontmatter.nexturl ?? ""; +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 ?? ""; - // Show TOC by default, but allow hiding via frontmatter - const hasTOC = doc.frontmatter.showtoc ?? true; + // Use frontmatter if set, otherwise use the default for this content type + const hasTOC = doc.frontmatter.showtoc ?? tocDefault; return ( diff --git a/src/templates/guide.tsx b/src/templates/guide.tsx deleted file mode 100644 index aeeb63d6d7..0000000000 --- a/src/templates/guide.tsx +++ /dev/null @@ -1,121 +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 hasTOC = guide.frontmatter.showtoc ?? false; - - let image = "/images/" + guide.frontmatter.image; - if (image === "/images/null") { - image = "/images/default-thumb-guides.png"; - } - - return ( - - -
- -
- -
- -
- -
-
-
-
- - - -
-
-
- {hasTOC && ( -
- -
- )} -
-
-
-
- ); -}; From fb218b11a30321e0b3aa66808bd0a3cfd6c34236 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 08:44:50 -0600 Subject: [PATCH 13/46] variable for site name --- .github/workflows/auto-tag.yml | 2 +- .github/workflows/pr-e2e.yml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/auto-tag.yml b/.github/workflows/auto-tag.yml index 2f01367474..d898aa7bd1 100644 --- a/.github/workflows/auto-tag.yml +++ b/.github/workflows/auto-tag.yml @@ -30,4 +30,4 @@ jobs: with: expected_sha: ${{ github.sha }} target_env: live - pantheon_site_machine_name: documentation-in-nextjs + pantheon_site_machine_name: ${{ vars.PANTHEON_SITE_MACHINE_NAME }} diff --git a/.github/workflows/pr-e2e.yml b/.github/workflows/pr-e2e.yml index 3bc31ed08f..c09d107ec1 100644 --- a/.github/workflows/pr-e2e.yml +++ b/.github/workflows/pr-e2e.yml @@ -22,14 +22,14 @@ jobs: with: expected_sha: ${{ github.event.pull_request.head.sha }} target_env: pr-${{ github.event.pull_request.number }} - pantheon_site_machine_name: documentation-in-nextjs + pantheon_site_machine_name: ${{ vars.PANTHEON_SITE_MACHINE_NAME }} - name: warm containers id: warm_containers shell: bash env: - REFERENCE_BASE_URL: "https://dev-documentation-in-nextjs.pantheonsite.io" - DEPLOYED_BASE_URL: "https://pr-${{ github.event.pull_request.number }}-documentation-in-nextjs.pantheonsite.io" + REFERENCE_BASE_URL: "https://dev-${{ vars.PANTHEON_SITE_MACHINE_NAME }}.pantheonsite.io" + DEPLOYED_BASE_URL: "https://pr-${{ github.event.pull_request.number }}-${{ vars.PANTHEON_SITE_MACHINE_NAME }}.pantheonsite.io" run: | #!/bin/bash set +e @@ -54,7 +54,7 @@ jobs: - name: Check all status codes env: PR_NUMBER: ${{ github.event.pull_request.number }} - SITE_NAME: "documentation-in-nextjs" + SITE_NAME: "${{ vars.PANTHEON_SITE_MACHINE_NAME }}" run: | cd tests/404checking export URL="https://pr-${PR_NUMBER}-${SITE_NAME}.pantheonsite.io" @@ -86,8 +86,8 @@ jobs: id: backstop_tests shell: bash env: - REFERENCE_BASE_URL: "https://dev-documentation-in-nextjs.pantheonsite.io" - DEPLOYED_BASE_URL: "https://pr-${{ github.event.pull_request.number }}-documentation-in-nextjs.pantheonsite.io" + REFERENCE_BASE_URL: "https://dev-${{ vars.PANTHEON_SITE_MACHINE_NAME }}.pantheonsite.io" + DEPLOYED_BASE_URL: "https://pr-${{ github.event.pull_request.number }}-${{ vars.PANTHEON_SITE_MACHINE_NAME }}.pantheonsite.io" run: | #!/bin/bash set +e @@ -125,7 +125,7 @@ jobs: id: playwright_tests shell: bash env: - PLAYWRIGHT_DOMAIN: "pr-${{ github.event.pull_request.number }}-documentation-in-nextjs.pantheonsite.io" + PLAYWRIGHT_DOMAIN: "pr-${{ github.event.pull_request.number }}-${{ vars.PANTHEON_SITE_MACHINE_NAME }}.pantheonsite.io" run: | #!/bin/bash set +e From 81919661a7794745ed663720369045f6265c30a1 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 09:07:46 -0600 Subject: [PATCH 14/46] fixing flaky test --- tests/playwright/tests/search/search.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playwright/tests/search/search.spec.ts b/tests/playwright/tests/search/search.spec.ts index 9fcdaad11f..5db3df5f50 100644 --- a/tests/playwright/tests/search/search.spec.ts +++ b/tests/playwright/tests/search/search.spec.ts @@ -43,7 +43,7 @@ test('searching from homepage redirects to search page and shows expected result await page.waitForSelector('#results .addsearch-searchresults'); - const expectedPolicyHeadline = ' Overages Policy | Traffic | Pantheon Docs'; + const expectedPolicyHeadline = ' Overages Policy | Pantheon Docs'; const h3s1 = await page.locator('h3').allTextContents(); expect(h3s1.some(text => text.includes(expectedPolicyHeadline))).toBeTruthy(); }); From da8bfc44a2be76b0e2965ec11a98a28602433de4 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 10:04:29 -0600 Subject: [PATCH 15/46] adding variable for site machine name --- src/middleware.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index e0622be0b9..1b9689ddbe 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -226,7 +226,7 @@ export function middleware(request: NextRequest) { // This section handles the HTTP to HTTPS redirects for Pantheon sites. // See https://github.com/pantheon-systems/documentation/issues/9791 // for more context. - const siteMachineName = "documentation-in-nextjs"; + const siteMachineName = process.env.PANTHEON_SITE_MACHINE_NAME || "documentation-in-nextjs"; const incomingProtocol = request.headers.get('x-proto') || ''; const policyDocSurrogateKey = request.headers.get('policy-doc-surrogate-key') || ''; if (incomingProtocol === 'http://' && policyDocSurrogateKey) { From 23155dac1a64e4f7ccc70b3168270ea20a2eaf84 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 10:39:09 -0600 Subject: [PATCH 16/46] use onmi nav on terminus commands --- src/templates/terminus-command.tsx | 75 +----------------------------- 1 file changed, 2 insertions(+), 73 deletions(-) diff --git a/src/templates/terminus-command.tsx b/src/templates/terminus-command.tsx index 71673a3bfc..142dbbfadd 100644 --- a/src/templates/terminus-command.tsx +++ b/src/templates/terminus-command.tsx @@ -1,4 +1,5 @@ import Layout from "@/components/layout"; +import { OmniSidebarNav } from "@/components/omniSideBarNav"; import { DocsSidebarLayout } from "@/components/pds-middleware/docs-sidebar-layout"; import SearchBar from "@/components/header/search-bar"; import HeaderBody from "@/components/common/header-body"; @@ -7,7 +8,6 @@ import { CommandType } from "@/components/common/commands/types"; import { Partial } from "@/components/common/partial-component"; import Link from "next/link"; import { Pre } from "@/components/ui/mdx-wrapper/pre"; -import { Navbar } from "@/components/common/navbar"; const ContainerDiv = ({ children }: { children: React.ReactNode }) => (
{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" >
-
From 44ef66a51b0da08bdbcf5fc9fb9c8809df846fe9 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 11:22:48 -0600 Subject: [PATCH 17/46] Update pr-e2e.yml --- .github/workflows/pr-e2e.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr-e2e.yml b/.github/workflows/pr-e2e.yml index c09d107ec1..f0fafaf31b 100644 --- a/.github/workflows/pr-e2e.yml +++ b/.github/workflows/pr-e2e.yml @@ -140,6 +140,7 @@ jobs: vitest: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 From abf972f21ff7d3f821e862be0dcb9782c245741f Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 11:43:03 -0600 Subject: [PATCH 18/46] adding logging --- src/middleware.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/middleware.ts b/src/middleware.ts index 1b9689ddbe..cc2ead8310 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -227,6 +227,9 @@ export function middleware(request: NextRequest) { // See https://github.com/pantheon-systems/documentation/issues/9791 // for more context. const siteMachineName = process.env.PANTHEON_SITE_MACHINE_NAME || "documentation-in-nextjs"; + +console.log('the siteMachineName is:' + siteMachineName) + const incomingProtocol = request.headers.get('x-proto') || ''; const policyDocSurrogateKey = request.headers.get('policy-doc-surrogate-key') || ''; if (incomingProtocol === 'http://' && policyDocSurrogateKey) { From 89b427a3f6c13bb70d7635196ed6693844d58719 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 12:19:05 -0600 Subject: [PATCH 19/46] more debugging --- src/middleware.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index cc2ead8310..5d94595666 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -228,10 +228,15 @@ export function middleware(request: NextRequest) { // for more context. const siteMachineName = process.env.PANTHEON_SITE_MACHINE_NAME || "documentation-in-nextjs"; -console.log('the siteMachineName is:' + siteMachineName) +console.log('the siteMachineName is: ' + siteMachineName) const incomingProtocol = request.headers.get('x-proto') || ''; const policyDocSurrogateKey = request.headers.get('policy-doc-surrogate-key') || ''; + +console.log('the incoming protocol is: ' + incomingProtocol) +console.log('the policy doc surrogate key is: ' + policyDocSurrogateKey); + + if (incomingProtocol === 'http://' && policyDocSurrogateKey) { if (policyDocSurrogateKey.trim().endsWith(siteMachineName + '.pantheonsite.io')) { url.protocol = "https:"; From 2e7093963a98c8180b0a39d456897fcdd462b430 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 12:54:41 -0600 Subject: [PATCH 20/46] whitespace to retrigger build --- src/middleware.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index 5d94595666..a482ec75ca 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -236,7 +236,6 @@ console.log('the siteMachineName is: ' + siteMachineName) console.log('the incoming protocol is: ' + incomingProtocol) console.log('the policy doc surrogate key is: ' + policyDocSurrogateKey); - if (incomingProtocol === 'http://' && policyDocSurrogateKey) { if (policyDocSurrogateKey.trim().endsWith(siteMachineName + '.pantheonsite.io')) { url.protocol = "https:"; From 2e6b46c2c1fbff9adace3f9c61a8bc9ea1f7b498 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 13:14:20 -0600 Subject: [PATCH 21/46] removing extra debugging --- src/middleware.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index a482ec75ca..1b9689ddbe 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -227,15 +227,8 @@ export function middleware(request: NextRequest) { // See https://github.com/pantheon-systems/documentation/issues/9791 // for more context. const siteMachineName = process.env.PANTHEON_SITE_MACHINE_NAME || "documentation-in-nextjs"; - -console.log('the siteMachineName is: ' + siteMachineName) - const incomingProtocol = request.headers.get('x-proto') || ''; const policyDocSurrogateKey = request.headers.get('policy-doc-surrogate-key') || ''; - -console.log('the incoming protocol is: ' + incomingProtocol) -console.log('the policy doc surrogate key is: ' + policyDocSurrogateKey); - if (incomingProtocol === 'http://' && policyDocSurrogateKey) { if (policyDocSurrogateKey.trim().endsWith(siteMachineName + '.pantheonsite.io')) { url.protocol = "https:"; From ba5271b9e5e2e37c0e8bbad6ac927103fea08974 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Wed, 31 Dec 2025 13:38:27 -0600 Subject: [PATCH 22/46] Update pr-e2e.yml --- .github/workflows/pr-e2e.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/pr-e2e.yml b/.github/workflows/pr-e2e.yml index f0fafaf31b..c09d107ec1 100644 --- a/.github/workflows/pr-e2e.yml +++ b/.github/workflows/pr-e2e.yml @@ -140,7 +140,6 @@ jobs: vitest: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 From a14380d61c323aa6c3badb73b33b6a2e1b742353 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sat, 7 Mar 2026 18:39:54 -0600 Subject: [PATCH 23/46] removing pcc react libraries --- package-lock.json | 1227 +---------------- package.json | 2 - src/app/release-notes/[...uri]/page.tsx | 21 +- src/components/grid.tsx | 154 --- .../ui/mdx-wrapper/default-components.tsx | 22 +- src/components/ui/pds-re-export.ts | 1 - src/hooks/usePagination.ts | 8 +- src/lib/utils.ts | 23 +- 8 files changed, 93 insertions(+), 1365 deletions(-) delete mode 100644 src/components/grid.tsx diff --git a/package-lock.json b/package-lock.json index 2a74144b5b..f29e535673 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", @@ -1975,863 +1922,72 @@ ], "license": "MIT", "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", - "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "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" + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", + "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "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==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 8" } }, - "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==", + "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", - "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" + "engines": { + "node": ">= 8" } }, - "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.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": { @@ -7097,54 +6253,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", @@ -8575,15 +7683,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", @@ -10198,42 +9297,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", @@ -12235,15 +11298,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", @@ -12362,12 +11416,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", @@ -12393,12 +11441,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", @@ -12521,17 +11563,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", @@ -13974,15 +13005,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", @@ -14694,18 +13716,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", @@ -15898,24 +14908,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", @@ -16254,43 +15246,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", @@ -16733,18 +15688,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", @@ -17958,15 +16901,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", @@ -18344,18 +17278,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", @@ -18560,6 +17482,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", @@ -19033,24 +17956,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", @@ -20975,42 +19880,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 8a5b7d48a9..27cba35ee9 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,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", diff --git a/src/app/release-notes/[...uri]/page.tsx b/src/app/release-notes/[...uri]/page.tsx index 152450ba64..021eafdd6a 100644 --- a/src/app/release-notes/[...uri]/page.tsx +++ b/src/app/release-notes/[...uri]/page.tsx @@ -1,21 +1,10 @@ "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[] }>; @@ -25,11 +14,7 @@ export interface DynamicViewProps { }>; } -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 +65,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/ui/mdx-wrapper/default-components.tsx b/src/components/ui/mdx-wrapper/default-components.tsx index 66cddf1f3c..d7920d7cf2 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,24 @@ import { Popover } from "@/components/common/popover"; import { Wistia } from "@/components/common/wistia"; import Enablement from "@/components/common/enablement"; -export type MdxWrapperProps = ComponentProps; +// Local type definition (previously extracted from pcc-react-sdk ArticleRenderer) +export interface MdxWrapperArticle { + content?: string; + contentType?: string; + id?: string; + metadata?: Record; + publishedDate?: string | null; + publishingLevel?: string; + tags?: string[]; + title?: string; + updatedAt?: string | null; + previewActiveUntil?: string | null; +} + +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 index 84b5c1f12a..e93400022a 100644 --- a/src/hooks/usePagination.ts +++ b/src/hooks/usePagination.ts @@ -1,8 +1,8 @@ -import { - ArticleWithoutContent, - PaginatedArticle, -} from "@pantheon-systems/pcc-react-sdk"; import { useEffect, useState } from "react"; +import { ArticleWithoutContent } from "@/lib/utils"; + +// PaginatedArticle is the same as ArticleWithoutContent for our purposes +type PaginatedArticle = ArticleWithoutContent; interface Props { cursor?: string; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index b4dfcf451c..a7a71942de 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,8 +1,23 @@ -import { - Article, - ArticleWithoutContent, -} from "@pantheon-systems/pcc-react-sdk"; import { clsx, type ClassValue } from "clsx"; + +// Local type definitions (previously from pcc-react-sdk) +export interface ArticleMetadata { + image?: string; + description?: string; + [key: string]: unknown; +} + +export interface ArticleWithoutContent { + id: string; + title: string | null; + tags?: string[]; + metadata?: ArticleMetadata; + slug?: string; +} + +export interface Article extends ArticleWithoutContent { + content?: string; +} import { Metadata } from "next"; import { twMerge } from "tailwind-merge"; From 75ca69c9332994f54462a0a093a8506091e19678 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sat, 7 Mar 2026 18:50:43 -0600 Subject: [PATCH 24/46] deleting more unused code --- src/hooks/usePagination.ts | 48 ---------------------- src/lib/utils.ts | 84 -------------------------------------- 2 files changed, 132 deletions(-) delete mode 100644 src/hooks/usePagination.ts diff --git a/src/hooks/usePagination.ts b/src/hooks/usePagination.ts deleted file mode 100644 index e93400022a..0000000000 --- a/src/hooks/usePagination.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { useEffect, useState } from "react"; -import { ArticleWithoutContent } from "@/lib/utils"; - -// PaginatedArticle is the same as ArticleWithoutContent for our purposes -type PaginatedArticle = ArticleWithoutContent; - -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/utils.ts b/src/lib/utils.ts index a7a71942de..74ddcabd5f 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,24 +1,4 @@ import { clsx, type ClassValue } from "clsx"; - -// Local type definitions (previously from pcc-react-sdk) -export interface ArticleMetadata { - image?: string; - description?: string; - [key: string]: unknown; -} - -export interface ArticleWithoutContent { - id: string; - title: string | null; - tags?: string[]; - metadata?: ArticleMetadata; - slug?: string; -} - -export interface Article extends ArticleWithoutContent { - content?: string; -} -import { Metadata } from "next"; import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { @@ -34,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) { From 395a098bc8bf0dc57128f6a79b162ae59f1d4f06 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sat, 7 Mar 2026 18:57:17 -0600 Subject: [PATCH 25/46] npm update --- package-lock.json | 8 ++++---- package.json | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a74144b5b..86f2ef5508 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9600,9 +9600,9 @@ "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" }, "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.4.tgz", + "integrity": "sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==", "funding": [ { "type": "github", @@ -9611,7 +9611,7 @@ ], "license": "MIT", "dependencies": { - "strnum": "^1.1.1" + "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" diff --git a/package.json b/package.json index 8a5b7d48a9..cd1eb58be9 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "react": "19.1.5", "react-dom": "19.1.5", "glob": "10.5.0", - "playwright": "1.57.0" + "playwright": "1.57.0", + "fast-xml-parser": "4.5.4" } } From 56b422572b1b69ac0b34b44a3b53ab5c095410c7 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sat, 7 Mar 2026 19:01:44 -0600 Subject: [PATCH 26/46] npm security updates --- package-lock.json | 367 +++++++++++++++++++++++----------------------- package.json | 5 +- 2 files changed, 189 insertions(+), 183 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86f2ef5508..345417dbdd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3536,15 +3536,6 @@ "node": ">= 14" } }, - "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@redocly/openapi-core/node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -3558,18 +3549,6 @@ "node": ">= 14" } }, - "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@rehooks/component-size": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rehooks/component-size/-/component-size-1.0.3.tgz", @@ -3580,9 +3559,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", - "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -3596,9 +3575,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz", - "integrity": "sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -3610,9 +3589,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz", - "integrity": "sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -3624,9 +3603,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz", - "integrity": "sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -3638,9 +3617,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz", - "integrity": "sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -3652,9 +3631,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz", - "integrity": "sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -3666,9 +3645,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz", - "integrity": "sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -3680,9 +3659,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz", - "integrity": "sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -3694,9 +3673,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz", - "integrity": "sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -3708,9 +3687,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz", - "integrity": "sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -3722,9 +3701,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz", - "integrity": "sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -3735,10 +3714,24 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz", - "integrity": "sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -3750,9 +3743,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz", - "integrity": "sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -3764,9 +3771,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz", - "integrity": "sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -3778,9 +3785,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz", - "integrity": "sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -3792,9 +3799,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz", - "integrity": "sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -3806,9 +3813,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz", - "integrity": "sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -3820,9 +3827,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz", - "integrity": "sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -3833,10 +3840,38 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz", - "integrity": "sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -3848,9 +3883,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz", - "integrity": "sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -3861,10 +3896,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -6518,16 +6567,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -6558,22 +6597,6 @@ "node": ">= 6" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -7577,10 +7600,13 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/big-integer": { "version": "1.6.52", @@ -7616,14 +7642,15 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -8156,13 +8183,6 @@ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, "node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", @@ -10088,15 +10108,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/glob/node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -10113,21 +10124,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -13854,16 +13850,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -16624,9 +16622,9 @@ } }, "node_modules/rollup": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz", - "integrity": "sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -16640,26 +16638,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.2", - "@rollup/rollup-android-arm64": "4.46.2", - "@rollup/rollup-darwin-arm64": "4.46.2", - "@rollup/rollup-darwin-x64": "4.46.2", - "@rollup/rollup-freebsd-arm64": "4.46.2", - "@rollup/rollup-freebsd-x64": "4.46.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.2", - "@rollup/rollup-linux-arm-musleabihf": "4.46.2", - "@rollup/rollup-linux-arm64-gnu": "4.46.2", - "@rollup/rollup-linux-arm64-musl": "4.46.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.2", - "@rollup/rollup-linux-ppc64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-gnu": "4.46.2", - "@rollup/rollup-linux-riscv64-musl": "4.46.2", - "@rollup/rollup-linux-s390x-gnu": "4.46.2", - "@rollup/rollup-linux-x64-gnu": "4.46.2", - "@rollup/rollup-linux-x64-musl": "4.46.2", - "@rollup/rollup-win32-arm64-msvc": "4.46.2", - "@rollup/rollup-win32-ia32-msvc": "4.46.2", - "@rollup/rollup-win32-x64-msvc": "4.46.2", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, diff --git a/package.json b/package.json index cd1eb58be9..cea9e65372 100644 --- a/package.json +++ b/package.json @@ -111,6 +111,9 @@ "react-dom": "19.1.5", "glob": "10.5.0", "playwright": "1.57.0", - "fast-xml-parser": "4.5.4" + "fast-xml-parser": "4.5.4", + "@remix-run/router": "1.23.2", + "rollup": "4.59.0", + "minimatch": "10.2.4" } } From 83e03d795c4a77d78448369dadc420175983a7df Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:51:22 -0500 Subject: [PATCH 27/46] deleting unused pcc seed script --- seed/initial.ts | 341 ------------------------------------------------ 1 file changed, 341 deletions(-) delete mode 100644 seed/initial.ts 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; - } - } -} From 8f9ac790633326eb868d4ebe314afbeed3d815cd Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:51:50 -0500 Subject: [PATCH 28/46] deleting unused pcc seed script --- seed/initial-without-stringify.ts | 616 ------------------------------ 1 file changed, 616 deletions(-) delete mode 100644 seed/initial-without-stringify.ts 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; - } - } -} From 46bfab9a55f8102783d7b097ae319d92df9fa3d2 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:52:25 -0500 Subject: [PATCH 29/46] deleting unused pcc seed script for crating-content-structure --- seed/create-content-structure.ts | 112 ------------------------------- 1 file changed, 112 deletions(-) delete mode 100644 seed/create-content-structure.ts 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); From c607361705c1a3210de9d10e2aa43667ee8c0e45 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:53:35 -0500 Subject: [PATCH 30/46] delete unused workflow file --- .../workflows/send-content-to-ingest-api.yml | 56 ------------------- 1 file changed, 56 deletions(-) delete mode 100644 .github/workflows/send-content-to-ingest-api.yml 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 }} From 06cad4988023d74e209fa27da7ada05b7644af3a Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:54:13 -0500 Subject: [PATCH 31/46] delete unused pcc update file --- seed/update.ts | 91 -------------------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 seed/update.ts 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); From bbe1c1d3a32b91f2c432af1c76051fef49d1ee5b Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:54:38 -0500 Subject: [PATCH 32/46] delete unused helper --- seed/helper.ts | 648 ------------------------------------------------- 1 file changed, 648 deletions(-) delete mode 100644 seed/helper.ts 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 - ); - } -}; From 04360f1269e25aae652a4b7f591b03e31b6dd971 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:56:06 -0500 Subject: [PATCH 33/46] removing pcc update script --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index daf192fa72..8efe16c6af 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", From ef24438f9cad221891af74391588ed6230ea085b Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:57:33 -0500 Subject: [PATCH 34/46] removing unused code reference --- src/app/[...uri]/page.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/app/[...uri]/page.tsx b/src/app/[...uri]/page.tsx index 6e753a9337..4afdb1ca12 100644 --- a/src/app/[...uri]/page.tsx +++ b/src/app/[...uri]/page.tsx @@ -1,10 +1,6 @@ "use server"; import { notFound } from "next/navigation"; -import { - fetchArticleBySlug, - getAllPages, - singleSlugForFetch, -} from "@/lib/page-utils"; +import { getAllPages, singleSlugForFetch } from "@/lib/page-utils"; import { resolveComponent, serveLocalAsync } from "@/lib/resolve-component"; import { LandingTemplate } from "@/templates/landing"; import { getMdxProcessed } from "@/server/processor/mdx"; From 1528becb10e67776ebd5bc3fdf3b1393b36c90e2 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 20:58:38 -0500 Subject: [PATCH 35/46] deleting unused code --- src/app/[...uri]/page.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/[...uri]/page.tsx b/src/app/[...uri]/page.tsx index 4afdb1ca12..0c29b2a19e 100644 --- a/src/app/[...uri]/page.tsx +++ b/src/app/[...uri]/page.tsx @@ -1,10 +1,7 @@ "use server"; import { notFound } from "next/navigation"; -import { 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, From d07aa3b7d2f1c9124b64ab460ce478ecd318b5c6 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:03:11 -0500 Subject: [PATCH 36/46] removing dead code --- src/app/glossary/page.tsx | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) 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 ( From 0a1ee7cb4ee817b2afddddea5bc7593df695305e Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:04:31 -0500 Subject: [PATCH 37/46] removing dead code --- src/server/processor/json.tsx | 45 +---------------------------------- 1 file changed, 1 insertion(+), 44 deletions(-) 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) => { From 86dd0bfe8f90e0fdb98cbf5cc0ef644e434f6edb Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:06:30 -0500 Subject: [PATCH 38/46] removing dead code, graphql queries. --- src/lib/page-utils.ts | 151 ------------------------------------------ 1 file changed, 151 deletions(-) diff --git a/src/lib/page-utils.ts b/src/lib/page-utils.ts index 7e02fed419..77924715a4 100644 --- a/src/lib/page-utils.ts +++ b/src/lib/page-utils.ts @@ -622,154 +622,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(); -}; From c078e0bac79a7d54144ba1a70dd6fe81ab09f79e Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:07:53 -0500 Subject: [PATCH 39/46] removing unused ingestion code --- src/lib/ingestion.ts | 242 ------------------------------------------- 1 file changed, 242 deletions(-) delete mode 100644 src/lib/ingestion.ts 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; - } -} From 6d6f1d2c55cc330c31297dd6f75452e1ba189f69 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:08:58 -0500 Subject: [PATCH 40/46] remove PCC variable checks --- next.config.js | 23 ----------------------- 1 file changed, 23 deletions(-) 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: [ { From 45806db9a0c49b5b136fae74b57372f9dad0033e Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:10:13 -0500 Subject: [PATCH 41/46] remove PCC variable example --- .env.example | 10 ---------- 1 file changed, 10 deletions(-) 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= From d5cde6415e6d510ff83d328f1c8695b13a6eeac9 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:11:07 -0500 Subject: [PATCH 42/46] remove pcc comments --- src/app/page.tsx | 8 -------- 1 file changed, 8 deletions(-) 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]; From d2784d61a99deebaf27419261b6bd8ed3a5a2428 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:13:26 -0500 Subject: [PATCH 43/46] remove serve local code --- src/app/[...uri]/page.tsx | 10 ++-------- src/lib/resolve-component.tsx | 33 --------------------------------- 2 files changed, 2 insertions(+), 41 deletions(-) diff --git a/src/app/[...uri]/page.tsx b/src/app/[...uri]/page.tsx index 0c29b2a19e..63ee115ee1 100644 --- a/src/app/[...uri]/page.tsx +++ b/src/app/[...uri]/page.tsx @@ -93,10 +93,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(); @@ -118,10 +115,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/lib/resolve-component.tsx b/src/lib/resolve-component.tsx index a3c49ec160..0609a5c323 100644 --- a/src/lib/resolve-component.tsx +++ b/src/lib/resolve-component.tsx @@ -1,38 +1,5 @@ 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); -}; - export const resolveComponent = async ( pageData: PageDataWithoutComponent & { relativeFilePath?: string } ): Promise<{ Component: React.ReactNode; template: string }> => { From f5ef56c89b0201b75576e4cdd1fc37f0f6cfa207 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:25:20 -0500 Subject: [PATCH 44/46] removing more pcc --- src/app/[...uri]/page.tsx | 7 ------- src/app/release-notes/[...uri]/page.tsx | 1 - 2 files changed, 8 deletions(-) diff --git a/src/app/[...uri]/page.tsx b/src/app/[...uri]/page.tsx index 63ee115ee1..5174dd5211 100644 --- a/src/app/[...uri]/page.tsx +++ b/src/app/[...uri]/page.tsx @@ -9,11 +9,6 @@ import { export interface DynamicViewProps { params: { uri: string[] }; - searchParams: { - publishingLevel: "PRODUCTION" | "REALTIME"; - pccGrant: string | undefined; - local: "true" | "false" | undefined; - }; } const getPages = async ( @@ -83,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 @@ -104,7 +98,6 @@ export default async function Page(props: { export async function generateMetadata(props: { params: Promise; - searchParams: Promise; }) { const { uri } = await props.params; diff --git a/src/app/release-notes/[...uri]/page.tsx b/src/app/release-notes/[...uri]/page.tsx index 021eafdd6a..af4ed6f457 100644 --- a/src/app/release-notes/[...uri]/page.tsx +++ b/src/app/release-notes/[...uri]/page.tsx @@ -9,7 +9,6 @@ import { notFound } from "next/navigation"; export interface DynamicViewProps { params: Promise<{ uri: string[] }>; searchParams: Promise<{ - local: "true" | "false" | undefined; category?: string[]; }>; } From d26e38c1d1deb54d1ac7056324588daf6d0ac855 Mon Sep 17 00:00:00 2001 From: Steve Persch Date: Sun, 8 Mar 2026 21:36:51 -0500 Subject: [PATCH 45/46] merging and combining --- .../ui/mdx-wrapper/default-components.tsx | 10 ---------- src/templates/doc.tsx | 13 +------------ src/templates/release-note-listing/index.tsx | 13 +------------ src/templates/release-note.tsx | 13 +------------ 4 files changed, 3 insertions(+), 46 deletions(-) diff --git a/src/components/ui/mdx-wrapper/default-components.tsx b/src/components/ui/mdx-wrapper/default-components.tsx index d7920d7cf2..84a517d02b 100644 --- a/src/components/ui/mdx-wrapper/default-components.tsx +++ b/src/components/ui/mdx-wrapper/default-components.tsx @@ -28,18 +28,8 @@ import { Popover } from "@/components/common/popover"; import { Wistia } from "@/components/common/wistia"; import Enablement from "@/components/common/enablement"; -// Local type definition (previously extracted from pcc-react-sdk ArticleRenderer) export interface MdxWrapperArticle { content?: string; - contentType?: string; - id?: string; - metadata?: Record; - publishedDate?: string | null; - publishingLevel?: string; - tags?: string[]; - title?: string; - updatedAt?: string | null; - previewActiveUntil?: string | null; } export interface MdxWrapperProps { diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx index a14de0ba07..7858013144 100644 --- a/src/templates/doc.tsx +++ b/src/templates/doc.tsx @@ -89,18 +89,7 @@ export const DocTemplate = ({ // isoDate={guide.frontmatter.reviewed} /> {(prevUrl || nextUrl) && ( 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 ({ /> */} Date: Sun, 15 Mar 2026 18:00:22 -0500 Subject: [PATCH 46/46] Deleting unused files from Gatsby to Next.js migration --- active.json | 4915 ----------------- package-lock.json | 68 +- package.json | 1 - .../render-all-omni-paths-batched.spec.ts | 31 - .../render-all-omni-paths.spec.ts | 99 - playwright-tests/urls.json | 698 --- playwright.config.ts | 69 - release-notes-listing.json | 1 - 8 files changed, 34 insertions(+), 5848 deletions(-) delete mode 100644 active.json delete mode 100644 playwright-tests/render-all-omni-paths-batched.spec.ts delete mode 100644 playwright-tests/render-all-omni-paths.spec.ts delete mode 100644 playwright-tests/urls.json delete mode 100644 playwright.config.ts delete mode 100644 release-notes-listing.json 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/package-lock.json b/package-lock.json index 7598a8f254..97a763ceca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2073,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", @@ -13969,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", diff --git a/package.json b/package.json index 8efe16c6af..532dbd6c61 100644 --- a/package.json +++ b/package.json @@ -107,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