4cd8b23032
Follow-up to the earlier enabling of classes/variables etc. Bug Related issues linked using fixes #number Integration tests added Errors have helpful link attached, see contributing.md Feature Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. Related issues linked using fixes #number Integration tests added Documentation added Telemetry added. In case of a feature if it's used or not. Errors have helpful link attached, see contributing.md Documentation / Examples Make sure the linting passes by running pnpm lint The examples guidelines are followed from our contributing doc Co-authored-by: Steven <steven@ceriously.com>
62 lines
2 KiB
TypeScript
62 lines
2 KiB
TypeScript
import { fileExists } from '../../lib/file-exists'
|
|
import { getPagePaths } from '../../shared/lib/page-path/get-page-paths'
|
|
import { nonNullable } from '../../lib/non-nullable'
|
|
import { join, sep, normalize } from 'path'
|
|
import { promises } from 'fs'
|
|
import { warn } from '../../build/output/log'
|
|
import chalk from '../../lib/chalk'
|
|
|
|
async function isTrueCasePagePath(pagePath: string, pagesDir: string) {
|
|
const pageSegments = normalize(pagePath).split(sep).filter(Boolean)
|
|
const segmentExistsPromises = pageSegments.map(async (segment, i) => {
|
|
const segmentParentDir = join(pagesDir, ...pageSegments.slice(0, i))
|
|
const parentDirEntries = await promises.readdir(segmentParentDir)
|
|
return parentDirEntries.includes(segment)
|
|
})
|
|
|
|
return (await Promise.all(segmentExistsPromises)).every(Boolean)
|
|
}
|
|
|
|
/**
|
|
* Finds a page file with the given parameters. If the page is duplicated with
|
|
* multiple extensions it will throw, otherwise it will return the *relative*
|
|
* path to the page file or null if it is not found.
|
|
*
|
|
* @param pagesDir Absolute path to the pages folder with trailing `/pages`.
|
|
* @param normalizedPagePath The page normalized (it will be denormalized).
|
|
* @param pageExtensions Array of page extensions.
|
|
*/
|
|
export async function findPageFile(
|
|
pagesDir: string,
|
|
normalizedPagePath: string,
|
|
pageExtensions: string[]
|
|
): Promise<string | null> {
|
|
const pagePaths = getPagePaths(normalizedPagePath, pageExtensions)
|
|
const [existingPath, ...others] = (
|
|
await Promise.all(
|
|
pagePaths.map(async (path) =>
|
|
(await fileExists(join(pagesDir, path))) ? path : null
|
|
)
|
|
)
|
|
).filter(nonNullable)
|
|
|
|
if (!existingPath) {
|
|
return null
|
|
}
|
|
|
|
if (!(await isTrueCasePagePath(existingPath, pagesDir))) {
|
|
return null
|
|
}
|
|
|
|
if (others.length > 0) {
|
|
warn(
|
|
`Duplicate page detected. ${chalk.cyan(
|
|
join('pages', existingPath)
|
|
)} and ${chalk.cyan(
|
|
join('pages', others[0])
|
|
)} both resolve to ${chalk.cyan(normalizedPagePath)}.`
|
|
)
|
|
}
|
|
|
|
return existingPath
|
|
}
|