mirror of https://github.com/twbs/bootstrap.git
73 lines
2.5 KiB
TypeScript
73 lines
2.5 KiB
TypeScript
import fs from 'node:fs'
|
|
import path from 'node:path'
|
|
import { getConfig } from './config'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
// The docs directory path relative to the root of the project.
|
|
export const docsDirectory = getConfig().docsDir
|
|
|
|
// A list of all the docs paths that were generated during a build.
|
|
const generatedVersionedDocsPaths: string[] = []
|
|
|
|
export function getVersionedDocsPath(docsPath: string): string {
|
|
const { docs_version } = getConfig()
|
|
|
|
const sanitizedDocsPath = docsPath.replace(/^\//, '')
|
|
|
|
if (import.meta.env.PROD) {
|
|
generatedVersionedDocsPaths.push(sanitizedDocsPath)
|
|
}
|
|
|
|
return `/docs/${docs_version}/${sanitizedDocsPath}`
|
|
}
|
|
|
|
// Validate that all the generated versioned docs paths point to an existing page or asset.
|
|
// This is useful to catch typos in docs paths.
|
|
// Note: this function is only called during a production build.
|
|
// Note: this could at some point be refactored to use Astro list of generated `routes` accessible in the
|
|
// `astro:build:done` integration hook. Altho as of 03/14/2023, this is not possible due to the route's data only
|
|
// containing informations regarding the last page generated page for dynamic routes.
|
|
// @see https://github.com/withastro/astro/issues/5802
|
|
export function validateVersionedDocsPaths(distUrl: URL) {
|
|
const { docs_version } = getConfig()
|
|
|
|
for (const docsPath of generatedVersionedDocsPaths) {
|
|
const sanitizedDocsPath = sanitizeVersionedDocsPathForValidation(docsPath)
|
|
const absoluteDocsPath = fileURLToPath(new URL(path.join('./docs', docs_version, sanitizedDocsPath), distUrl))
|
|
|
|
const docsPathExists = fs.existsSync(absoluteDocsPath)
|
|
|
|
if (!docsPathExists) {
|
|
throw new Error(`A versioned docs path was generated but does not point to a valid page or asset: '${docsPath}'.`)
|
|
}
|
|
}
|
|
}
|
|
|
|
export function getDocsRelativePath(docsPath: string) {
|
|
return path.join(docsDirectory, docsPath)
|
|
}
|
|
|
|
export function getDocsStaticFsPath() {
|
|
return path.join(getDocsFsPath(), 'static')
|
|
}
|
|
|
|
export function getDocsPublicFsPath() {
|
|
return path.join(getDocsFsPath(), 'public')
|
|
}
|
|
|
|
export function getDocsFsPath() {
|
|
return path.join(process.cwd(), docsDirectory)
|
|
}
|
|
|
|
function sanitizeVersionedDocsPathForValidation(docsPath: string) {
|
|
// Remove the hash part of the path if any.
|
|
let sanitizedDocsPath = docsPath.split('#')[0]
|
|
|
|
// Append the `index.html` part if the path doesn't have an extension.
|
|
if (!sanitizedDocsPath.includes('.')) {
|
|
sanitizedDocsPath = path.join(sanitizedDocsPath, 'index.html')
|
|
}
|
|
|
|
return sanitizedDocsPath
|
|
}
|