in packages/plugin-pha/src/manifestHelpers.ts [324:427]
export async function parseManifest(manifest: Manifest, options: ParseOptions): Promise<PHAManifest> {
const {
publicPath,
dataloaderConfig,
routeManifest,
} = options;
const { appWorker, tabBar, routes } = manifest;
if (appWorker?.url && !appWorker.url.startsWith('http')) {
appWorker.url = `${publicPath}${appWorker.url}`;
}
if (tabBar?.source && validateSource(tabBar.source, 'tabBar')) {
if (!tabBar.url) {
manifest.tabBar = {
...tabBar,
...(await getTabConfig(tabBar, false, options)),
};
}
// Remove tab_bar.source because pha manifest do not recognize it.
delete manifest.tabBar.source;
}
// items is `undefined` will crash in PHA and it is not supported to config list.
if (tabBar && !tabBar.items) {
tabBar.items = [];
}
if (routes && routes.length > 0) {
manifest.pages = await Promise.all(routes.map(async (page) => {
const pageIds = getRouteIdByPage(routeManifest, page);
const pageManifest = await getPageManifest(page, options);
// The manifest configuration is the default value for the page configuration.
pageDefaultValueKeys.forEach(key => {
if (!(key in pageManifest) && (key in manifest)) {
pageManifest[key] = manifest[key];
}
});
// Set static dataloader to data_prefetch of page.
pageIds.forEach((pageId) => {
if (typeof page === 'string' && dataloaderConfig && dataloaderConfig[pageId] && dataloaderConfig[pageId].loader) {
const staticDataLoaders = [];
const { loader } = dataloaderConfig[pageId];
if (Array.isArray(loader)) {
dataloaderConfig[pageId].loader.forEach(item => {
if (typeof item === 'object') {
staticDataLoaders.push(item);
}
});
} else if (typeof loader === 'object') {
// Single prefetch loader config.
staticDataLoaders.push(loader);
}
pageManifest.dataPrefetch = [...(pageManifest.dataPrefetch || []), ...staticDataLoaders];
}
});
if (pageManifest.frames && pageManifest.frames.length > 0) {
pageManifest.frames = await Promise.all(pageManifest.frames.map((frame) => getPageManifest(frame, options)));
// Set static dataloader to dataPrefetch of frames.
pageManifest.frames.forEach((frame: Frame) => {
if (typeof frame === 'string') return;
const title = frame.title || '';
const titleIds = getRouteIdByPage(routeManifest, title);
titleIds.forEach((titleId) => {
if (dataloaderConfig && dataloaderConfig[titleId] && dataloaderConfig[titleId].loader) {
const staticDataLoaders = [];
const { loader } = dataloaderConfig[titleId];
if (Array.isArray(loader)) {
loader.forEach(item => {
if (typeof item === 'object') {
staticDataLoaders.push(item);
}
});
} else if (typeof loader === 'object') {
// Single prefetch loader config.
staticDataLoaders.push(loader);
}
frame.dataPrefetch = [...(frame.dataPrefetch || []), ...staticDataLoaders];
}
});
});
}
if (pageManifest?.pageHeader?.source) {
if (!pageManifest.pageHeader.url) {
pageManifest.pageHeader = {
...pageManifest.pageHeader,
// Generate document logic is different from tabBar.
...(await getTabConfig(pageManifest.pageHeader, true, options)),
};
}
delete pageManifest.pageHeader.source;
}
return pageManifest;
}));
// Delete manifest routes after transform.
delete manifest.routes;
}
return transformManifestKeys(manifest, { isRoot: true });
}