import mkdirpModule from 'mkdirp' import { promisify } from 'util' import { extname, join, dirname, sep } from 'path' import { cleanAmpPath } from 'next-server/dist/server/utils' import { renderToHTML } from 'next-server/dist/server/render' import { writeFile } from 'fs' import Sema from 'async-sema' import AmpHtmlValidator from 'amphtml-validator' import { loadComponents } from 'next-server/dist/server/load-components' const envConfig = require('next-server/config') const mkdirp = promisify(mkdirpModule) global.__NEXT_DATA__ = { nextExport: true } process.on( 'message', async ({ distDir, buildId, exportPaths, exportPathMap, outDir, renderOpts, serverRuntimeConfig, concurrency }) => { const sema = new Sema(concurrency, { capacity: exportPaths.length }) try { const work = async path => { await sema.acquire() const { page, query = {} } = exportPathMap[path] const ampOpts = { amphtml: query.amphtml, hasAmp: query.hasAmp, ampPath: query.ampPath } const ampOnly = query.ampOnly delete query.ampOnly delete query.hasAmp delete query.ampPath delete query.amphtml const req = { url: path } const res = {} envConfig.setConfig({ serverRuntimeConfig, publicRuntimeConfig: renderOpts.runtimeConfig }) if (ampOnly) { path = cleanAmpPath(path) ampOpts.ampPath = path + '.amp' } // replace /docs/index.amp with /docs.amp path = path.replace(/(? e.severity === 'ERROR') const warnings = result.errors.filter(e => e.severity !== 'ERROR') if (warnings.length || errors.length) { process.send({ type: 'amp-validation', payload: { page, result: { errors, warnings } } }) } } await new Promise((resolve, reject) => writeFile( htmlFilepath, html, 'utf8', err => (err ? reject(err) : resolve()) ) ) process.send({ type: 'progress' }) sema.release() } await Promise.all(exportPaths.map(work)) process.send({ type: 'done' }) } catch (err) { console.error(err) process.send({ type: 'error', payload: err }) } } )