vite-plugin-react-pages
Version:
<p> <a href="https://www.npmjs.com/package/vite-plugin-react-pages" target="_blank" rel="noopener"><img src="https://img.shields.io/npm/v/vite-plugin-react-pages.svg" alt="npm package" /></a> </p>
72 lines (63 loc) • 2.13 kB
text/typescript
import { PageStrategy } from '..'
import { extractStaticData, File } from '../../utils/virtual-module'
import type { FileHandler, FindPages } from '../types.doc'
export class DefaultPageStrategy extends PageStrategy {
constructor(
opts: { extraFindPages?: FindPages; fileHandler?: FileHandler } = {}
) {
const { extraFindPages, fileHandler = defaultFileHandler } = opts
// pass a wrapped findPages function to super class
super((pagesDir, helpersFromParent) => {
// we can create our own helpers, providing a default fileHandler
// and not using helpersFromParent
const helpers = this.createHelpers(fileHandler)
helpers.watchFiles(pagesDir, '**/*$.{md,mdx,js,jsx,ts,tsx}')
if (typeof extraFindPages === 'function') {
extraFindPages(pagesDir, helpers)
}
})
}
}
/**
* The defaultFileHandler return the result to caller,
* instead of directly setting the pageData object.
* so that it is more useful to users.
*/
export const defaultFileHandler: FileHandler = async (file: File, api) => {
const pagePublicPath = getPagePublicPath(file.relative)
const staticData = await extractStaticData(file)
if (staticData.sourceType === 'md') {
api.addPageData({
pageId: pagePublicPath,
key: 'outlineInfo',
dataPath: `${file.path}?outlineInfo`,
})
}
return {
pageId: pagePublicPath,
dataPath: file.path,
staticData,
}
}
/**
* turn `sub-path/page2/index.tsx` into `/sub-path/page2`
*/
export function getPagePublicPath(relativePageFilePath: string) {
let pagePublicPath = relativePageFilePath.replace(
/\$\.(md|mdx|js|jsx|ts|tsx)$/,
''
)
pagePublicPath = pagePublicPath.replace(/index$/, '')
// remove trailing slash
pagePublicPath = pagePublicPath.replace(/\/$/, '')
// ensure starting slash
pagePublicPath = pagePublicPath.replace(/^\//, '')
pagePublicPath = `/${pagePublicPath}`
// turn [id] into :id
// so that react-router can recognize it as url params
pagePublicPath = pagePublicPath.replace(
/\[(.*?)\]/g,
(_, paramName) => `:${paramName}`
)
return pagePublicPath
}