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>
112 lines (106 loc) • 3.41 kB
text/typescript
import slash from 'slash'
import type { PagesData } from './PagesDataKeeper'
export async function renderPageList(pagesData: PagesData, isBuild: boolean) {
const addPagesData = Object.entries(pagesData).map(
([pageId, { staticData }]) => {
let subPath = pageId
if (subPath === '/') {
// import("/@react-pages/pages/") would make vite confused
// so we change the sub path
subPath = '/index__'
}
const dataModulePath = `/@react-pages/pages${subPath}`
let code = `
pages["${pageId}"] = {};
pages["${pageId}"].data = () => import("${dataModulePath}");
pages["${pageId}"].staticData = ${JSON.stringify(cleanStaticData(staticData))};`
return code
}
)
return `
const pages = {};
${addPagesData.join('\n')}
export default pages;
`
}
export async function renderPageListInSSR(pagesData: PagesData) {
const addPagesData = Object.entries(pagesData).map(
([pageId, { staticData }], index) => {
let subPath = pageId
if (subPath === '/') {
// import("/@react-pages/pages/") would make vite confused
// so we change the sub path
subPath = '/index__'
}
const code = `
pages["${pageId}"] = {};
import page${index} from "/@react-pages/pages${subPath}";
pages["${pageId}"] = page${index};`
return code
}
)
return `
const pages = {};
${addPagesData.join('\n')}
export default pages;
`
}
export function renderOnePageData(onePageData: { [dataKey: string]: string }) {
const importModule = Object.entries(onePageData).map(
([dataKey, path], idx) => `
import * as m${idx} from "${slash(path)}";
modules["${dataKey}"] = m${idx};`
)
return `
const modules = {};
${importModule.join('\n')}
export default modules;`
}
export function renderAllPagesOutlines(pagesData: PagesData) {
const res = [] as string[]
Object.entries(pagesData).map(([pageId, { staticData }], index1) => {
const outlinesForThisPage = [] as any[]
// check all data pieces (identified by key within a page) of all pages
Object.entries(staticData).forEach(([key, dataPiece], index2) => {
if (dataPiece?.sourceType === 'md' && dataPiece.__sourceFilePath) {
// collect outline info of markdown pages
const varName = `pageOutline_${index1}_${index2}`
outlinesForThisPage.push({
key,
varName,
importOutlineInfo: `import * as ${varName} from ${JSON.stringify(
dataPiece.__sourceFilePath + '?outlineInfo'
)}`,
})
}
})
if (outlinesForThisPage.length === 0) return
res.push(`allPagesOutlines["${pageId}"] = {};`)
outlinesForThisPage.forEach(({ key, varName, importOutlineInfo }) => {
res.push(importOutlineInfo)
res.push(`allPagesOutlines["${pageId}"]["${key}"] = ${varName};`)
})
})
return `
export const allPagesOutlines = {};
${res.join('\n')}
`
}
// filter out internal data field in staticData
// don't leak them into build output assets
function cleanStaticData(staticData: any) {
if (!staticData || typeof staticData !== 'object') return staticData
return Object.fromEntries(
Object.entries(staticData).map(([key, value]: [string, any]) => {
if (value?.__sourceFilePath)
return [
key,
{
...value,
__sourceFilePath: undefined,
},
]
return [key, value]
})
)
}