({ outputDir }: { outputDir: string })
| 87 | } |
| 88 | |
| 89 | async function prerenderPages({ outputDir }: { outputDir: string }) { |
| 90 | const seen = new Set<string>() |
| 91 | const prerendered = new Set<string>() |
| 92 | const retriesByPath = new Map<string, number>() |
| 93 | const concurrency = startConfig.prerender?.concurrency ?? os.cpus().length |
| 94 | logger.info(`Concurrency: ${concurrency}`) |
| 95 | const queue = new Queue({ concurrency }) |
| 96 | |
| 97 | startConfig.pages = validateAndNormalizePrerenderPages( |
| 98 | startConfig.pages, |
| 99 | routerBaseUrl, |
| 100 | ) |
| 101 | |
| 102 | startConfig.pages.forEach((page) => addCrawlPageTask(page)) |
| 103 | |
| 104 | if (queue.isSettled()) { |
| 105 | logger.info('No pages matched prerender filter; skipping.') |
| 106 | return Array.from(prerendered) |
| 107 | } |
| 108 | |
| 109 | await queue.start() |
| 110 | |
| 111 | return Array.from(prerendered) |
| 112 | |
| 113 | function addCrawlPageTask(page: Page) { |
| 114 | if (seen.has(page.path)) return |
| 115 | |
| 116 | seen.add(page.path) |
| 117 | |
| 118 | if (page.fromCrawl) { |
| 119 | startConfig.pages.push(page) |
| 120 | } |
| 121 | |
| 122 | if (!(page.prerender?.enabled ?? true)) return |
| 123 | |
| 124 | if ( |
| 125 | startConfig.prerender?.filter && |
| 126 | !startConfig.prerender.filter(page) |
| 127 | ) { |
| 128 | return |
| 129 | } |
| 130 | |
| 131 | const prerenderOptions = { |
| 132 | ...startConfig.prerender, |
| 133 | ...page.prerender, |
| 134 | } |
| 135 | |
| 136 | queue.add(async () => { |
| 137 | logger.info(`Crawling: ${page.path}`) |
| 138 | const retries = retriesByPath.get(page.path) || 0 |
| 139 | |
| 140 | try { |
| 141 | const res = await requestWithRedirects( |
| 142 | withTrailingSlash(withBase(page.path, routerBasePath)), |
| 143 | { |
| 144 | headers: { |
| 145 | ...(prerenderOptions.headers ?? {}), |
| 146 | }, |
no test coverage detected