import 'dotenv/config'; import { ExecutorContext, parseTargetString, readTargetOptions, runExecutor, workspaceLayout, } from '@nrwl/devkit'; import exportApp from 'next/dist/export'; import { join, resolve } from 'path'; import { calculateProjectDependencies, DependentBuildableProjectNode, } from '@nrwl/js/src/utils/buildable-libs-utils'; import { prepareConfig } from '../../utils/config'; import { NextBuildBuilderOptions, NextExportBuilderOptions, } from '../../utils/types'; import { PHASE_EXPORT } from '../../utils/constants'; import nextTrace = require('next/dist/trace'); export default async function exportExecutor( options: NextExportBuilderOptions, context: ExecutorContext ) { let dependencies: DependentBuildableProjectNode[] = []; if (!options.buildLibsFromSource) { const result = calculateProjectDependencies( context.projectGraph, context.root, context.projectName, 'build', // this should be generalized context.configurationName ); dependencies = result.dependencies; } const libsDir = join(context.root, workspaceLayout().libsDir); const buildTarget = parseTargetString(options.buildTarget); const build = await runExecutor(buildTarget, {}, context); for await (const result of build) { if (!result.success) { return result; } } const buildOptions = readTargetOptions( buildTarget, context ); const root = resolve(context.root, buildOptions.root); const config = await prepareConfig( PHASE_EXPORT, buildOptions, context, dependencies, libsDir ); // Taken from: // https://github.com/vercel/next.js/blob/ead56eaab68409e96c19f7d9139747bac1197aa9/packages/next/cli/next-export.ts#L13 const nextExportCliSpan = nextTrace.trace('next-export-cli'); await exportApp( root, { statusMessage: 'Exporting', silent: options.silent, threads: options.threads, outdir: `${buildOptions.outputPath}/exported`, } as any, nextExportCliSpan, config ); return { success: true }; }