,
])
}
const generateBodyHTML = async () => {
const setHeadComponents = components => {
headComponents = headComponents.concat(components)
}
const setHtmlAttributes = attributes => {
htmlAttributes = merge(htmlAttributes, attributes)
}
const setBodyAttributes = attributes => {
bodyAttributes = merge(bodyAttributes, attributes)
}
const setPreBodyComponents = components => {
preBodyComponents = preBodyComponents.concat(components)
}
const setPostBodyComponents = components => {
postBodyComponents = postBodyComponents.concat(components)
}
const setBodyProps = props => {
bodyProps = merge({}, bodyProps, props)
}
const getHeadComponents = () => headComponents
const replaceHeadComponents = components => {
headComponents = components
}
const replaceBodyHTMLString = body => {
bodyHtml = body
}
const getPreBodyComponents = () => preBodyComponents
const replacePreBodyComponents = components => {
preBodyComponents = components
}
const getPostBodyComponents = () => postBodyComponents
const replacePostBodyComponents = components => {
postBodyComponents = components
}
const getPageDataPath = path => {
const fixedPagePath = path === `/` ? `index` : path
return nodePath.join(`page-data`, fixedPagePath, `page-data.json`)
}
const getPageData = pagePath => {
const pageDataPath = getPageDataPath(pagePath)
const absolutePageDataPath = nodePath.join(publicDir, pageDataPath)
const pageDataJson = fs.readFileSync(absolutePageDataPath, `utf8`)
try {
return JSON.parse(pageDataJson)
} catch (err) {
return null
}
}
const pageData = getPageData(pagePath)
const { componentChunkName } = pageData
let scriptsAndStyles = flatten(
[`commons`].map(chunkKey => {
const fetchKey = `assetsByChunkName[${chunkKey}]`
const stats = getStats(publicDir)
let chunks = get(stats, fetchKey)
const namedChunkGroups = get(stats, `namedChunkGroups`)
if (!chunks) {
return null
}
chunks = chunks.map(chunk => {
if (chunk === `/`) {
return null
}
return { rel: `preload`, name: chunk }
})
namedChunkGroups[chunkKey].assets.forEach(asset =>
chunks.push({ rel: `preload`, name: asset.name })
)
const childAssets = namedChunkGroups[chunkKey].childAssets
for (const rel in childAssets) {
if (childAssets.hasownProperty(rel)) {
chunks = concat(
chunks,
childAssets[rel].map(chunk => {
return { rel, name: chunk }
})
)
}
}
return chunks
})
)
.filter(s => isObject(s))
.sort((s1, _s2) => (s1.rel == `preload` ? -1 : 1)) // given priority to preload
scriptsAndStyles = uniqBy(scriptsAndStyles, item => item.name)
const styles = scriptsAndStyles.filter(
style => style.name && style.name.endsWith(`.css`)
)
styles
.slice(0)
.reverse()
.forEach(style => {
headComponents.unshift(