diff --git a/CODEOWNERS b/CODEOWNERS index f0a1afd242..db2c8f7c4e 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -17,3 +17,5 @@ source/content/guides/integrated-composer/ @pantheon-systems/lifecycle-ops source/content/guides/multisite/ @pantheon-systems/cms-platform # The cms-platform team is responsible for External Libraries on Pantheon source/content/external-libraries @pantheon-systems/cms-platform +# There is a team just for release note permissions +source/releasenotes/ @pantheon-systems/release-note-authors diff --git a/gatsby-config.js b/gatsby-config.js index 2de3befba8..dd84fbb00a 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -64,6 +64,13 @@ module.exports = { name: `data`, }, }, + { + resolve: `gatsby-source-filesystem`, + options: { + path: `${__dirname}/source/releasenotescategories`, + name: `releasenotescategories`, + }, + }, { // Converts Markdown into HTML resolve: `gatsby-transformer-remark`, // https://www.gatsbyjs.com/plugins/gatsby-transformer-remark/ @@ -97,6 +104,14 @@ module.exports = { name: `changelogs`, }, }, + + { + resolve: `gatsby-source-filesystem`, + options: { + path: `${__dirname}/source/releasenotes`, + name: `releasenotes`, + }, + }, { resolve: `gatsby-source-filesystem`, options: { diff --git a/gatsby-node.js b/gatsby-node.js index 288a567556..5cfcd56ef7 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -1,7 +1,7 @@ const path = require(`path`) const crypto = require("crypto") -const matter = require('gray-matter'); -var fs = require('fs-extra') +const matter = require("gray-matter") +var fs = require("fs-extra") /* For additional reference material, see @@ -11,11 +11,11 @@ The contents of this file define how the source content is converted into web pages. It is prime for refactoring. */ - /** This helper function determines what slug a piece of content will use */ const calculateSlug = (node, getNode) => { const fileName = getNode(node.parent).name // Sets the filename from GraphQL - if (node.frontmatter.permalink) { //If the "permalink" frontmatter value is present... + if (node.frontmatter.permalink) { + //If the "permalink" frontmatter value is present... return node.frontmatter.permalink // return it. .replace(":basename", fileName) // If permalink includes ":basename", prepend the filename to the slug .replace("docs", "") // If it includes "docs", remove it. Docs is added by the pathPrefix in gatsby-config.js @@ -27,18 +27,33 @@ const calculateSlug = (node, getNode) => { } // This section creates the changelog slug based on the YYYY-MM-DD-MONTH.md template - if (getNode(node.parent).absolutePath.includes("changelogs")) { // If the file is in the changelogs directory... - const split = fileName.split('-'); // split the file name where hyphenated... + if (getNode(node.parent).absolutePath.includes("changelogs")) { + // If the file is in the changelogs directory... + const split = fileName.split("-") // split the file name where hyphenated... return `changelog/${split[0]}/${split[1]}` // and return a slug of changelog/YYYY/MM } + // This section creates the releasenotes slug based on the YYYY-MM-DD-slug.md template + if (getNode(node.parent).absolutePath.includes("releasenotes")) { + // If the file is in the releasenotes directory... + // split the file name where hyphenated. + const split = fileName.split("-") + // set a const to remaining slug based on the keys from split that are not the date. + const remainingSlug = split.slice(3).join("-") + return `release-notes/${split[0]}/${split[1]}/${remainingSlug}` // and return a slug of releasenotes/YYYY/MM/slug + } return `${fileName}` // Otherwise, as long as there is a filename in GraphQL, use it as the slug. } - /* This helper function helps determine which template should be applied to a piece of content */ -const calculateTemplate = (node, defaultTemplate) => { // The functions accepts as arguments a GraphQL node and default template. - if (node.frontmatter && node.frontmatter.layout && node.frontmatter.layout !== null) { // If the node has the layout value in frontmatter... +const calculateTemplate = (node, defaultTemplate) => { + // The functions accepts as arguments a GraphQL node and default template. + if ( + node.frontmatter && + node.frontmatter.layout && + node.frontmatter.layout !== null + ) { + // If the node has the layout value in frontmatter... return node.frontmatter.layout // use that value. } @@ -48,42 +63,39 @@ const calculateTemplate = (node, defaultTemplate) => { // The functions accepts /* These helper functions are used to provide multi-page guide pages with the previous and next pages in the guide, to be used in the construction of the table of contents. */ -const calculatePrevious = (guide) => { // The function accepts as an argument the node of the guide page in question - if (!guide.previous) { // If the page doesn't have a value for the "previous" field in GraphQL - return null; // return nothing. +const calculatePrevious = (guide) => { + // The function accepts as an argument the node of the guide page in question + if (!guide.previous) { + // If the page doesn't have a value for the "previous" field in GraphQL + return null // return nothing. } // Also return nothing if the guide_directory value doesn't exist. - if (guide.node.fields.guide_directory !== guide.previous.fields.guide_directory) { - return null; + if ( + guide.node.fields.guide_directory !== guide.previous.fields.guide_directory + ) { + return null } // Otherwise, return the slug of the page identified as previous by GraphQL. How it determines which one is previous, unclear to me at this time. - return guide.previous.fields.slug; + return guide.previous.fields.slug } // Same as above. const calculateNext = (guide) => { if (!guide.next) { - return null; + return null } if (guide.node.fields.guide_directory !== guide.next.fields.guide_directory) { - return null; + return null } - return guide.next.fields.slug; + return guide.next.fields.slug } -const digest = str => - (str != null) ? - crypto - .createHash("md5") - .update(str) - .digest("hex") - : - crypto - .createHash("md5") - .update(" ") - .digest("hex") +const digest = (str) => + str != null + ? crypto.createHash("md5").update(str).digest("hex") + : crypto.createHash("md5").update(" ").digest("hex") exports.onCreateWebpackConfig = ({ actions }) => { actions.setWebpackConfig({ @@ -94,13 +106,12 @@ exports.onCreateWebpackConfig = ({ actions }) => { } exports.createSchemaCustomization = ({ actions, schema }) => { - actions.createFieldExtension({ name: `defaultFalse`, extend() { return { resolve(source, args, context, info) { - if (source[info.fieldName] == null ) { + if (source[info.fieldName] == null) { return false } return source[info.fieldName] @@ -127,10 +138,10 @@ exports.createPages = ({ graphql, actions }) => { { allDocs: allMdx( filter: { - fileAbsolutePath: { regex: "/content(?!/(partials|changelog|guides)/)/"} - frontmatter: { - draft: {ne: true} + fileAbsolutePath: { + regex: "/content(?!/(partials|changelog|guides|releasenotes)/)/" } + frontmatter: { draft: { ne: true } } } ) { edges { @@ -151,8 +162,8 @@ exports.createPages = ({ graphql, actions }) => { allGuides: allMdx( filter: { - fileAbsolutePath: { regex: "/guides/"} - frontmatter: { draft: {ne: true}} + fileAbsolutePath: { regex: "/guides/" } + frontmatter: { draft: { ne: true } } } sort: { fields: [fileAbsolutePath], order: ASC } ) { @@ -184,15 +195,45 @@ exports.createPages = ({ graphql, actions }) => { } } + allReleaseNotes: allMdx( + filter: { fileAbsolutePath: { regex: "/releasenotes/" } } + sort: { fields: [fileAbsolutePath], order: DESC } + ) { + edges { + previous { + fields { + slug + } + } + + node { + id + frontmatter { + title + categories + published_date + } + fields { + slug + } + } + + next { + fields { + slug + } + } + } + } + allChangelogs: allMdx( filter: { - fileAbsolutePath: { regex: "/changelogs/"} - frontmatter: { draft: {ne: true}} - }, + fileAbsolutePath: { regex: "/changelogs/" } + frontmatter: { draft: { ne: true } } + } sort: { fields: [fileAbsolutePath], order: DESC } ) { edges { - previous { fields { slug @@ -214,7 +255,6 @@ exports.createPages = ({ graphql, actions }) => { slug } } - } } @@ -234,7 +274,6 @@ exports.createPages = ({ graphql, actions }) => { } } } - dataJson { commands { description @@ -243,16 +282,20 @@ exports.createPages = ({ graphql, actions }) => { usage } } - + releasenotescategoriesJson { + categories { + slug + } + } } - `).then(result => { + `).then((result) => { if (result.errors) { throw result.errors } // Create doc pages. const docs = result.data.allDocs.edges - docs.forEach(doc => { + docs.forEach((doc) => { const template = calculateTemplate(doc.node, "doc") createPage({ path: doc.node.fields.slug, @@ -265,10 +308,10 @@ exports.createPages = ({ graphql, actions }) => { // Create guide pages. const guides = result.data.allGuides.edges - guides.forEach(guide => { + guides.forEach((guide) => { if (guide.node.fields.guide_directory !== null) { - const previous = calculatePrevious(guide); - const next = calculateNext(guide); + const previous = calculatePrevious(guide) + const next = calculateNext(guide) const template = calculateTemplate(guide.node, "guide") createPage({ path: guide.node.fields.slug, @@ -277,7 +320,7 @@ exports.createPages = ({ graphql, actions }) => { slug: guide.node.fields.slug, guide_directory: guide.node.fields.guide_directory, previous, - next + next, }, }) } else { @@ -294,8 +337,10 @@ exports.createPages = ({ graphql, actions }) => { // Create changelog pages. const changelogs = result.data.allChangelogs.edges - changelogs.forEach(changelog => { - const previous = changelog.previous ? changelog.previous.fields.slug || null : null + changelogs.forEach((changelog) => { + const previous = changelog.previous + ? changelog.previous.fields.slug || null + : null const next = changelog.next ? changelog.next.fields.slug || null : null const template = calculateTemplate(changelog.node, "changelog") createPage({ @@ -304,14 +349,41 @@ exports.createPages = ({ graphql, actions }) => { context: { slug: changelog.node.fields.slug, next: previous, - previous: next + previous: next, + }, + }) + }) + + // Create changelog pagination. + const postsPerPage = 6 + const numPages = Math.ceil(changelogs.length / postsPerPage) + Array.from({ length: numPages }).forEach((_, i) => { + const currentPage = i + 1 + const next = + currentPage === 1 + ? null + : currentPage === 2 + ? `/changelog/` + : `/changelog/page/${currentPage - 1}` + const previous = + currentPage < numPages ? `/changelog/page/${currentPage + 1}` : null + createPage({ + path: i === 0 ? `/changelog/` : `/changelog/page/${i + 1}`, + component: path.resolve("./src/templates/changelogs.js"), + context: { + limit: postsPerPage, + skip: i * postsPerPage, + numPages, + currentPage, + previous, + next, }, }) }) // Create Terminus Command pages const terminusCommands = result.data.dataJson.commands - terminusCommands.forEach(command => { + terminusCommands.forEach((command) => { const slugRegExp = /:/g const slug = command.name.replace(slugRegExp, "-") createPage({ @@ -319,35 +391,62 @@ exports.createPages = ({ graphql, actions }) => { component: path.resolve(`./src/templates/terminusCommand.js`), context: { slug: slug, - name: command.name - } + name: command.name, + }, }) }) - // Create changelog pagination. - const postsPerPage = 6 - const numPages = Math.ceil(changelogs.length / postsPerPage) - Array.from({ length: numPages }).forEach((_, i) => { - const currentPage = i + 1; - const next = currentPage === 1 ? null : (currentPage === 2 ? `/changelog/` : `/changelog/page/${currentPage - 1}`); - const previous = currentPage < numPages ? `/changelog/page/${currentPage + 1}` : null; + // Create release notes without pagination. At a later date, we may want to add pagination. + // And can reused the code above. + createPage({ + path: `/release-notes/`, + component: path.resolve("./src/templates/releaseNotesListing.js"), + }) + + // Create Terminus Command pages + const allReleaseNoteCategories = + result.data.releasenotescategoriesJson.categories + allReleaseNoteCategories.forEach((category) => { createPage({ - path: i === 0 ? `/changelog/` : `/changelog/page/${i + 1}`, - component: path.resolve("./src/templates/changelogs.js"), + path: `/release-notes/${category.slug}`, + component: path.resolve( + "./src/templates/releaseNotesListingByCategory.js" + ), context: { - limit: postsPerPage, - skip: i * postsPerPage, - numPages, - currentPage, - previous, - next + category: category.slug, + }, + }) + }) + + // terminusCommands.forEach(command => { + // const slugRegExp = /:/g + // const slug = command.name.replace(slugRegExp, "-") + // createPage({ + // path: `terminus/commands/${slug}`, + // component: path.resolve(`./src/templates/terminusCommand.js`), + // context: { + // slug: slug, + // name: command.name + // } + // }) + // }) + + // Create each release note page. + const releaseNotes = result.data.allReleaseNotes.edges + releaseNotes.forEach((releaseNote) => { + const template = calculateTemplate(releaseNote.node, "releaseNotePage") + createPage({ + path: releaseNote.node.fields.slug, + component: path.resolve(`./src/templates/${template}.js`), + context: { + slug: releaseNote.node.fields.slug, }, }) }) // Create contributor pages. const contributors = result.data.allContributorYaml.edges - contributors.forEach(contributor => { + contributors.forEach((contributor) => { createPage({ path: `contributors/${contributor.node.yamlId}`, component: path.resolve(`./src/templates/contributor.js`), @@ -359,7 +458,7 @@ exports.createPages = ({ graphql, actions }) => { // Create topics pages. const topics = result.data.allLandingsYaml.edges - topics.forEach(topic => { + topics.forEach((topic) => { createPage({ path: topic.node.path, component: path.resolve(`./src/templates/landing.js`), @@ -403,14 +502,14 @@ exports.onCreateNode = ({ node, getNode, actions }) => { // MDX content if (node.internal.type === `Mdx`) { - const sourceInstanceName = getNode(node.parent).sourceInstanceName; - if (sourceInstanceName === 'content') { - const editPath = `source/content/${getNode(node.parent).relativePath}`; - // Add editPath field + const sourceInstanceName = getNode(node.parent).sourceInstanceName + if (sourceInstanceName === "content") { + const editPath = `source/content/${getNode(node.parent).relativePath}` + // Add editPath field createNodeField({ name: `editPath`, node, - value: editPath + value: editPath, }) } @@ -419,11 +518,11 @@ exports.onCreateNode = ({ node, getNode, actions }) => { createNodeField({ name: `slug`, node, - value: slug + value: slug, }) if (slug.includes("guides/")) { - if (getNode(node.parent).relativeDirectory !== 'guides') { + if (getNode(node.parent).relativeDirectory !== "guides") { // Add guide_directory field createNodeField({ name: `guide_directory`, @@ -433,9 +532,15 @@ exports.onCreateNode = ({ node, getNode, actions }) => { } } - if (sourceInstanceName === 'changelogs') { - const content = matter(node.internal.content, { excerpt: true, excerpt_separator: '' } ); - const excerpt = content.excerpt || ""; + if ( + sourceInstanceName === "changelogs" || + sourceInstanceName === "releasenotes" + ) { + const content = matter(node.internal.content, { + excerpt: true, + excerpt_separator: "", + }) + const excerpt = content.excerpt || "" createNodeField({ name: `excerpt`, @@ -507,3 +612,6 @@ exports.onPreBootstrap = () => { fs.copySync(scriptsCopyFrom, scriptsCopyTo) } + +/* todo should there be an error thrown if a release note category is set that is not allowed */ +/* todo, infer published date from file name. And throw an error if there are files that don't follow the pattern. */ diff --git a/package-lock.json b/package-lock.json index a258818c67..b86ba77fb5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,8 +68,12 @@ "devDependencies": { "@octokit/rest": "^16.43.2", "date-fns": "^2.29.3", + "mark.js": "^8.11.1", "prettier": "^2.8.3", "react-date-range": "^1.4.0" + }, + "engines": { + "node": ">=18.0.0 <20.0.0" } }, "node_modules/@algolia/cache-browser-local-storage": { @@ -4126,9 +4130,9 @@ } }, "node_modules/@pantheon-systems/pds-toolkit-react": { - "version": "1.0.0-dev.58", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.58.tgz", - "integrity": "sha512-WW0L/s4ZmsP1QjlmpLf4nBk6+WDXnJHxtoNphHtD/mBvG8x9o7A7M5yZC9jivNQize1kZO73vEn/UNcxM4T7Hg==", + "version": "1.0.0-dev.73", + "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.73.tgz", + "integrity": "sha512-fHHJsATAUhxs0riomJ9K2LvrUgYqgsEw1YGk7nZ6ZxRQyb/ilpPgEDHLxT3o5UHjKrk0qhNarx01MR5xTRhlfw==", "dependencies": { "@floating-ui/react": "^0.24.3", "focus-trap-react": "^10.2.1", @@ -18789,6 +18793,12 @@ "node": ">=0.10.0" } }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "node_modules/markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", @@ -29356,9 +29366,9 @@ } }, "@pantheon-systems/pds-toolkit-react": { - "version": "1.0.0-dev.58", - "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.58.tgz", - "integrity": "sha512-WW0L/s4ZmsP1QjlmpLf4nBk6+WDXnJHxtoNphHtD/mBvG8x9o7A7M5yZC9jivNQize1kZO73vEn/UNcxM4T7Hg==", + "version": "1.0.0-dev.73", + "resolved": "https://registry.npmjs.org/@pantheon-systems/pds-toolkit-react/-/pds-toolkit-react-1.0.0-dev.73.tgz", + "integrity": "sha512-fHHJsATAUhxs0riomJ9K2LvrUgYqgsEw1YGk7nZ6ZxRQyb/ilpPgEDHLxT3o5UHjKrk0qhNarx01MR5xTRhlfw==", "requires": { "@floating-ui/react": "^0.24.3", "focus-trap-react": "^10.2.1", @@ -40240,6 +40250,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" }, + "mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, "markdown-escapes": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", diff --git a/package.json b/package.json index 2c292e303a..fc4d46d703 100644 --- a/package.json +++ b/package.json @@ -67,6 +67,7 @@ "devDependencies": { "@octokit/rest": "^16.43.2", "date-fns": "^2.29.3", + "mark.js": "^8.11.1", "prettier": "^2.8.3", "react-date-range": "^1.4.0" }, diff --git a/source/data/commands.json b/source/data/commands.json index c551ab2feb..a5e30d6af2 100644 --- a/source/data/commands.json +++ b/source/data/commands.json @@ -3,6 +3,7 @@ "name": "Terminus", "version": "3.3.0" }, + "commands": [ { "name": "aliases", @@ -16690,4 +16691,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md b/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md new file mode 100644 index 0000000000..f1b6e3f088 --- /dev/null +++ b/source/releasenotes/2023-09-01-early-access-customer-scheduled-jobs.md @@ -0,0 +1,8 @@ +--- +title: "Early Access: Customer Scheduled Jobs" +published_date: "2023-09-01" +categories: [new-feature, tools-apis] +--- +[The Terminus Scheduled Jobs Plugin](/customer-scheduled-cron-jobs) allows you to schedule and automate specific cron jobs according to site requirements without affecting performance. + +You can specify the desired frequency (e.g., daily, weekly, monthly, hourly), and the actions to be performed. The system then executes the scheduled jobs automatically based on the provided instructions. Helps with long running jobs by granting a total budget of 300 mins (in a 24 hr period) to run jobs. diff --git a/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md b/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md new file mode 100644 index 0000000000..35393f27de --- /dev/null +++ b/source/releasenotes/2023-09-01-early-access-streamlined-user-offboarding.md @@ -0,0 +1,8 @@ +--- +title: "Early Access: Streamlined User Offboarding" +published_date: "2023-09-01" +categories: [account-management, user-interface] +--- +Helps Workspace Admins more effectively manage user access by providing the ability to offboard users from multiple sites in a single click. + +For more information, see Pantheon’s documentation on [Workspace Offboarding](/workspace-offboarding). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other Pantheon customers & super-users. diff --git a/source/releasenotes/2023-09-01-front-end-sites-enhancements.md b/source/releasenotes/2023-09-01-front-end-sites-enhancements.md new file mode 100644 index 0000000000..aa3dbaff01 --- /dev/null +++ b/source/releasenotes/2023-09-01-front-end-sites-enhancements.md @@ -0,0 +1,17 @@ +--- +title: "Front-End Sites Enhancements" +published_date: "2023-09-01" +categories: [front-end-sites, user-interface] +--- +We released version 1.0.5 of the [WP Decoupled Preview plugin](https://wordpress.org/plugins/decoupled-preview/) which contains a bug fix specific to WordPress 6.3. WP Decoupled Preview enables content editors to see their changes in the context of a front-end framework (served through [Pantheon's Front-End Sites](/guides/decoupled/overview)) like Next.js. To try this functionality, request access to Front-End Sites and [follow our tutorial for spinning up our WordPress + Next.js starter](/guides/decoupled/wp-nextjs-frontend-starters). + +Can you tell we want more teams to sign up for Front-End Sites? If you don't yet have access, as of the last month you'll now see callouts in the site creation flow that lead to Front-End Sites Access: + +![Sign up page in the Pantheon dashboard for decoupled Early Access](../images/decoupled/ea-decoupled-signup.png) + +Thanks to efforts in the last month, once you spin up new codebases in Front-End Sites, you will also find: +- Newly improved readme files in your fresh projects. +- Health checks that fire early in the build process if your Front-End Site may be likely to fail due to missing variables for a back-end CMS +- A better navigation and search functionality for [the Decoupled Kit project documentation](https://decoupledkit.pantheon.io/docs). + +Want to chat more about these kinds of sites? Join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack Channel. diff --git a/source/releasenotes/2023-09-01-new-php-defaults.md b/source/releasenotes/2023-09-01-new-php-defaults.md new file mode 100644 index 0000000000..83a3e63906 --- /dev/null +++ b/source/releasenotes/2023-09-01-new-php-defaults.md @@ -0,0 +1,8 @@ +--- +title: New PHP Defaults +published_date: "2023-09-01" +categories: [infrastructure, wordpress, drupal, action-required] +--- +Pantheon has pushed an update to WordPress and Drupal 7 core upstreams which sets PHP 8.1 as the new default PHP version, rather than 7.4. + +Please test this core update thoroughly before deploying to the Live environment. If your site requires an older version of PHP, or if you'd like to upgrade to PHP 8.2, see [Pantheon’s documentation on how to manage PHP versions via the pantheon.yml configuration file](/guides/php/php-versions). diff --git a/source/releasenotes/2023-09-01-object-cache-pro.md b/source/releasenotes/2023-09-01-object-cache-pro.md new file mode 100644 index 0000000000..d7f761463f --- /dev/null +++ b/source/releasenotes/2023-09-01-object-cache-pro.md @@ -0,0 +1,8 @@ +--- +title: Object Cache Pro +published_date: "2023-09-01" +categories: [wordpress, performance, new-feature] +--- +WordPress sites can now leverage an upgraded object caching solution on Pantheon! Object Cache Pro is a highly optimized premium WordPress plugin that integrates with Redis for business class performance. [Find out more about our perspective Object Caching from Steve Persch, Director of Developer Experience](https://pantheon.io/blog/pantheon-includes-object-cache-pro-painless-improved-performance). + +See Pantheon’s documentation for instructions on [how to enable Object Cache Pro](/object-cache/wordpress). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other customers using Object Cache Pro. diff --git a/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md b/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md new file mode 100644 index 0000000000..a4c6261767 --- /dev/null +++ b/source/releasenotes/2023-09-01-pantheon-advanced-page-cache-wordpress-plugin-updates.md @@ -0,0 +1,8 @@ +--- +title: Pantheon Advanced Page Cache WordPress Plugin Updates +published_date: "2023-09-01" +categories: [wordpress, action-required, performance] +--- +We released an update for the [Pantheon Advanced Page Cache](https://wordpress.org/plugins/pantheon-advanced-page-cache/) WordPress plugin which adds a filter to allow disabling surrogate keys for posts' taxonomy terms. This can be especially helpful for posts with large numbers of taxonomies (such as WooCommerce products with a large number of global attributes). + +For more information, see [Pantheon documentation](/guides/wordpress-configurations/plugins#disable-surrogate-keys-for-taxonomy-terms). diff --git a/source/releasenotes/2023-09-01-php-security-updates.md b/source/releasenotes/2023-09-01-php-security-updates.md new file mode 100644 index 0000000000..9533b9e382 --- /dev/null +++ b/source/releasenotes/2023-09-01-php-security-updates.md @@ -0,0 +1,8 @@ +--- +title: PHP Security Updates +published_date: "2023-09-01" +categories: [infrastructure, security, action-required] +--- +Pantheon has deployed PHP versions [8.2.9](https://www.php.net/ChangeLog-8.php#8.2.9), [8.1.22](https://www.php.net/ChangeLog-8.php#8.1.22), and [8.0.30](https://www.php.net/ChangeLog-8.php#8.0.30) to customer sites running on the platform. These releases address vulnerabilities disclosed in [CVE-2023-3823](https://nvd.nist.gov/vuln/detail/CVE-2023-3823) and [CVE-2023-3824](https://nvd.nist.gov/vuln/detail/CVE-2023-3824). + +If you are using PHP 8.2, 8.1 or 8.0, there is nothing further that you need to do. If you are still on PHP 7.4 or earlier, though, you should schedule some time to upgrade to a supported version.While the vulnerabilities patched in these latest releases are not reported to affect PHP 7.4, the fact remains that there could be (and probably are) unpatched vulnerabilities in the end-of-life versions. Read more about it in Greg Anderson’s [blog post](https://pantheon.io/blog/php-829-security-release-demonstrates-pantheons-commitment-protecting-your-sites). diff --git a/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md b/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md new file mode 100644 index 0000000000..7f187e2bee --- /dev/null +++ b/source/releasenotes/2023-09-01-solr-search-for-wordpress-2-5-0-update.md @@ -0,0 +1,10 @@ +--- +title: "Solr Search for WordPress 2.5.0 Update" +published_date: "2023-09-01" +categories: [wordpress, action-required, performance] +--- +We released an update for the [Solr Search for WordPress plugin](https://wordpress.org/plugins/solr-power/) which disables auto-commit by default and allows cron to push solr commits regularly instead. + +This drastically improves the performance of large sites and avoids 503 errors related to hard committing on every update. This update is recommended for all WordPress sites currently running the plugin. + +You can still enable auto-commit by explicitly setting `SOLRPOWER_DISABLE_AUTOCOMMIT` to `false`. diff --git a/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md b/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md new file mode 100644 index 0000000000..bb525e6e07 --- /dev/null +++ b/source/releasenotes/2023-09-01-wordpress-multisite-search-and-replace.md @@ -0,0 +1,10 @@ +--- +title: WordPress Multisite Search and Replace +published_date: "2023-09-01" +categories: [wordpress, new-feature] +--- +WordPress Multisites can now run automated Search and Replace when cloning the database between environments or spinning up new environments. + +Subdomain Multisites can use a domain map to define the URLs between environments, or auto-convert to a subdirectory Multisite in non-live environments. + +For more information, see Pantheon’s documentation on [Search and Replace](/guides/multisite/search-replace/). Or join the [#WordPress Slack Channel](http://slackin.pantheon.io) to connect with other Pantheon customers & super-users. diff --git a/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md b/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md new file mode 100644 index 0000000000..a82127adcf --- /dev/null +++ b/source/releasenotes/2023-09-20-drupal-sa-core-2023-006.md @@ -0,0 +1,10 @@ +--- +title: "Drupal Security Update: SA Core 2023-006" +published_date: "2023-09-20" +categories: [security] +--- + + +On September 20th, [Drupal core updates were released to address a critical vulnerability in the JSON:API module](https://status.pantheon.io/incidents/vj842n7k7w40). Those updates became immediately available within the Pantheon dashboard for one-click code updates. Additionally, [our engineers updated our CDN to mitigate potential attacks](https://status.pantheon.io/incidents/598zxv2v8l7p). + +If you have a Drupal site using JSON:API we suggest you update as soon as possible if you haven't done so already. And even if you aren't using JSON:API, it'll still feel good to apply an update, right? To better understand the nature of security updates, [come watch the Pantheon YouTube Livestream on October 25th](https://www.youtube.com/watch?v=WV2ZSeBOziU). diff --git a/source/releasenotes/2023-10-01-design-system-integration-docs.md b/source/releasenotes/2023-10-01-design-system-integration-docs.md new file mode 100644 index 0000000000..7402191829 --- /dev/null +++ b/source/releasenotes/2023-10-01-design-system-integration-docs.md @@ -0,0 +1,8 @@ +--- +title: "Design System Integration: Docs" +published_date: "2023-10-01" +categories: [user-interface, documentation] +--- +We're excited to announce that our documentation site has been seamlessly integrated with our brand-new design system. This enhancement brings a fresh and cohesive look to our documentation, providing a unified and visually appealing experience for our users. Explore the updated, improved, and more accessible [Docs site](/) today. + +![Docs Design System](../images/DocsDesignSystem.png) diff --git a/source/releasenotes/2023-10-01-drupal-security-update.md b/source/releasenotes/2023-10-01-drupal-security-update.md new file mode 100644 index 0000000000..c0bd845192 --- /dev/null +++ b/source/releasenotes/2023-10-01-drupal-security-update.md @@ -0,0 +1,8 @@ +--- +title: Drupal Security Update +published_date: "2023-10-01" +categories: [drupal, security, action-required] +--- +On September 20th, [Drupal core updates were released to address a critical vulnerability in the JSON:API module](https://status.pantheon.io/incidents/vj842n7k7w40). Those updates became immediately available within the Pantheon dashboard for one-click code updates. Additionally, [our engineers updated our CDN to mitigate potential attacks](https://status.pantheon.io/incidents/598zxv2v8l7p). + +If you have a Drupal site using JSON:API we suggest you update as soon as possible if you haven't done so already. And even if you aren't using JSON:API, it'll still feel good to apply an update, right? To better understand the nature of security updates, [come watch the Pantheon YouTube Livestream on October 25th](https://www.youtube.com/watch?v=WV2ZSeBOziU). diff --git a/source/releasenotes/2023-10-01-front-end-sites-settings.md b/source/releasenotes/2023-10-01-front-end-sites-settings.md new file mode 100644 index 0000000000..868863e46d --- /dev/null +++ b/source/releasenotes/2023-10-01-front-end-sites-settings.md @@ -0,0 +1,7 @@ +--- +title: "Front-End Sites Settings" +published_date: "2023-10-01" +categories: [front-end-sites, wordpress, user-interface] +--- +The Pantheon Front-End Sites Settings page is now available for users of the WordPress for Front-End project. It provides a simplified post install experience where users can copy environment variables for use in the Front-End Sites dashboard, and also test their preview endpoint. Instructions for creating a new WordPress project [can be found here](https://decoupledkit.pantheon.io/docs/backend-starters/decoupled-wordpress/creating-a-new-project). +Want to chat more about these kinds of sites? Join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack Channel. diff --git a/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md b/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md new file mode 100644 index 0000000000..ef5e30b54b --- /dev/null +++ b/source/releasenotes/2023-10-01-php-8-1-and-8-2-updated-to-their-latest-patch-releases.md @@ -0,0 +1,6 @@ +--- +title: "PHP 8.1 and 8.2 updated to their latest patch releases" +published_date: "2023-10-01" +categories: [infrastructure, security] +--- +PHP 8.2.11 and 8.1.24 were released on the platform. They contain the latest bug fixes and security releases for PHP. As a reminder, PHP 8.0 will reach End-of-Life on 26 November 2023. For the best performance and security, Pantheon recommends running PHP 8.1 and above. diff --git a/source/releasenotes/2023-10-01-php-memory-limits-updates.md b/source/releasenotes/2023-10-01-php-memory-limits-updates.md new file mode 100644 index 0000000000..659a5dab50 --- /dev/null +++ b/source/releasenotes/2023-10-01-php-memory-limits-updates.md @@ -0,0 +1,8 @@ +--- +title: PHP Memory Limits Updates +published_date: "2023-10-01" +categories: [infrastructure, performance] +--- +Sometimes you just need more memory to serve your site reliably. To learn more about why we doubled the memory for most site plans, [check out this blog](https://pantheon.io/blog/pantheon-increases-php-memory-limits-performance-and-elite-plans) by Rachel Whitton, Lead Technical Writer here at Pantheon. + +To take advantage of the increased memory limit, [contact our customer support team](/guides/support/contact-support/). Or drop by our [regular Zoom-based office hours](http://pantheon.io/developer-community/office-hours). diff --git a/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md b/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md new file mode 100644 index 0000000000..70f2640dc4 --- /dev/null +++ b/source/releasenotes/2023-10-01-wpml-improved-edge-caching-compatibility-cache-hit-ratio-increased-24-percent.md @@ -0,0 +1,6 @@ +--- +title: "WPML Improved Edge Caching Compatibility - Cache Hit Ratio Increased 24%" +published_date: "2023-10-01" +categories: [wordpress, performance, infrastructure] +--- +Global CDN now has improved compatibility with the WPML multilingual WordPress plugin. Page variations for each language can be cached at the edge. This update was rolled out automatically for all sites that use the WPML plugin and increased site cache hit ratio by 24% on average. diff --git a/source/releasenotes/2023-11-01-composer-logs-visibility.md b/source/releasenotes/2023-11-01-composer-logs-visibility.md new file mode 100644 index 0000000000..973c93073b --- /dev/null +++ b/source/releasenotes/2023-11-01-composer-logs-visibility.md @@ -0,0 +1,6 @@ +--- +title: Composer Logs Visibility +published_date: "2023-11-01" +categories: [new-feature, tools-apis] +--- +Visibility into composer logs has been a top customer request. Now, if you need to debug a composer build failure due to an error, install the Terminus Composer Logs plugin on your machine to view more details. Upstream Update logs are also available. Installation instructions and command usage can be found [here in the plugin's GitHub repository](https://github.com/pantheon-systems/terminus-composer-logs-plugin). diff --git a/source/releasenotes/2023-11-01-faster-backups.md b/source/releasenotes/2023-11-01-faster-backups.md new file mode 100644 index 0000000000..322a7fdc46 --- /dev/null +++ b/source/releasenotes/2023-11-01-faster-backups.md @@ -0,0 +1,6 @@ +--- +title: Faster Backups +published_date: "2023-11-01" +categories: [infrastructure, performance] +--- +The File System team at Pantheon achieved significant speed improvements in backup processes. The Valhalla export process was overhauled, allowing backups to be constructed from new objects, cutting down export times by 25-83%. This was accomplished by initiating object retrieval immediately after receiving MANIFEST metadata, omitting empty files, and promptly archiving received files. diff --git a/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md b/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md new file mode 100644 index 0000000000..2ba96b55fe --- /dev/null +++ b/source/releasenotes/2023-11-01-front-end-sites-build-caching-and-node-js-versions.md @@ -0,0 +1,10 @@ +--- +title: "Front-End Sites Build Caching and Node.js Versions" +published_date: "2023-11-01" +categories: [front-end-sites, action-required, performance] +--- +Pantheon introduced a new build pipeline for Front End Sites to significantly improve build times. Beginning on November 13th, 2023, newly created sites are automatically using the new pipeline and cannot opt back to the old pipeline. Sites made prior to that date can opt-in to the new pipeline to take advantage of the new features. All pre-existing sites that do not opt-in will be switched over for new builds on or around January 15th. + +Additionally, we are adding support for Node 18 (for dynamic sites) and 20 (for both static and dynamic sites). To select a specific version, Pantheon is [moving away from using .nvmrc](/guides/decoupled/overview/manage-settings#nodejs-version) and will instead look to the [“engines” field](https://docs.npmjs.com/cli/v8/configuring-npm/package-json#engines) in your project’s `package.json` file. + +To find out more about adopting the new pipeline, [check out our documentation](/guides/decoupled/overview/v1-pipeline), and read our [blog post](https://pantheon.io/blog/opt-now-faster-build-pipeline-front-end-sites?utm_medium=email&utm_source=newsletter&utm_content=front_end_sites_blog&utm_campaign=2023_11_PSU_ALL_US_Novemeber_Changelog_Newsletter) about how we’re already experiencing the benefits of this internally at Pantheon. diff --git a/source/releasenotes/2023-11-01-streamlined-user-offboarding.md b/source/releasenotes/2023-11-01-streamlined-user-offboarding.md new file mode 100644 index 0000000000..24cbc3ec79 --- /dev/null +++ b/source/releasenotes/2023-11-01-streamlined-user-offboarding.md @@ -0,0 +1,10 @@ +--- +title: Streamlined User Offboarding +published_date: "2023-11-01" +categories: [account-management, user-interface, new-feature] +--- +Administrators of large workspaces will now be able to easily remove access for offboarded users at scale. When a member of your team changes jobs, or for whatever reason you need to remove a person from your sites, you can now do so faster + +As you remove users from your workspace or site team, you will be prompted to remove access across all sites that a given user may be connected to, which can save multiple clicks and manual labor to ensure the right access levels are maintained. + +To learn more about how this new offboarding process works, take a look at our [documentation](/guides/account-mgmt/workspace-sites-teams/teams#remove-a-user). diff --git a/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md b/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md new file mode 100644 index 0000000000..78c158b62f --- /dev/null +++ b/source/releasenotes/2023-11-01-vpat-issued-for-product-accessibility.md @@ -0,0 +1,8 @@ +--- +title: VPAT issued for product accessibility +published_date: "2023-11-01" +categories: [infrastructure, user-interface] +--- +* As part of Pantheon’s commitment to accessibility, diversity, and inclusion, we are proud to announce that we have completed an external audit of our platform’s accessibility features and the results are available in our [WCAG 2.1 AA VPAT](https://drive.google.com/file/d/1SYnzTsVNOyK4-5eLRYnNQJArdVsM8JUD/view). +* Our teams have ongoing efforts to improve accessibility further and have outlined goals to improve our support of WCAG 2.1 AA criteria for the next two quarters. +* Our partners and customers who depend on WCAG compliant products can confidently continue to use the platform knowing that we hold accessibility to be an important function of the services we provide. diff --git a/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md b/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md new file mode 100644 index 0000000000..eba22d7482 --- /dev/null +++ b/source/releasenotes/2023-11-01-wordpress-native-php-sessions-1-4-update.md @@ -0,0 +1,8 @@ +--- +title: "WordPress Native PHP Sessions 1.4 Update" +published_date: "2023-11-01" +categories: [wordpress, action-required, performance] +--- +The WordPress Native PHP Sessions plugin added primary keys to its custom tables in 1.2.2 for greater performance and redundancy, but did not upgrade existing sites. Now, version 1.4 includes an optional upgrade command for sites that installed the plugin prior to the 1.2.2 release. + +Our open source [WordPress Native PHP Sessions](https://wordpress.org/plugins/wp-native-php-sessions/) is available in the WordPress.org plugins repo. diff --git a/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md b/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md new file mode 100644 index 0000000000..2e3e86a491 --- /dev/null +++ b/source/releasenotes/2023-12-01-delete-front-end-sites-multidevs-directly-from-dashboard-for-streamlined-management.md @@ -0,0 +1,8 @@ +--- +title: "Delete Front-End Sites Multidevs Directly From Dashboard for Streamlined Management" +published_date: "2023-12-01" +categories: [front-end-sites, user-interface] +--- +We've enhanced your site management experience by enabling the ability to delete Multidevs directly from your Front-End Sites dashboard. This upgrade simplifies project organization, providing you with a seamless process to remove unnecessary Multidevs. + +This intuitive addition streamlines site management, offering a hassle-free solution to keep your projects organized and optimized. Find detailed instructions [here](/guides/decoupled/overview/fes-multidev#delete-a-multidev-environment). diff --git a/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md b/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md new file mode 100644 index 0000000000..7a914f3d6f --- /dev/null +++ b/source/releasenotes/2023-12-01-elevated-experience-with-front-end-sites-drupal-starter-kit.md @@ -0,0 +1,13 @@ +--- +title: "Elevated Experience With Front-End Sites Drupal Starter Kit" +published_date: "2023-12-01" +categories: [front-end-sites, user-interface, drupal] +--- +The Pantheon Drupal Starter Kit for Front-End Sites has undergone significant improvements. +* **Setup experience**: The setup process is now more user-friendly and guided for a seamless experience. +* **Health check script**: The newly introduced health check script alerts you to known configuration issues before a build fails. +* **Front-End Sites settings**: Effortlessly navigate through the Settings page, simplifying the testing of your preview endpoint, and allowing convenient copying of environment variables for use in the Front-End Sites Dashboard. + +Curious about creating a new Drupal project with these enhancements? Find detailed instructions [here](https://decoupledkit.pantheon.io/docs/backend-starters/decoupled-drupal/creating-a-new-project). + +For further insights and discussions on similar sites, join the [#front-end-frameworks](https://pantheon-community.slack.com/archives/C01DXGMFZFB) Slack channel. diff --git a/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md b/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md new file mode 100644 index 0000000000..00cd4b5dc6 --- /dev/null +++ b/source/releasenotes/2023-12-01-optimized-monitoring-for-high-volume-directories.md @@ -0,0 +1,6 @@ +--- +title: Optimized monitoring for high-volume directories +published_date: "2023-12-01" +categories: [new-feature, user-interface, performance] +--- +Introducing proactive alerts tailored for directories with substantial file counts, which could impact performance or accessibility. Stay informed with timely notifications delivered [directly to your dashboard](/guides/filesystem/large-files/#alerts) and via email when file counts reach 50,000 and 100,000. This feature empowers you to efficiently manage your file system and address potential issues promptly. diff --git a/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md b/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md new file mode 100644 index 0000000000..337de3a79e --- /dev/null +++ b/source/releasenotes/2023-12-01-upgraded-security-measures-for-uninterrupted-webops-experience.md @@ -0,0 +1,12 @@ +--- +title: Upgraded Security Measures for Uninterrupted WebOps Experience +published_date: "2023-12-01" +categories: [infrastructure, security, performance] +--- +We're thrilled to announce an impactful upgrade to Pantheon's security infrastructure, reinforcing our commitment to safeguarding your websites. In response to the escalating sophistication of distributed denial-of-service (DDoS) attacks, we've implemented innovative solutions to fortify our defenses. Particularly, we've addressed a surge in Layer 7 attacks targeting content management systems, ensuring resilience even without our Advanced Global CDN's Web Application Firewall (WAF). + +**Key benefits:** +* **Advanced DDoS protection**: Our engineers have proactively countered Layer 7 attacks, mitigating risks posed by inauthentic traffic targeting web content management systems. +* **Rate limiting capabilities**: We've introduced rate limiting capabilities within our Global CDN, curbing abusive traffic effectively. This ensures a stable online presence, even during large-scale attacks, preventing wider stability issues. + +For more in-depth insights into the measures we've taken and the value they bring to your Pantheon experience, delve into the [full blog post](https://pantheon.io/blog/pantheon-improves-protection-malicious-traffic). Your website's security and stability are our top priorities, and this enhancement is another step in our ongoing commitment to delivering a robust WebOps platform. diff --git a/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md b/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md new file mode 100644 index 0000000000..1744d7d693 --- /dev/null +++ b/source/releasenotes/2023-12-01-wordpress-6-4-2-now-available-for-enhanced-security.md @@ -0,0 +1,6 @@ +--- +title: "WordPress 6.4.2 Now Available for Enhanced Security" +published_date: "2023-12-01" +categories: [wordpress, security, action-required] +--- +In response to a critical security vulnerability, [WordPress 6.4.2](https://wordpress.org/news/2023/12/wordpress-6-4-2-maintenance-security-release/) was released on December 6, 2023. To ensure the safety of your site, Pantheon strongly advises an immediate upgrade. Prioritize your site's security – upgrade now! diff --git a/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md b/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md new file mode 100644 index 0000000000..bf77105ae8 --- /dev/null +++ b/source/releasenotes/2024-01-22-drupal-7-99-release-bug fixes-and-feature-enhancements.md @@ -0,0 +1,17 @@ +--- +title: Drupal 7.99 release - bug fixes & feature enhancements +published_date: "2024-01-22" +categories: [drupal] +--- + +Pantheon has seamlessly integrated the Drupal 7.99 release, packed with bug fixes and exciting feature enhancements. + +
{subTitle}
+{subTitle}
{ + // Todo, more type checking. + if (!dateString) { + return null + } + + // Turn ReleaseNoteData.frontmatter.published_date into a date object. + // And then format it as Month Day, Year. + // https://stackoverflow.com/questions/3552461/how-to-format-a-javascript-date + const date = new Date(dateString) + const options = { year: "numeric", month: "long", day: "numeric" } + const formattedDate = date.toLocaleDateString(undefined, options) + + return ( ++
{description}
diff --git a/src/components/mdxWrapper.js b/src/components/mdxWrapper.js new file mode 100644 index 0000000000..fdef6ab4d5 --- /dev/null +++ b/src/components/mdxWrapper.js @@ -0,0 +1,50 @@ +import React from "react" +import { MDXRenderer } from "gatsby-plugin-mdx" +import { MDXProvider } from "@mdx-js/react" +import Callout from "../components/callout" +import Alert from "../components/alert" +import Accordion from "../components/accordion" +import ExternalLink from "../components/externalLink" +import Popover from "../components/popover" +import TabList from "../components/tabList" +import Tab from "../components/tab" +import Card from "../components/card" +import CardGroup from "../components/cardGroup" +import Enablement from "../components/enablement" +import Color from "../components/color.js" +import Download from "../components/download" + +import { + headline2, + headline3, + headline4, +} from "../components/releaseHeadlines" + +const shortcodes = { + Callout, + Alert, + Accordion, + ExternalLink, + Popover, + TabList, + Tab, + Card, + CardGroup, + Enablement, + Color, + Download, + h1: headline2, + h2: headline3, + h3: headline4, +} + + + +const MdxWrapper = ({ mdx }) => { + return ( +