website: fixes and tweaks for plugin docs (#10812)
* website: sort nested plugin docs files * website: allow ignored .md files in plugin docs folders * website: allow plugin docs/README.md only as extra file * website: fix issue with latest link for plugin docs.zip
This commit is contained in:
parent
5e17dbeff2
commit
89931d0f2a
|
@ -13,7 +13,10 @@ const parseDocsZip = require('./parse-docs-zip')
|
||||||
// docs files were missing or invalid, with a path to resolution
|
// docs files were missing or invalid, with a path to resolution
|
||||||
async function fetchDocsFiles({ repo, tag }) {
|
async function fetchDocsFiles({ repo, tag }) {
|
||||||
// If there's a docs.zip asset, we'll prefer that
|
// If there's a docs.zip asset, we'll prefer that
|
||||||
const docsZipUrl = `https://github.com/${repo}/releases/download/${tag}/docs.zip`
|
const docsZipUrl =
|
||||||
|
tag === 'latest'
|
||||||
|
? `https://github.com/${repo}/releases/latest/download/docs.zip`
|
||||||
|
: `https://github.com/${repo}/releases/download/${tag}/docs.zip`
|
||||||
const docsZipResponse = await fetch(docsZipUrl, { method: 'GET' })
|
const docsZipResponse = await fetch(docsZipUrl, { method: 'GET' })
|
||||||
const hasDocsZip = docsZipResponse.status === 200
|
const hasDocsZip = docsZipResponse.status === 200
|
||||||
// Note: early return!
|
// Note: early return!
|
||||||
|
|
|
@ -95,16 +95,19 @@ async function mergeRemotePlugins(remotePluginsFile, navData) {
|
||||||
// console.log(JSON.stringify(routesWithPlugins, null, 2))
|
// console.log(JSON.stringify(routesWithPlugins, null, 2))
|
||||||
// Also, sort the child routes so the order is alphabetical
|
// Also, sort the child routes so the order is alphabetical
|
||||||
routesWithPlugins.sort((a, b) => {
|
routesWithPlugins.sort((a, b) => {
|
||||||
|
// ensure casing does not affect ordering
|
||||||
|
const aTitle = a.title.toLowerCase()
|
||||||
|
const bTitle = b.title.toLowerCase()
|
||||||
// (exception: "Overview" comes first)
|
// (exception: "Overview" comes first)
|
||||||
if (a.title == 'Overview') return -1
|
if (aTitle === 'overview') return -1
|
||||||
if (b.title === 'Overview') return 1
|
if (bTitle === 'overview') return 1
|
||||||
// (exception: "Community-Supported" comes last)
|
// (exception: "Community-Supported" comes last)
|
||||||
if (a.title == 'Community-Supported') return 1
|
if (aTitle === 'community-supported') return 1
|
||||||
if (b.title === 'Community-Supported') return -1
|
if (bTitle === 'community-supported') return -1
|
||||||
// (exception: "Custom" comes second-last)
|
// (exception: "Custom" comes second-last)
|
||||||
if (a.title == 'Custom') return 1
|
if (aTitle === 'custom') return 1
|
||||||
if (b.title === 'Custom') return -1
|
if (bTitle === 'custom') return -1
|
||||||
return a.title < b.title ? -1 : a.title > b.title ? 1 : 0
|
return aTitle < bTitle ? -1 : aTitle > bTitle ? 1 : 0
|
||||||
})
|
})
|
||||||
// return n
|
// return n
|
||||||
return { ...n, routes: routesWithPlugins }
|
return { ...n, routes: routesWithPlugins }
|
||||||
|
@ -159,6 +162,16 @@ async function resolvePluginEntryDocs(pluginConfigEntry) {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
//
|
//
|
||||||
|
navNodes.sort((a, b) => {
|
||||||
|
// ensure casing does not affect ordering
|
||||||
|
const aTitle = a.title.toLowerCase()
|
||||||
|
const bTitle = b.title.toLowerCase()
|
||||||
|
// (exception: "Overview" comes first)
|
||||||
|
if (aTitle === 'overview') return -1
|
||||||
|
if (bTitle === 'overview') return 1
|
||||||
|
return aTitle < bTitle ? -1 : aTitle > bTitle ? 1 : 0
|
||||||
|
})
|
||||||
|
//
|
||||||
const navNodesByComponent = navNodes.reduce((acc, navLeaf) => {
|
const navNodesByComponent = navNodes.reduce((acc, navLeaf) => {
|
||||||
const componentType = navLeaf.remoteFile.filePath.split('/')[1]
|
const componentType = navLeaf.remoteFile.filePath.split('/')[1]
|
||||||
if (!acc[componentType]) acc[componentType] = []
|
if (!acc[componentType]) acc[componentType] = []
|
||||||
|
|
|
@ -13,15 +13,22 @@ const COMPONENT_TYPES = [
|
||||||
// with at least one .mdx file within it.
|
// with at least one .mdx file within it.
|
||||||
function validatePluginDocsFiles(filePaths) {
|
function validatePluginDocsFiles(filePaths) {
|
||||||
function isValidPath(filePath) {
|
function isValidPath(filePath) {
|
||||||
|
// Allow the docs root folder
|
||||||
const isDocsRoot = filePath === 'docs/'
|
const isDocsRoot = filePath === 'docs/'
|
||||||
|
// Allow component folders
|
||||||
const isComponentRoot = COMPONENT_TYPES.reduce((acc, type) => {
|
const isComponentRoot = COMPONENT_TYPES.reduce((acc, type) => {
|
||||||
return acc || filePath === `docs/${type}/`
|
return acc || filePath === `docs/${type}/`
|
||||||
}, false)
|
}, false)
|
||||||
|
// Allow .mdx files in component folders
|
||||||
const isComponentMdx = COMPONENT_TYPES.reduce((acc, type) => {
|
const isComponentMdx = COMPONENT_TYPES.reduce((acc, type) => {
|
||||||
const mdxPathRegex = new RegExp(`^docs/${type}/(.*).mdx$`)
|
const mdxPathRegex = new RegExp(`^docs/${type}/(.*).mdx$`)
|
||||||
return acc || mdxPathRegex.test(filePath)
|
return acc || mdxPathRegex.test(filePath)
|
||||||
}, false)
|
}, false)
|
||||||
const isValidPath = isDocsRoot || isComponentRoot || isComponentMdx
|
// Allow docs/README.md files
|
||||||
|
const isDocsReadme = filePath == 'docs/README.md'
|
||||||
|
// Combine all allowed types
|
||||||
|
const isValidPath =
|
||||||
|
isDocsRoot || isComponentRoot || isComponentMdx || isDocsReadme
|
||||||
return isValidPath
|
return isValidPath
|
||||||
}
|
}
|
||||||
const invalidPaths = filePaths.filter((f) => !isValidPath(f))
|
const invalidPaths = filePaths.filter((f) => !isValidPath(f))
|
||||||
|
|
Loading…
Reference in New Issue