|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
import {
|
|
|
|
|
loadConfigFromFile,
|
|
|
|
|
normalizePath,
|
|
|
|
|
type Logger,
|
|
|
|
|
type Plugin,
|
|
|
|
|
type ViteDevServer
|
|
|
|
|
} from 'vite'
|
|
|
|
@ -13,7 +14,11 @@ import { resolveRewrites } from './rewritesPlugin'
|
|
|
|
|
|
|
|
|
|
export const dynamicRouteRE = /\[(\w+?)\]/g
|
|
|
|
|
|
|
|
|
|
export async function resolvePages(srcDir: string, userConfig: UserConfig) {
|
|
|
|
|
export async function resolvePages(
|
|
|
|
|
srcDir: string,
|
|
|
|
|
userConfig: UserConfig,
|
|
|
|
|
logger: Logger
|
|
|
|
|
) {
|
|
|
|
|
// Important: fast-glob doesn't guarantee order of the returned files.
|
|
|
|
|
// We must sort the pages so the input list to rollup is stable across
|
|
|
|
|
// builds - otherwise different input order could result in different exports
|
|
|
|
@ -39,7 +44,11 @@ export async function resolvePages(srcDir: string, userConfig: UserConfig) {
|
|
|
|
|
;(dynamicRouteRE.test(file) ? dynamicRouteFiles : pages).push(file)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const dynamicRoutes = await resolveDynamicRoutes(srcDir, dynamicRouteFiles)
|
|
|
|
|
const dynamicRoutes = await resolveDynamicRoutes(
|
|
|
|
|
srcDir,
|
|
|
|
|
dynamicRouteFiles,
|
|
|
|
|
logger
|
|
|
|
|
)
|
|
|
|
|
pages.push(...dynamicRoutes.routes.map((r) => r.path))
|
|
|
|
|
|
|
|
|
|
const rewrites = resolveRewrites(pages, userConfig.rewrites)
|
|
|
|
@ -141,7 +150,7 @@ export const dynamicRoutesPlugin = async (
|
|
|
|
|
if (!/\.md$/.test(ctx.file)) {
|
|
|
|
|
Object.assign(
|
|
|
|
|
config,
|
|
|
|
|
await resolvePages(config.srcDir, config.userConfig)
|
|
|
|
|
await resolvePages(config.srcDir, config.userConfig, config.logger)
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
for (const id of mods) {
|
|
|
|
@ -154,7 +163,8 @@ export const dynamicRoutesPlugin = async (
|
|
|
|
|
|
|
|
|
|
export async function resolveDynamicRoutes(
|
|
|
|
|
srcDir: string,
|
|
|
|
|
routes: string[]
|
|
|
|
|
routes: string[],
|
|
|
|
|
logger: Logger
|
|
|
|
|
): Promise<SiteConfig['dynamicRoutes']> {
|
|
|
|
|
const pendingResolveRoutes: Promise<ResolvedRouteConfig[]>[] = []
|
|
|
|
|
const routeFileToModulesMap: Record<string, Set<string>> = {}
|
|
|
|
@ -170,7 +180,7 @@ export async function resolveDynamicRoutes(
|
|
|
|
|
const pathsFile = paths.find((p) => fs.existsSync(p))
|
|
|
|
|
|
|
|
|
|
if (pathsFile == null) {
|
|
|
|
|
console.warn(
|
|
|
|
|
logger.warn(
|
|
|
|
|
c.yellow(
|
|
|
|
|
`Missing paths file for dynamic route ${route}: ` +
|
|
|
|
|
`a corresponding ${paths[0]} (or .ts/.mjs/.mts) file is needed.`
|
|
|
|
@ -183,15 +193,15 @@ export async function resolveDynamicRoutes(
|
|
|
|
|
let mod = routeModuleCache.get(pathsFile)
|
|
|
|
|
if (!mod) {
|
|
|
|
|
try {
|
|
|
|
|
mod = (await loadConfigFromFile({} as any, pathsFile)) as RouteModule
|
|
|
|
|
mod = (await loadConfigFromFile(
|
|
|
|
|
{} as any,
|
|
|
|
|
pathsFile,
|
|
|
|
|
undefined,
|
|
|
|
|
'silent'
|
|
|
|
|
)) as RouteModule
|
|
|
|
|
routeModuleCache.set(pathsFile, mod)
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.warn(
|
|
|
|
|
c.yellow(
|
|
|
|
|
`Invalid paths file export in ${pathsFile}. ` +
|
|
|
|
|
`Expects default export of an object with a "paths" property.`
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
} catch (e: any) {
|
|
|
|
|
logger.warn(`${c.yellow(`Failed to load ${pathsFile}:`)}\n${e.stack}`)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -210,7 +220,7 @@ export async function resolveDynamicRoutes(
|
|
|
|
|
|
|
|
|
|
const loader = mod!.config.paths
|
|
|
|
|
if (!loader) {
|
|
|
|
|
console.warn(
|
|
|
|
|
logger.warn(
|
|
|
|
|
c.yellow(
|
|
|
|
|
`Invalid paths file export in ${pathsFile}. ` +
|
|
|
|
|
`Missing "paths" property from default export.`
|
|
|
|
|