in modules/builders/src/static-generator/index.ts [36:105]
export async function execute(
options: PrerenderBuilderOptions,
context: BuilderContext,
): Promise<BuilderOutput> {
const browserTarget = targetFromTargetString(options.browserTarget);
const browserOptions = (await context.getTargetOptions(
browserTarget,
)) as unknown as BrowserBuilderOptions;
const routes = await getRoutes(options, browserOptions.tsConfig, context);
if (!routes.length) {
throw new Error(`Could not find any routes to generate.`);
}
const { result } = await context.scheduleTarget(browserTarget, {
watch: false,
serviceWorker: false,
});
const { success, error, outputPaths } = (await result) as BrowserBuilderOutput;
if (!success) {
return { success, error } as BuilderOutput;
}
const { styles: normalizedStylesOptimization } = normalizeOptimization(
browserOptions.optimization,
);
const worker = createWorker();
try {
for (const outputPath of outputPaths) {
const spinner = ora(`Prerendering ${routes.length} route(s) to ${outputPath}...`).start();
const staticServer = await createStaticServer(outputPath);
try {
await Promise.all(
routes.map((route) => {
const options: RenderOptions = {
inlineCriticalCss: normalizedStylesOptimization.inlineCritical,
outputPath,
route,
port: staticServer.port,
};
return worker.run(options, { name: 'render' });
}),
);
spinner.succeed(`Prerendering routes to ${outputPath} complete.`);
if (browserOptions.serviceWorker) {
const swResult = await generateServiceWorker(context, outputPath, browserOptions);
if (!swResult.success) {
return swResult;
}
}
} catch (error) {
spinner.fail(`Prerendering routes to ${outputPath} failed.`);
return { success: false, error: error.message };
} finally {
await staticServer.close();
}
}
return { success: true };
} finally {
void worker.destroy();
}
}