123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = build;
- var _env = require("@next/env");
- var _chalk = _interopRequireDefault(require("next/dist/compiled/chalk"));
- var _crypto = _interopRequireDefault(require("crypto"));
- var _micromatch = require("next/dist/compiled/micromatch");
- var _fs = require("fs");
- var _jestWorker = require("next/dist/compiled/jest-worker");
- var _worker = require("../lib/worker");
- var _devalue = _interopRequireDefault(require("next/dist/compiled/devalue"));
- var _escapeRegexp = require("../shared/lib/escape-regexp");
- var _findUp = _interopRequireDefault(require("next/dist/compiled/find-up"));
- var _indexCjs = require("next/dist/compiled/nanoid/index.cjs");
- var _pathToRegexp = require("next/dist/compiled/path-to-regexp");
- var _path = _interopRequireWildcard(require("path"));
- var _formatWebpackMessages = _interopRequireDefault(require("../client/dev/error-overlay/format-webpack-messages"));
- var _constants = require("../lib/constants");
- var _fileExists = require("../lib/file-exists");
- var _findPagesDir = require("../lib/find-pages-dir");
- var _loadCustomRoutes = _interopRequireWildcard(require("../lib/load-custom-routes"));
- var _redirectStatus = require("../lib/redirect-status");
- var _nonNullable = require("../lib/non-nullable");
- var _recursiveDelete = require("../lib/recursive-delete");
- var _verifyAndLint = require("../lib/verifyAndLint");
- var _verifyPartytownSetup = require("../lib/verify-partytown-setup");
- var _constants1 = require("../shared/lib/constants");
- var _utils = require("../shared/lib/router/utils");
- var _config = _interopRequireDefault(require("../server/config"));
- var _utils1 = require("../server/utils");
- var _normalizePagePath = require("../shared/lib/page-path/normalize-page-path");
- var _require = require("../server/require");
- var ciEnvironment = _interopRequireWildcard(require("../telemetry/ci-info"));
- var _events = require("../telemetry/events");
- var _storage = require("../telemetry/storage");
- var _compiler = require("./compiler");
- var _getPageStaticInfo = require("./analysis/get-page-static-info");
- var _entries = require("./entries");
- var _generateBuildId = require("./generate-build-id");
- var _isWriteable = require("./is-writeable");
- var Log = _interopRequireWildcard(require("./output/log"));
- var _spinner = _interopRequireDefault(require("./spinner"));
- var _trace = require("../trace");
- var _utils2 = require("./utils");
- var _webpackConfig = _interopRequireDefault(require("./webpack-config"));
- var _writeBuildId = require("./write-build-id");
- var _normalizeLocalePath = require("../shared/lib/i18n/normalize-locale-path");
- var _isError = _interopRequireDefault(require("../lib/is-error"));
- var _telemetryPlugin = require("./webpack/plugins/telemetry-plugin");
- var _recursiveCopy = require("../lib/recursive-copy");
- var _recursiveReaddir = require("../lib/recursive-readdir");
- var _swc = require("./swc");
- var _flightClientEntryPlugin = require("./webpack/plugins/flight-client-entry-plugin");
- var _routeRegex = require("../shared/lib/router/utils/route-regex");
- var _flatReaddir = require("../lib/flat-readdir");
- var _swcPlugins = require("../telemetry/events/swc-plugins");
- var _appPaths = require("../shared/lib/router/utils/app-paths");
- async function build(dir, conf = null, reactProductionProfiling = false, debugOutput = false, runLint = true) {
- try {
- const nextBuildSpan = (0, _trace).trace("next-build", undefined, {
- version: "12.3.4"
- });
- const buildResult = await nextBuildSpan.traceAsyncFn(async ()=>{
- var ref7, ref1;
- // attempt to load global env values so they are available in next.config.js
- const { loadedEnvFiles } = nextBuildSpan.traceChild("load-dotenv").traceFn(()=>(0, _env).loadEnvConfig(dir, false, Log));
- const config = await nextBuildSpan.traceChild("load-next-config").traceAsyncFn(()=>(0, _config).default(_constants1.PHASE_PRODUCTION_BUILD, dir, conf));
- const distDir = _path.default.join(dir, config.distDir);
- (0, _trace).setGlobal("phase", _constants1.PHASE_PRODUCTION_BUILD);
- (0, _trace).setGlobal("distDir", distDir);
- // We enable concurrent features (Fizz-related rendering architecture) when
- // using React 18 or experimental.
- const hasReactRoot = !!process.env.__NEXT_REACT_ROOT;
- const hasServerComponents = hasReactRoot && !!config.experimental.serverComponents;
- const { target } = config;
- const buildId = await nextBuildSpan.traceChild("generate-buildid").traceAsyncFn(()=>(0, _generateBuildId).generateBuildId(config.generateBuildId, _indexCjs.nanoid));
- const customRoutes = await nextBuildSpan.traceChild("load-custom-routes").traceAsyncFn(()=>(0, _loadCustomRoutes).default(config));
- const { headers , rewrites , redirects } = customRoutes;
- const cacheDir = _path.default.join(distDir, "cache");
- if (ciEnvironment.isCI && !ciEnvironment.hasNextSupport) {
- const hasCache = await (0, _fileExists).fileExists(cacheDir);
- if (!hasCache) {
- // Intentionally not piping to stderr in case people fail in CI when
- // stderr is detected.
- console.log(`${Log.prefixes.warn} No build cache found. Please configure build caching for faster rebuilds. Read more: https://nextjs.org/docs/messages/no-cache`);
- }
- }
- const telemetry = new _storage.Telemetry({
- distDir
- });
- (0, _trace).setGlobal("telemetry", telemetry);
- const publicDir = _path.default.join(dir, "public");
- const { pages: pagesDir , appDir } = (0, _findPagesDir).findPagesDir(dir, config.experimental.appDir);
- const hasPublicDir = await (0, _fileExists).fileExists(publicDir);
- telemetry.record((0, _events).eventCliSession(dir, config, {
- webpackVersion: 5,
- cliCommand: "build",
- isSrcDir: !!pagesDir && _path.default.relative(dir, pagesDir).startsWith("src") || !!appDir && _path.default.relative(dir, appDir).startsWith("src"),
- hasNowJson: !!await (0, _findUp).default("now.json", {
- cwd: dir
- }),
- isCustomServer: null
- }));
- (0, _events).eventNextPlugins(_path.default.resolve(dir)).then((events)=>telemetry.record(events));
- (0, _swcPlugins).eventSwcPlugins(_path.default.resolve(dir), config).then((events)=>telemetry.record(events));
- const ignoreTypeScriptErrors = Boolean(config.typescript.ignoreBuildErrors);
- const ignoreESLint = Boolean(config.eslint.ignoreDuringBuilds);
- const eslintCacheDir = _path.default.join(cacheDir, "eslint/");
- const shouldLint = !ignoreESLint && runLint;
- if (ignoreTypeScriptErrors) {
- Log.info("Skipping validation of types");
- }
- if (runLint && ignoreESLint) {
- // only print log when build requre lint while ignoreESLint is enabled
- Log.info("Skipping linting");
- }
- let typeCheckingAndLintingSpinnerPrefixText;
- let typeCheckingAndLintingSpinner;
- if (!ignoreTypeScriptErrors && shouldLint) {
- typeCheckingAndLintingSpinnerPrefixText = "Linting and checking validity of types";
- } else if (!ignoreTypeScriptErrors) {
- typeCheckingAndLintingSpinnerPrefixText = "Checking validity of types";
- } else if (shouldLint) {
- typeCheckingAndLintingSpinnerPrefixText = "Linting";
- }
- // we will not create a spinner if both ignoreTypeScriptErrors and ignoreESLint are
- // enabled, but we will still verifying project's tsconfig and dependencies.
- if (typeCheckingAndLintingSpinnerPrefixText) {
- typeCheckingAndLintingSpinner = (0, _spinner).default({
- prefixText: `${Log.prefixes.info} ${typeCheckingAndLintingSpinnerPrefixText}`
- });
- }
- const typeCheckStart = process.hrtime();
- try {
- const [[verifyResult, typeCheckEnd]] = await Promise.all([
- nextBuildSpan.traceChild("verify-typescript-setup").traceAsyncFn(()=>verifyTypeScriptSetup(dir, [
- pagesDir,
- appDir
- ].filter(Boolean), !ignoreTypeScriptErrors, config.typescript.tsconfigPath, config.images.disableStaticImages, cacheDir, config.experimental.cpus, config.experimental.workerThreads).then((resolved)=>{
- const checkEnd = process.hrtime(typeCheckStart);
- return [
- resolved,
- checkEnd
- ];
- })),
- shouldLint && nextBuildSpan.traceChild("verify-and-lint").traceAsyncFn(async ()=>{
- var ref;
- await (0, _verifyAndLint).verifyAndLint(dir, eslintCacheDir, (ref = config.eslint) == null ? void 0 : ref.dirs, config.experimental.cpus, config.experimental.workerThreads, telemetry, !!config.experimental.appDir);
- }),
- ]);
- typeCheckingAndLintingSpinner == null ? void 0 : typeCheckingAndLintingSpinner.stopAndPersist();
- if (!ignoreTypeScriptErrors && verifyResult) {
- var ref2, ref3, ref4;
- telemetry.record((0, _events).eventTypeCheckCompleted({
- durationInSeconds: typeCheckEnd[0],
- typescriptVersion: verifyResult.version,
- inputFilesCount: (ref2 = verifyResult.result) == null ? void 0 : ref2.inputFilesCount,
- totalFilesCount: (ref3 = verifyResult.result) == null ? void 0 : ref3.totalFilesCount,
- incremental: (ref4 = verifyResult.result) == null ? void 0 : ref4.incremental
- }));
- }
- } catch (err1) {
- // prevent showing jest-worker internal error as it
- // isn't helpful for users and clutters output
- if ((0, _isError).default(err1) && err1.message === "Call retries were exceeded") {
- process.exit(1);
- }
- throw err1;
- }
- const buildLintEvent = {
- featureName: "build-lint",
- invocationCount: shouldLint ? 1 : 0
- };
- telemetry.record({
- eventName: _events.EVENT_BUILD_FEATURE_USAGE,
- payload: buildLintEvent
- });
- const buildSpinner = (0, _spinner).default({
- prefixText: `${Log.prefixes.info} Creating an optimized production build`
- });
- const isLikeServerless = (0, _utils1).isTargetLikeServerless(target);
- const pagesPaths = pagesDir ? await nextBuildSpan.traceChild("collect-pages").traceAsyncFn(()=>(0, _recursiveReaddir).recursiveReadDir(pagesDir, new RegExp(`\\.(?:${config.pageExtensions.join("|")})$`))) : [];
- let appPaths;
- if (appDir) {
- appPaths = await nextBuildSpan.traceChild("collect-app-paths").traceAsyncFn(()=>(0, _recursiveReaddir).recursiveReadDir(appDir, new RegExp(`page\\.(?:${config.pageExtensions.join("|")})$`)));
- }
- const middlewareDetectionRegExp = new RegExp(`^${_constants.MIDDLEWARE_FILENAME}\\.(?:${config.pageExtensions.join("|")})$`);
- const rootPaths = pagesDir ? (await (0, _flatReaddir).flatReaddir((0, _path).join(pagesDir, ".."), middlewareDetectionRegExp)).map((absoluteFile)=>absoluteFile.replace(dir, "")) : [];
- // needed for static exporting since we want to replace with HTML
- // files
- const allStaticPages = new Set();
- let allPageInfos = new Map();
- const previewProps = {
- previewModeId: _crypto.default.randomBytes(16).toString("hex"),
- previewModeSigningKey: _crypto.default.randomBytes(32).toString("hex"),
- previewModeEncryptionKey: _crypto.default.randomBytes(32).toString("hex")
- };
- const mappedPages = nextBuildSpan.traceChild("create-pages-mapping").traceFn(()=>(0, _entries).createPagesMapping({
- isDev: false,
- pageExtensions: config.pageExtensions,
- pagesType: "pages",
- pagePaths: pagesPaths,
- pagesDir
- }));
- let mappedAppPages;
- if (appPaths && appDir) {
- mappedAppPages = nextBuildSpan.traceChild("create-app-mapping").traceFn(()=>(0, _entries).createPagesMapping({
- pagePaths: appPaths,
- isDev: false,
- pagesType: "app",
- pageExtensions: config.pageExtensions,
- pagesDir: pagesDir
- }));
- }
- let mappedRootPaths = {};
- if (rootPaths.length > 0) {
- mappedRootPaths = (0, _entries).createPagesMapping({
- isDev: false,
- pageExtensions: config.pageExtensions,
- pagePaths: rootPaths,
- pagesType: "root",
- pagesDir: pagesDir
- });
- }
- const entrypoints = await nextBuildSpan.traceChild("create-entrypoints").traceAsyncFn(()=>(0, _entries).createEntrypoints({
- buildId,
- config,
- envFiles: loadedEnvFiles,
- isDev: false,
- pages: mappedPages,
- pagesDir,
- previewMode: previewProps,
- target,
- rootDir: dir,
- rootPaths: mappedRootPaths,
- appDir,
- appPaths: mappedAppPages,
- pageExtensions: config.pageExtensions
- }));
- const pageKeys = {
- pages: Object.keys(mappedPages),
- app: mappedAppPages ? Object.keys(mappedAppPages).map((key)=>(0, _appPaths).normalizeAppPath(key) || "/") : undefined
- };
- const conflictingPublicFiles = [];
- const hasPages404 = (ref7 = mappedPages["/404"]) == null ? void 0 : ref7.startsWith(_constants.PAGES_DIR_ALIAS);
- const hasCustomErrorPage = mappedPages["/_error"].startsWith(_constants.PAGES_DIR_ALIAS);
- if (hasPublicDir) {
- const hasPublicUnderScoreNextDir = await (0, _fileExists).fileExists(_path.default.join(publicDir, "_next"));
- if (hasPublicUnderScoreNextDir) {
- throw new Error(_constants.PUBLIC_DIR_MIDDLEWARE_CONFLICT);
- }
- }
- await nextBuildSpan.traceChild("public-dir-conflict-check").traceAsyncFn(async ()=>{
- // Check if pages conflict with files in `public`
- // Only a page of public file can be served, not both.
- for(const page in mappedPages){
- const hasPublicPageFile = await (0, _fileExists).fileExists(_path.default.join(publicDir, page === "/" ? "/index" : page), "file");
- if (hasPublicPageFile) {
- conflictingPublicFiles.push(page);
- }
- }
- const numConflicting = conflictingPublicFiles.length;
- if (numConflicting) {
- throw new Error(`Conflicting public and page file${numConflicting === 1 ? " was" : "s were"} found. https://nextjs.org/docs/messages/conflicting-public-file-page\n${conflictingPublicFiles.join("\n")}`);
- }
- });
- const nestedReservedPages = pageKeys.pages.filter((page)=>{
- return page.match(/\/(_app|_document|_error)$/) && _path.default.dirname(page) !== "/";
- });
- if (nestedReservedPages.length) {
- Log.warn(`The following reserved Next.js pages were detected not directly under the pages directory:\n` + nestedReservedPages.join("\n") + `\nSee more info here: https://nextjs.org/docs/messages/nested-reserved-page\n`);
- }
- const restrictedRedirectPaths = [
- "/_next"
- ].map((p)=>config.basePath ? `${config.basePath}${p}` : p);
- const buildCustomRoute = (r, type)=>{
- const keys = [];
- const routeRegex = (0, _pathToRegexp).pathToRegexp(r.source, keys, {
- strict: true,
- sensitive: false,
- delimiter: "/"
- });
- let regexSource = routeRegex.source;
- if (!r.internal) {
- regexSource = (0, _redirectStatus).modifyRouteRegex(routeRegex.source, type === "redirect" ? restrictedRedirectPaths : undefined);
- }
- return {
- ...r,
- ...type === "redirect" ? {
- statusCode: (0, _redirectStatus).getRedirectStatus(r),
- permanent: undefined
- } : {},
- regex: (0, _loadCustomRoutes).normalizeRouteRegex(regexSource)
- };
- };
- const routesManifestPath = _path.default.join(distDir, _constants1.ROUTES_MANIFEST);
- const routesManifest = nextBuildSpan.traceChild("generate-routes-manifest").traceFn(()=>{
- var _app;
- const sortedRoutes = (0, _utils).getSortedRoutes([
- ...pageKeys.pages,
- ...(_app = pageKeys.app) != null ? _app : [],
- ]);
- const dynamicRoutes = [];
- const staticRoutes = [];
- for (const route of sortedRoutes){
- if ((0, _utils).isDynamicRoute(route)) {
- dynamicRoutes.push(pageToRoute(route));
- } else if (!(0, _utils2).isReservedPage(route)) {
- staticRoutes.push(pageToRoute(route));
- }
- }
- return {
- version: 3,
- pages404: true,
- basePath: config.basePath,
- redirects: redirects.map((r)=>buildCustomRoute(r, "redirect")),
- headers: headers.map((r)=>buildCustomRoute(r, "header")),
- dynamicRoutes,
- staticRoutes,
- dataRoutes: [],
- i18n: config.i18n || undefined,
- skipMiddlewareUrlNormalize: config.experimental.skipMiddlewareUrlNormalize
- };
- });
- if (rewrites.beforeFiles.length === 0 && rewrites.fallback.length === 0) {
- routesManifest.rewrites = rewrites.afterFiles.map((r)=>buildCustomRoute(r, "rewrite"));
- } else {
- routesManifest.rewrites = {
- beforeFiles: rewrites.beforeFiles.map((r)=>buildCustomRoute(r, "rewrite")),
- afterFiles: rewrites.afterFiles.map((r)=>buildCustomRoute(r, "rewrite")),
- fallback: rewrites.fallback.map((r)=>buildCustomRoute(r, "rewrite"))
- };
- }
- const combinedRewrites = [
- ...rewrites.beforeFiles,
- ...rewrites.afterFiles,
- ...rewrites.fallback,
- ];
- const distDirCreated = await nextBuildSpan.traceChild("create-dist-dir").traceAsyncFn(async ()=>{
- try {
- await _fs.promises.mkdir(distDir, {
- recursive: true
- });
- return true;
- } catch (err) {
- if ((0, _isError).default(err) && err.code === "EPERM") {
- return false;
- }
- throw err;
- }
- });
- if (!distDirCreated || !await (0, _isWriteable).isWriteable(distDir)) {
- throw new Error("> Build directory is not writeable. https://nextjs.org/docs/messages/build-dir-not-writeable");
- }
- if (config.cleanDistDir) {
- await (0, _recursiveDelete).recursiveDelete(distDir, /^cache/);
- }
- // Ensure commonjs handling is used for files in the distDir (generally .next)
- // Files outside of the distDir can be "type": "module"
- await _fs.promises.writeFile(_path.default.join(distDir, "package.json"), '{"type": "commonjs"}');
- // We need to write the manifest with rewrites before build
- // so serverless can import the manifest
- await nextBuildSpan.traceChild("write-routes-manifest").traceAsyncFn(()=>_fs.promises.writeFile(routesManifestPath, JSON.stringify(routesManifest), "utf8"));
- const serverDir = isLikeServerless ? _constants1.SERVERLESS_DIRECTORY : _constants1.SERVER_DIRECTORY;
- const manifestPath = _path.default.join(distDir, serverDir, _constants1.PAGES_MANIFEST);
- const requiredServerFiles = nextBuildSpan.traceChild("generate-required-server-files").traceFn(()=>({
- version: 1,
- config: {
- ...config,
- configFile: undefined,
- experimental: {
- ...config.experimental,
- trustHostHeader: ciEnvironment.hasNextSupport
- }
- },
- appDir: dir,
- files: [
- _constants1.ROUTES_MANIFEST,
- _path.default.relative(distDir, manifestPath),
- _constants1.BUILD_MANIFEST,
- _constants1.PRERENDER_MANIFEST,
- _path.default.join(_constants1.SERVER_DIRECTORY, _constants1.MIDDLEWARE_MANIFEST),
- ...hasServerComponents ? [
- _path.default.join(_constants1.SERVER_DIRECTORY, _constants1.FLIGHT_MANIFEST + ".js"),
- _path.default.join(_constants1.SERVER_DIRECTORY, _constants1.FLIGHT_MANIFEST + ".json"),
- _path.default.join(_constants1.SERVER_DIRECTORY, _constants1.FLIGHT_SERVER_CSS_MANIFEST + ".js"),
- _path.default.join(_constants1.SERVER_DIRECTORY, _constants1.FLIGHT_SERVER_CSS_MANIFEST + ".json"),
- ] : [],
- _constants1.REACT_LOADABLE_MANIFEST,
- config.optimizeFonts ? _path.default.join(serverDir, _constants1.FONT_MANIFEST) : null,
- _constants1.BUILD_ID_FILE,
- appDir ? _path.default.join(serverDir, _constants1.APP_PATHS_MANIFEST) : null,
- ].filter(_nonNullable.nonNullable).map((file)=>_path.default.join(config.distDir, file)),
- ignore: []
- }));
- let result = {
- warnings: [],
- errors: [],
- stats: []
- };
- let webpackBuildStart;
- let telemetryPlugin;
- await (async ()=>{
- var ref;
- // IIFE to isolate locals and avoid retaining memory too long
- const runWebpackSpan = nextBuildSpan.traceChild("run-webpack-compiler");
- const commonWebpackOptions = {
- buildId,
- config,
- hasReactRoot,
- pagesDir,
- reactProductionProfiling,
- rewrites,
- runWebpackSpan,
- target,
- appDir,
- middlewareMatchers: entrypoints.middlewareMatchers
- };
- const configs = await runWebpackSpan.traceChild("generate-webpack-config").traceAsyncFn(()=>Promise.all([
- (0, _webpackConfig).default(dir, {
- ...commonWebpackOptions,
- compilerType: _constants1.COMPILER_NAMES.client,
- entrypoints: entrypoints.client
- }),
- (0, _webpackConfig).default(dir, {
- ...commonWebpackOptions,
- compilerType: _constants1.COMPILER_NAMES.server,
- entrypoints: entrypoints.server
- }),
- (0, _webpackConfig).default(dir, {
- ...commonWebpackOptions,
- compilerType: _constants1.COMPILER_NAMES.edgeServer,
- entrypoints: entrypoints.edgeServer
- }),
- ]));
- const clientConfig = configs[0];
- if (clientConfig.optimization && (clientConfig.optimization.minimize !== true || clientConfig.optimization.minimizer && clientConfig.optimization.minimizer.length === 0)) {
- Log.warn(`Production code optimization has been disabled in your project. Read more: https://nextjs.org/docs/messages/minification-disabled`);
- }
- webpackBuildStart = process.hrtime();
- // We run client and server compilation separately to optimize for memory usage
- await runWebpackSpan.traceAsyncFn(async ()=>{
- // If we are under the serverless build, we will have to run the client
- // compiler first because the server compiler depends on the manifest
- // files that are created by the client compiler.
- // Otherwise, we run the server compilers first and then the client
- // compiler to track the boundary of server/client components.
- let clientResult = null;
- let serverResult = null;
- let edgeServerResult = null;
- if (isLikeServerless) {
- if (config.experimental.serverComponents) {
- throw new Error("Server Components are not supported in serverless mode.");
- }
- // Build client first
- clientResult = await (0, _compiler).runCompiler(clientConfig, {
- runWebpackSpan
- });
- // Only continue if there were no errors
- if (!clientResult.errors.length) {
- serverResult = await (0, _compiler).runCompiler(configs[1], {
- runWebpackSpan
- });
- edgeServerResult = configs[2] ? await (0, _compiler).runCompiler(configs[2], {
- runWebpackSpan
- }) : null;
- }
- } else {
- // During the server compilations, entries of client components will be
- // injected to this set and then will be consumed by the client compiler.
- _flightClientEntryPlugin.injectedClientEntries.clear();
- serverResult = await (0, _compiler).runCompiler(configs[1], {
- runWebpackSpan
- });
- edgeServerResult = configs[2] ? await (0, _compiler).runCompiler(configs[2], {
- runWebpackSpan
- }) : null;
- // Only continue if there were no errors
- if (!serverResult.errors.length && !(edgeServerResult == null ? void 0 : edgeServerResult.errors.length)) {
- _flightClientEntryPlugin.injectedClientEntries.forEach((value, key)=>{
- clientConfig.entry[key] = value;
- });
- clientResult = await (0, _compiler).runCompiler(clientConfig, {
- runWebpackSpan
- });
- }
- }
- result = {
- warnings: [].concat(clientResult == null ? void 0 : clientResult.warnings, serverResult == null ? void 0 : serverResult.warnings, edgeServerResult == null ? void 0 : edgeServerResult.warnings).filter(_nonNullable.nonNullable),
- errors: [].concat(clientResult == null ? void 0 : clientResult.errors, serverResult == null ? void 0 : serverResult.errors, edgeServerResult == null ? void 0 : edgeServerResult.errors).filter(_nonNullable.nonNullable),
- stats: [
- clientResult == null ? void 0 : clientResult.stats,
- serverResult == null ? void 0 : serverResult.stats,
- edgeServerResult == null ? void 0 : edgeServerResult.stats,
- ]
- };
- });
- result = nextBuildSpan.traceChild("format-webpack-messages").traceFn(()=>(0, _formatWebpackMessages).default(result, true));
- telemetryPlugin = (ref = clientConfig.plugins) == null ? void 0 : ref.find(isTelemetryPlugin);
- })();
- const webpackBuildEnd = process.hrtime(webpackBuildStart);
- if (buildSpinner) {
- buildSpinner.stopAndPersist();
- }
- if (result.errors.length > 0) {
- // Only keep the first few errors. Others are often indicative
- // of the same problem, but confuse the reader with noise.
- if (result.errors.length > 5) {
- result.errors.length = 5;
- }
- let error = result.errors.filter(Boolean).join("\n\n");
- console.error(_chalk.default.red("Failed to compile.\n"));
- if (error.indexOf("private-next-pages") > -1 && error.indexOf("does not contain a default export") > -1) {
- const page_name_regex = /'private-next-pages\/(?<page_name>[^']*)'/;
- const parsed = page_name_regex.exec(error);
- const page_name = parsed && parsed.groups && parsed.groups.page_name;
- throw new Error(`webpack build failed: found page without a React Component as default export in pages/${page_name}\n\nSee https://nextjs.org/docs/messages/page-without-valid-component for more info.`);
- }
- console.error(error);
- console.error();
- if (error.indexOf("private-next-pages") > -1 || error.indexOf("__next_polyfill__") > -1) {
- const err = new Error("webpack config.resolve.alias was incorrectly overridden. https://nextjs.org/docs/messages/invalid-resolve-alias");
- err.code = "INVALID_RESOLVE_ALIAS";
- throw err;
- }
- const err = new Error("Build failed because of webpack errors");
- err.code = "WEBPACK_ERRORS";
- throw err;
- } else {
- telemetry.record((0, _events).eventBuildCompleted(pagesPaths, {
- durationInSeconds: webpackBuildEnd[0]
- }));
- if (result.warnings.length > 0) {
- Log.warn("Compiled with warnings\n");
- console.warn(result.warnings.filter(Boolean).join("\n\n"));
- console.warn();
- } else {
- Log.info("Compiled successfully");
- }
- }
- const postCompileSpinner = (0, _spinner).default({
- prefixText: `${Log.prefixes.info} Collecting page data`
- });
- const buildManifestPath = _path.default.join(distDir, _constants1.BUILD_MANIFEST);
- const appBuildManifestPath = _path.default.join(distDir, _constants1.APP_BUILD_MANIFEST);
- const ssgPages = new Set();
- const ssgStaticFallbackPages = new Set();
- const ssgBlockingFallbackPages = new Set();
- const staticPages = new Set();
- const invalidPages = new Set();
- const hybridAmpPages = new Set();
- const serverPropsPages = new Set();
- const additionalSsgPaths = new Map();
- const additionalSsgPathsEncoded = new Map();
- const appStaticPaths = new Map();
- const appStaticPathsEncoded = new Map();
- const appNormalizedPaths = new Map();
- const appDynamicParamPaths = new Set();
- const appDefaultConfigs = new Map();
- const pageTraceIncludes = new Map();
- const pageTraceExcludes = new Map();
- const pageInfos = new Map();
- const pagesManifest = JSON.parse(await _fs.promises.readFile(manifestPath, "utf8"));
- const buildManifest = JSON.parse(await _fs.promises.readFile(buildManifestPath, "utf8"));
- const appBuildManifest = appDir ? JSON.parse(await _fs.promises.readFile(appBuildManifestPath, "utf8")) : undefined;
- const timeout = config.staticPageGenerationTimeout || 0;
- const sharedPool = config.experimental.sharedPool || false;
- const staticWorker = sharedPool ? require.resolve("./worker") : require.resolve("./utils");
- let infoPrinted = false;
- let appPathsManifest = {};
- const appPathRoutes = {};
- if (appDir) {
- appPathsManifest = JSON.parse(await _fs.promises.readFile(_path.default.join(distDir, serverDir, _constants1.APP_PATHS_MANIFEST), "utf8"));
- Object.keys(appPathsManifest).forEach((entry)=>{
- appPathRoutes[entry] = (0, _appPaths).normalizeAppPath(entry) || "/";
- });
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.APP_PATH_ROUTES_MANIFEST), JSON.stringify(appPathRoutes, null, 2));
- }
- process.env.NEXT_PHASE = _constants1.PHASE_PRODUCTION_BUILD;
- const staticWorkers = new _worker.Worker(staticWorker, {
- timeout: timeout * 1000,
- onRestart: (method, [arg], attempts)=>{
- if (method === "exportPage") {
- const { path: pagePath } = arg;
- if (attempts >= 3) {
- throw new Error(`Static page generation for ${pagePath} is still timing out after 3 attempts. See more info here https://nextjs.org/docs/messages/static-page-generation-timeout`);
- }
- Log.warn(`Restarted static page generation for ${pagePath} because it took more than ${timeout} seconds`);
- } else {
- const pagePath = arg;
- if (attempts >= 2) {
- throw new Error(`Collecting page data for ${pagePath} is still timing out after 2 attempts. See more info here https://nextjs.org/docs/messages/page-data-collection-timeout`);
- }
- Log.warn(`Restarted collecting page data for ${pagePath} because it took more than ${timeout} seconds`);
- }
- if (!infoPrinted) {
- Log.warn("See more info here https://nextjs.org/docs/messages/static-page-generation-timeout");
- infoPrinted = true;
- }
- },
- numWorkers: config.experimental.cpus,
- enableWorkerThreads: config.experimental.workerThreads,
- exposedMethods: sharedPool ? [
- "hasCustomGetInitialProps",
- "isPageStatic",
- "getNamedExports",
- "exportPage",
- ] : [
- "hasCustomGetInitialProps",
- "isPageStatic",
- "getNamedExports"
- ]
- });
- const analysisBegin = process.hrtime();
- const staticCheckSpan = nextBuildSpan.traceChild("static-check");
- const { customAppGetInitialProps , namedExports , isNextImageImported: isNextImageImported1 , hasSsrAmpPages: hasSsrAmpPages1 , hasNonStaticErrorPage , } = await staticCheckSpan.traceAsyncFn(async ()=>{
- const { configFileName , publicRuntimeConfig , serverRuntimeConfig } = config;
- const runtimeEnvConfig = {
- publicRuntimeConfig,
- serverRuntimeConfig
- };
- const nonStaticErrorPageSpan = staticCheckSpan.traceChild("check-static-error-page");
- const errorPageHasCustomGetInitialProps = nonStaticErrorPageSpan.traceAsyncFn(async ()=>hasCustomErrorPage && await staticWorkers.hasCustomGetInitialProps("/_error", distDir, isLikeServerless, runtimeEnvConfig, false));
- const errorPageStaticResult = nonStaticErrorPageSpan.traceAsyncFn(async ()=>{
- var ref, ref8;
- return hasCustomErrorPage && staticWorkers.isPageStatic({
- page: "/_error",
- distDir,
- serverless: isLikeServerless,
- configFileName,
- runtimeEnvConfig,
- httpAgentOptions: config.httpAgentOptions,
- locales: (ref = config.i18n) == null ? void 0 : ref.locales,
- defaultLocale: (ref8 = config.i18n) == null ? void 0 : ref8.defaultLocale,
- pageRuntime: config.experimental.runtime
- });
- });
- // we don't output _app in serverless mode so use _app export
- // from _error instead
- const appPageToCheck = isLikeServerless ? "/_error" : "/_app";
- const customAppGetInitialPropsPromise = staticWorkers.hasCustomGetInitialProps(appPageToCheck, distDir, isLikeServerless, runtimeEnvConfig, true);
- const namedExportsPromise = staticWorkers.getNamedExports(appPageToCheck, distDir, isLikeServerless, runtimeEnvConfig);
- // eslint-disable-next-line no-shadow
- let isNextImageImported;
- // eslint-disable-next-line no-shadow
- let hasSsrAmpPages = false;
- const computedManifestData = await (0, _utils2).computeFromManifest({
- build: buildManifest,
- app: appBuildManifest
- }, distDir, config.experimental.gzipSize);
- await Promise.all(Object.entries(pageKeys).reduce((acc, [key, files])=>{
- if (!files) {
- return acc;
- }
- const pageType = key;
- for (const page of files){
- acc.push({
- pageType,
- page
- });
- }
- return acc;
- }, []).map(({ pageType , page })=>{
- const checkPageSpan = staticCheckSpan.traceChild("check-page", {
- page
- });
- return checkPageSpan.traceAsyncFn(async ()=>{
- const actualPage = (0, _normalizePagePath).normalizePagePath(page);
- const [selfSize, allSize] = await (0, _utils2).getJsPageSizeInKb(pageType, actualPage, distDir, buildManifest, appBuildManifest, config.experimental.gzipSize, computedManifestData);
- let isSsg = false;
- let isStatic = false;
- let isServerComponent = false;
- let isHybridAmp = false;
- let ssgPageRoutes = null;
- let pagePath = "";
- if (pageType === "pages") {
- pagePath = pagesPaths.find((p)=>p.startsWith(actualPage + ".") || p.startsWith(actualPage + "/index.")) || "";
- }
- let originalAppPath;
- if (pageType === "app" && mappedAppPages) {
- for (const [originalPath, normalizedPath] of Object.entries(appPathRoutes)){
- if (normalizedPath === page) {
- pagePath = mappedAppPages[originalPath].replace(/^private-next-app-dir/, "");
- originalAppPath = originalPath;
- break;
- }
- }
- }
- const staticInfo = pagePath ? await (0, _getPageStaticInfo).getPageStaticInfo({
- pageFilePath: (0, _path).join((pageType === "pages" ? pagesDir : appDir) || "", pagePath),
- nextConfig: config
- }) : undefined;
- const pageRuntime = staticInfo == null ? void 0 : staticInfo.runtime;
- isServerComponent = pageType === "app" && (staticInfo == null ? void 0 : staticInfo.rsc) !== _constants1.RSC_MODULE_TYPES.client;
- if (!(0, _utils2).isReservedPage(page)) {
- try {
- let edgeInfo;
- if (pageRuntime === _constants.SERVER_RUNTIME.edge) {
- const manifest = require((0, _path).join(distDir, serverDir, _constants1.MIDDLEWARE_MANIFEST));
- const manifestKey = pageType === "pages" ? page : (0, _path).join(page, "page");
- edgeInfo = manifest.functions[manifestKey];
- }
- let isPageStaticSpan = checkPageSpan.traceChild("is-page-static");
- let workerResult = await isPageStaticSpan.traceAsyncFn(()=>{
- var ref, ref9;
- return staticWorkers.isPageStatic({
- page,
- originalAppPath,
- distDir,
- serverless: isLikeServerless,
- configFileName,
- runtimeEnvConfig,
- httpAgentOptions: config.httpAgentOptions,
- locales: (ref = config.i18n) == null ? void 0 : ref.locales,
- defaultLocale: (ref9 = config.i18n) == null ? void 0 : ref9.defaultLocale,
- parentId: isPageStaticSpan.id,
- pageRuntime,
- edgeInfo,
- pageType,
- hasServerComponents
- });
- });
- if (pageType === "app" && originalAppPath) {
- appNormalizedPaths.set(originalAppPath, page);
- // TODO-APP: handle prerendering with edge
- // runtime
- if (pageRuntime === "experimental-edge") {
- return;
- }
- if (workerResult.encodedPrerenderRoutes && workerResult.prerenderRoutes) {
- appStaticPaths.set(originalAppPath, workerResult.prerenderRoutes);
- appStaticPathsEncoded.set(originalAppPath, workerResult.encodedPrerenderRoutes);
- }
- if (!(0, _utils).isDynamicRoute(page)) {
- appStaticPaths.set(originalAppPath, [
- page
- ]);
- appStaticPathsEncoded.set(originalAppPath, [
- page
- ]);
- }
- if (workerResult.prerenderFallback) {
- // whether or not to allow requests for paths not
- // returned from generateStaticParams
- appDynamicParamPaths.add(originalAppPath);
- }
- appDefaultConfigs.set(originalAppPath, workerResult.appConfig || {});
- return;
- }
- if (pageRuntime === _constants.SERVER_RUNTIME.edge) {
- if (workerResult.hasStaticProps) {
- console.warn(`"getStaticProps" is not yet supported fully with "experimental-edge", detected on ${page}`);
- }
- // TODO: add handling for statically rendering edge
- // pages and allow edge with Prerender outputs
- workerResult.isStatic = false;
- workerResult.hasStaticProps = false;
- }
- if (config.outputFileTracing) {
- pageTraceIncludes.set(page, workerResult.traceIncludes || []);
- pageTraceExcludes.set(page, workerResult.traceExcludes || []);
- }
- if (workerResult.isStatic === false && (workerResult.isHybridAmp || workerResult.isAmpOnly)) {
- hasSsrAmpPages = true;
- }
- if (workerResult.isHybridAmp) {
- isHybridAmp = true;
- hybridAmpPages.add(page);
- }
- if (workerResult.isNextImageImported) {
- isNextImageImported = true;
- }
- if (workerResult.hasStaticProps) {
- ssgPages.add(page);
- isSsg = true;
- if (workerResult.prerenderRoutes && workerResult.encodedPrerenderRoutes) {
- additionalSsgPaths.set(page, workerResult.prerenderRoutes);
- additionalSsgPathsEncoded.set(page, workerResult.encodedPrerenderRoutes);
- ssgPageRoutes = workerResult.prerenderRoutes;
- }
- if (workerResult.prerenderFallback === "blocking") {
- ssgBlockingFallbackPages.add(page);
- } else if (workerResult.prerenderFallback === true) {
- ssgStaticFallbackPages.add(page);
- }
- } else if (workerResult.hasServerProps) {
- serverPropsPages.add(page);
- } else if (workerResult.isStatic && !isServerComponent && await customAppGetInitialPropsPromise === false) {
- staticPages.add(page);
- isStatic = true;
- } else if (isServerComponent) {
- // This is a static server component page that doesn't have
- // gSP or gSSP. We still treat it as a SSG page.
- ssgPages.add(page);
- isSsg = true;
- }
- if (hasPages404 && page === "/404") {
- if (!workerResult.isStatic && !workerResult.hasStaticProps) {
- throw new Error(`\`pages/404\` ${_constants.STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR}`);
- }
- // we need to ensure the 404 lambda is present since we use
- // it when _app has getInitialProps
- if (await customAppGetInitialPropsPromise && !workerResult.hasStaticProps) {
- staticPages.delete(page);
- }
- }
- if (_constants1.STATIC_STATUS_PAGES.includes(page) && !workerResult.isStatic && !workerResult.hasStaticProps) {
- throw new Error(`\`pages${page}\` ${_constants.STATIC_STATUS_PAGE_GET_INITIAL_PROPS_ERROR}`);
- }
- } catch (err) {
- if (!(0, _isError).default(err) || err.message !== "INVALID_DEFAULT_EXPORT") throw err;
- invalidPages.add(page);
- }
- }
- pageInfos.set(page, {
- size: selfSize,
- totalSize: allSize,
- static: isStatic,
- isSsg,
- isHybridAmp,
- ssgPageRoutes,
- initialRevalidateSeconds: false,
- runtime: pageRuntime,
- pageDuration: undefined,
- ssgPageDurations: undefined
- });
- });
- }));
- const errorPageResult = await errorPageStaticResult;
- const nonStaticErrorPage = await errorPageHasCustomGetInitialProps || errorPageResult && errorPageResult.hasServerProps;
- const returnValue = {
- customAppGetInitialProps: await customAppGetInitialPropsPromise,
- namedExports: await namedExportsPromise,
- isNextImageImported,
- hasSsrAmpPages,
- hasNonStaticErrorPage: nonStaticErrorPage
- };
- if (!sharedPool) staticWorkers.end();
- return returnValue;
- });
- if (customAppGetInitialProps) {
- console.warn(_chalk.default.bold.yellow(`Warning: `) + _chalk.default.yellow(`You have opted-out of Automatic Static Optimization due to \`getInitialProps\` in \`pages/_app\`. This does not opt-out pages with \`getStaticProps\``));
- console.warn("Read more: https://nextjs.org/docs/messages/opt-out-auto-static-optimization\n");
- }
- if (!hasSsrAmpPages1) {
- requiredServerFiles.ignore.push(_path.default.relative(dir, _path.default.join(_path.default.dirname(require.resolve("next/dist/compiled/@ampproject/toolbox-optimizer")), "**/*")));
- }
- if (config.outputFileTracing) {
- const { nodeFileTrace } = require("next/dist/compiled/@vercel/nft");
- const includeExcludeSpan = nextBuildSpan.traceChild("apply-include-excludes");
- await includeExcludeSpan.traceAsyncFn(async ()=>{
- const globOrig = require("next/dist/compiled/glob");
- const glob = (pattern)=>{
- return new Promise((resolve, reject)=>{
- globOrig(pattern, {
- cwd: dir
- }, (err, files)=>{
- if (err) {
- return reject(err);
- }
- resolve(files);
- });
- });
- };
- for (let page of pageKeys.pages){
- await includeExcludeSpan.traceChild("include-exclude", {
- page
- }).traceAsyncFn(async ()=>{
- const includeGlobs = pageTraceIncludes.get(page);
- const excludeGlobs = pageTraceExcludes.get(page);
- page = (0, _normalizePagePath).normalizePagePath(page);
- if (!(includeGlobs == null ? void 0 : includeGlobs.length) && !(excludeGlobs == null ? void 0 : excludeGlobs.length)) {
- return;
- }
- const traceFile = _path.default.join(distDir, "server/pages", `${page}.js.nft.json`);
- const pageDir = _path.default.dirname(traceFile);
- const traceContent = JSON.parse(await _fs.promises.readFile(traceFile, "utf8"));
- let includes = [];
- if (includeGlobs == null ? void 0 : includeGlobs.length) {
- for (const includeGlob of includeGlobs){
- const results = await glob(includeGlob);
- includes.push(...results.map((file)=>{
- return _path.default.relative(pageDir, _path.default.join(dir, file));
- }));
- }
- }
- const combined = new Set([
- ...traceContent.files,
- ...includes
- ]);
- if (excludeGlobs == null ? void 0 : excludeGlobs.length) {
- const resolvedGlobs = excludeGlobs.map((exclude)=>_path.default.join(dir, exclude));
- combined.forEach((file)=>{
- if ((0, _micromatch).isMatch(_path.default.join(pageDir, file), resolvedGlobs)) {
- combined.delete(file);
- }
- });
- }
- await _fs.promises.writeFile(traceFile, JSON.stringify({
- version: traceContent.version,
- files: [
- ...combined
- ]
- }));
- });
- }
- });
- // TODO: move this inside of webpack so it can be cached
- // between builds. Should only need to be re-run on lockfile change
- await nextBuildSpan.traceChild("trace-next-server").traceAsyncFn(async ()=>{
- let cacheKey;
- // consider all lockFiles in tree in case user accidentally
- // has both package-lock.json and yarn.lock
- const lockFiles = (await Promise.all([
- "package-lock.json",
- "yarn.lock",
- "pnpm-lock.yaml"
- ].map((file)=>(0, _findUp).default(file, {
- cwd: dir
- })))).filter(Boolean)// TypeScript doesn't like this filter
- ;
- const nextServerTraceOutput = _path.default.join(distDir, "next-server.js.nft.json");
- const cachedTracePath = _path.default.join(distDir, "cache/next-server.js.nft.json");
- if (lockFiles.length > 0) {
- const cacheHash = require("crypto").createHash("sha256");
- cacheHash.update(require("next/package").version);
- cacheHash.update(hasSsrAmpPages1 + "");
- cacheHash.update(ciEnvironment.hasNextSupport + "");
- await Promise.all(lockFiles.map(async (lockFile)=>{
- cacheHash.update(await _fs.promises.readFile(lockFile));
- }));
- cacheKey = cacheHash.digest("hex");
- try {
- const existingTrace = JSON.parse(await _fs.promises.readFile(cachedTracePath, "utf8"));
- if (existingTrace.cacheKey === cacheKey) {
- await _fs.promises.copyFile(cachedTracePath, nextServerTraceOutput);
- return;
- }
- } catch (_) {}
- }
- const root = config.experimental.outputFileTracingRoot || dir;
- const toTrace = [
- require.resolve("next/dist/server/next-server")
- ];
- // ensure we trace any dependencies needed for custom
- // incremental cache handler
- if (config.experimental.incrementalCacheHandlerPath) {
- toTrace.push(require.resolve(config.experimental.incrementalCacheHandlerPath));
- }
- const serverResult = await nodeFileTrace(toTrace, {
- base: root,
- processCwd: dir,
- ignore: [
- "**/next/dist/pages/**/*",
- "**/next/dist/compiled/webpack/(bundle4|bundle5).js",
- "**/node_modules/webpack5/**/*",
- "**/next/dist/server/lib/squoosh/**/*.wasm",
- ...ciEnvironment.hasNextSupport ? [
- // only ignore image-optimizer code when
- // this is being handled outside of next-server
- "**/next/dist/server/image-optimizer.js",
- "**/node_modules/sharp/**/*",
- ] : [],
- ...!hasSsrAmpPages1 ? [
- "**/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"
- ] : [],
- ]
- });
- const tracedFiles = new Set();
- serverResult.fileList.forEach((file)=>{
- tracedFiles.add(_path.default.relative(distDir, _path.default.join(root, file)).replace(/\\/g, "/"));
- });
- await _fs.promises.writeFile(nextServerTraceOutput, JSON.stringify({
- version: 1,
- cacheKey,
- files: [
- ...tracedFiles
- ]
- }));
- await _fs.promises.unlink(cachedTracePath).catch(()=>{});
- await _fs.promises.copyFile(nextServerTraceOutput, cachedTracePath).catch(()=>{});
- });
- }
- if (serverPropsPages.size > 0 || ssgPages.size > 0) {
- // We update the routes manifest after the build with the
- // data routes since we can't determine these until after build
- routesManifest.dataRoutes = (0, _utils).getSortedRoutes([
- ...serverPropsPages,
- ...ssgPages,
- ]).map((page)=>{
- const pagePath = (0, _normalizePagePath).normalizePagePath(page);
- const dataRoute = _path.default.posix.join("/_next/data", buildId, `${pagePath}.json`);
- let dataRouteRegex;
- let namedDataRouteRegex;
- let routeKeys;
- if ((0, _utils).isDynamicRoute(page)) {
- const routeRegex = (0, _routeRegex).getNamedRouteRegex(dataRoute.replace(/\.json$/, ""));
- dataRouteRegex = (0, _loadCustomRoutes).normalizeRouteRegex(routeRegex.re.source.replace(/\(\?:\\\/\)\?\$$/, `\\.json$`));
- namedDataRouteRegex = routeRegex.namedRegex.replace(/\(\?:\/\)\?\$$/, `\\.json$`);
- routeKeys = routeRegex.routeKeys;
- } else {
- dataRouteRegex = (0, _loadCustomRoutes).normalizeRouteRegex(new RegExp(`^${_path.default.posix.join("/_next/data", (0, _escapeRegexp).escapeStringRegexp(buildId), `${pagePath}.json`)}$`).source);
- }
- return {
- page,
- routeKeys,
- dataRouteRegex,
- namedDataRouteRegex
- };
- });
- await _fs.promises.writeFile(routesManifestPath, JSON.stringify(routesManifest), "utf8");
- }
- // Since custom _app.js can wrap the 404 page we have to opt-out of static optimization if it has getInitialProps
- // Only export the static 404 when there is no /_error present
- const useStatic404 = !customAppGetInitialProps && (!hasNonStaticErrorPage || hasPages404);
- if (invalidPages.size > 0) {
- const err = new Error(`Build optimization failed: found page${invalidPages.size === 1 ? "" : "s"} without a React Component as default export in \n${[
- ...invalidPages
- ].map((pg)=>`pages${pg}`).join("\n")}\n\nSee https://nextjs.org/docs/messages/page-without-valid-component for more info.\n`);
- err.code = "BUILD_OPTIMIZATION_FAILED";
- throw err;
- }
- await (0, _writeBuildId).writeBuildId(distDir, buildId);
- if (config.experimental.optimizeCss) {
- const globOrig = require("next/dist/compiled/glob");
- const cssFilePaths = await new Promise((resolve, reject)=>{
- globOrig("**/*.css", {
- cwd: (0, _path).join(distDir, "static")
- }, (err, files)=>{
- if (err) {
- return reject(err);
- }
- resolve(files);
- });
- });
- requiredServerFiles.files.push(...cssFilePaths.map((filePath)=>_path.default.join(config.distDir, "static", filePath)));
- }
- const features = [
- {
- featureName: "experimental/optimizeCss",
- invocationCount: config.experimental.optimizeCss ? 1 : 0
- },
- {
- featureName: "experimental/nextScriptWorkers",
- invocationCount: config.experimental.nextScriptWorkers ? 1 : 0
- },
- {
- featureName: "optimizeFonts",
- invocationCount: config.optimizeFonts ? 1 : 0
- },
- ];
- telemetry.record(features.map((feature)=>{
- return {
- eventName: _events.EVENT_BUILD_FEATURE_USAGE,
- payload: feature
- };
- }));
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.SERVER_FILES_MANIFEST), JSON.stringify(requiredServerFiles), "utf8");
- const middlewareManifest = JSON.parse(await _fs.promises.readFile(_path.default.join(distDir, serverDir, _constants1.MIDDLEWARE_MANIFEST), "utf8"));
- const outputFileTracingRoot = config.experimental.outputFileTracingRoot || dir;
- if (config.output === "standalone") {
- await nextBuildSpan.traceChild("copy-traced-files").traceAsyncFn(async ()=>{
- await (0, _utils2).copyTracedFiles(dir, distDir, pageKeys.pages, outputFileTracingRoot, requiredServerFiles.config, middlewareManifest);
- });
- }
- const finalPrerenderRoutes = {};
- const finalDynamicRoutes = {};
- const tbdPrerenderRoutes = [];
- let ssgNotFoundPaths = [];
- if (postCompileSpinner) postCompileSpinner.stopAndPersist();
- const { i18n } = config;
- const usedStaticStatusPages = _constants1.STATIC_STATUS_PAGES.filter((page)=>mappedPages[page] && mappedPages[page].startsWith("private-next-pages"));
- usedStaticStatusPages.forEach((page)=>{
- if (!ssgPages.has(page) && !customAppGetInitialProps) {
- staticPages.add(page);
- }
- });
- const hasPages500 = usedStaticStatusPages.includes("/500");
- const useDefaultStatic500 = !hasPages500 && !hasNonStaticErrorPage && !customAppGetInitialProps;
- const combinedPages = [
- ...staticPages,
- ...ssgPages
- ];
- // we need to trigger automatic exporting when we have
- // - static 404/500
- // - getStaticProps paths
- // - experimental app is enabled
- if (combinedPages.length > 0 || useStatic404 || useDefaultStatic500 || config.experimental.appDir) {
- const staticGenerationSpan = nextBuildSpan.traceChild("static-generation");
- await staticGenerationSpan.traceAsyncFn(async ()=>{
- (0, _utils2).detectConflictingPaths([
- ...combinedPages,
- ...pageKeys.pages.filter((page)=>!combinedPages.includes(page)),
- ], ssgPages, additionalSsgPaths);
- const exportApp = require("../export").default;
- const exportOptions = {
- silent: false,
- buildExport: true,
- threads: config.experimental.cpus,
- pages: combinedPages,
- outdir: _path.default.join(distDir, "export"),
- statusMessage: "Generating static pages",
- exportPageWorker: sharedPool ? staticWorkers.exportPage.bind(staticWorkers) : undefined,
- endWorker: sharedPool ? async ()=>{
- await staticWorkers.end();
- } : undefined,
- appPaths
- };
- const exportConfig = {
- ...config,
- initialPageRevalidationMap: {},
- pageDurationMap: {},
- ssgNotFoundPaths: [],
- // Default map will be the collection of automatic statically exported
- // pages and incremental pages.
- // n.b. we cannot handle this above in combinedPages because the dynamic
- // page must be in the `pages` array, but not in the mapping.
- exportPathMap: (defaultMap)=>{
- // Dynamically routed pages should be prerendered to be used as
- // a client-side skeleton (fallback) while data is being fetched.
- // This ensures the end-user never sees a 500 or slow response from the
- // server.
- //
- // Note: prerendering disables automatic static optimization.
- ssgPages.forEach((page)=>{
- if ((0, _utils).isDynamicRoute(page)) {
- tbdPrerenderRoutes.push(page);
- if (ssgStaticFallbackPages.has(page)) {
- // Override the rendering for the dynamic page to be treated as a
- // fallback render.
- if (i18n) {
- defaultMap[`/${i18n.defaultLocale}${page}`] = {
- page,
- query: {
- __nextFallback: true
- }
- };
- } else {
- defaultMap[page] = {
- page,
- query: {
- __nextFallback: true
- }
- };
- }
- } else {
- // Remove dynamically routed pages from the default path map when
- // fallback behavior is disabled.
- delete defaultMap[page];
- }
- }
- });
- // Append the "well-known" routes we should prerender for, e.g. blog
- // post slugs.
- additionalSsgPaths.forEach((routes, page)=>{
- const encodedRoutes = additionalSsgPathsEncoded.get(page);
- routes.forEach((route, routeIdx)=>{
- defaultMap[route] = {
- page,
- query: {
- __nextSsgPath: encodedRoutes == null ? void 0 : encodedRoutes[routeIdx]
- }
- };
- });
- });
- if (useStatic404) {
- defaultMap["/404"] = {
- page: hasPages404 ? "/404" : "/_error"
- };
- }
- if (useDefaultStatic500) {
- defaultMap["/500"] = {
- page: "/_error"
- };
- }
- // TODO: output manifest specific to app paths and their
- // revalidate periods and dynamicParams settings
- appStaticPaths.forEach((routes, originalAppPath)=>{
- const encodedRoutes = appStaticPathsEncoded.get(originalAppPath);
- routes.forEach((route, routeIdx)=>{
- defaultMap[route] = {
- page: originalAppPath,
- query: {
- __nextSsgPath: encodedRoutes == null ? void 0 : encodedRoutes[routeIdx]
- },
- _isAppDir: true
- };
- });
- });
- if (i18n) {
- for (const page of [
- ...staticPages,
- ...ssgPages,
- ...useStatic404 ? [
- "/404"
- ] : [],
- ...useDefaultStatic500 ? [
- "/500"
- ] : [],
- ]){
- const isSsg = ssgPages.has(page);
- const isDynamic = (0, _utils).isDynamicRoute(page);
- const isFallback = isSsg && ssgStaticFallbackPages.has(page);
- for (const locale of i18n.locales){
- var ref;
- // skip fallback generation for SSG pages without fallback mode
- if (isSsg && isDynamic && !isFallback) continue;
- const outputPath = `/${locale}${page === "/" ? "" : page}`;
- defaultMap[outputPath] = {
- page: ((ref = defaultMap[page]) == null ? void 0 : ref.page) || page,
- query: {
- __nextLocale: locale
- }
- };
- if (isFallback) {
- defaultMap[outputPath].query.__nextFallback = true;
- }
- }
- if (isSsg) {
- // remove non-locale prefixed variant from defaultMap
- delete defaultMap[page];
- }
- }
- }
- return defaultMap;
- }
- };
- await exportApp(dir, exportOptions, nextBuildSpan, exportConfig);
- const postBuildSpinner = (0, _spinner).default({
- prefixText: `${Log.prefixes.info} Finalizing page optimization`
- });
- ssgNotFoundPaths = exportConfig.ssgNotFoundPaths;
- // remove server bundles that were exported
- for (const page2 of staticPages){
- const serverBundle = (0, _require).getPagePath(page2, distDir, isLikeServerless);
- await _fs.promises.unlink(serverBundle);
- }
- for (const [originalAppPath1, routes1] of appStaticPaths){
- const page = appNormalizedPaths.get(originalAppPath1) || "";
- const appConfig = appDefaultConfigs.get(originalAppPath1) || {};
- let hasDynamicData = appConfig.revalidate === 0;
- routes1.forEach((route)=>{
- let revalidate = exportConfig.initialPageRevalidationMap[route];
- if (typeof revalidate === "undefined") {
- revalidate = typeof appConfig.revalidate !== "undefined" ? appConfig.revalidate : false;
- }
- if (revalidate !== 0) {
- const normalizedRoute = (0, _normalizePagePath).normalizePagePath(route);
- const dataRoute = _path.default.posix.join(`${normalizedRoute}.rsc`);
- finalPrerenderRoutes[route] = {
- initialRevalidateSeconds: revalidate,
- srcRoute: page,
- dataRoute
- };
- } else {
- hasDynamicData = true;
- }
- });
- if (!hasDynamicData && (0, _utils).isDynamicRoute(originalAppPath1)) {
- const normalizedRoute = (0, _normalizePagePath).normalizePagePath(page);
- const dataRoute = _path.default.posix.join(`${normalizedRoute}.rsc`);
- // TODO: create a separate manifest to allow enforcing
- // dynamicParams for non-static paths?
- finalDynamicRoutes[page] = {
- routeRegex: (0, _loadCustomRoutes).normalizeRouteRegex((0, _routeRegex).getNamedRouteRegex(page).re.source),
- dataRoute,
- // if dynamicParams are enabled treat as fallback:
- // 'blocking' if not it's fallback: false
- fallback: appDynamicParamPaths.has(originalAppPath1) ? null : false,
- dataRouteRegex: (0, _loadCustomRoutes).normalizeRouteRegex((0, _routeRegex).getNamedRouteRegex(dataRoute.replace(/\.rsc$/, "")).re.source.replace(/\(\?:\\\/\)\?\$$/, "\\.rsc$"))
- };
- }
- }
- const moveExportedPage = async (originPage, page, file, isSsg, ext, additionalSsgFile = false)=>{
- return staticGenerationSpan.traceChild("move-exported-page").traceAsyncFn(async ()=>{
- file = `${file}.${ext}`;
- const orig = _path.default.join(exportOptions.outdir, file);
- const pagePath = (0, _require).getPagePath(originPage, distDir, isLikeServerless);
- const relativeDest = _path.default.relative(_path.default.join(distDir, serverDir), _path.default.join(_path.default.join(pagePath, // strip leading / and then recurse number of nested dirs
- // to place from base folder
- originPage.slice(1).split("/").map(()=>"..").join("/")), file)).replace(/\\/g, "/");
- if (!isSsg && !// don't add static status page to manifest if it's
- // the default generated version e.g. no pages/500
- (_constants1.STATIC_STATUS_PAGES.includes(page) && !usedStaticStatusPages.includes(page))) {
- pagesManifest[page] = relativeDest;
- }
- const dest = _path.default.join(distDir, serverDir, relativeDest);
- const isNotFound = ssgNotFoundPaths.includes(page);
- // for SSG files with i18n the non-prerendered variants are
- // output with the locale prefixed so don't attempt moving
- // without the prefix
- if ((!i18n || additionalSsgFile) && !isNotFound) {
- await _fs.promises.mkdir(_path.default.dirname(dest), {
- recursive: true
- });
- await _fs.promises.rename(orig, dest);
- } else if (i18n && !isSsg) {
- // this will be updated with the locale prefixed variant
- // since all files are output with the locale prefix
- delete pagesManifest[page];
- }
- if (i18n) {
- if (additionalSsgFile) return;
- for (const locale of i18n.locales){
- const curPath = `/${locale}${page === "/" ? "" : page}`;
- const localeExt = page === "/" ? _path.default.extname(file) : "";
- const relativeDestNoPages = relativeDest.slice("pages/".length);
- if (isSsg && ssgNotFoundPaths.includes(curPath)) {
- continue;
- }
- const updatedRelativeDest = _path.default.join("pages", locale + localeExt, // if it's the top-most index page we want it to be locale.EXT
- // instead of locale/index.html
- page === "/" ? "" : relativeDestNoPages).replace(/\\/g, "/");
- const updatedOrig = _path.default.join(exportOptions.outdir, locale + localeExt, page === "/" ? "" : file);
- const updatedDest = _path.default.join(distDir, serverDir, updatedRelativeDest);
- if (!isSsg) {
- pagesManifest[curPath] = updatedRelativeDest;
- }
- await _fs.promises.mkdir(_path.default.dirname(updatedDest), {
- recursive: true
- });
- await _fs.promises.rename(updatedOrig, updatedDest);
- }
- }
- });
- };
- // Only move /404 to /404 when there is no custom 404 as in that case we don't know about the 404 page
- if (!hasPages404 && useStatic404) {
- await moveExportedPage("/_error", "/404", "/404", false, "html");
- }
- if (useDefaultStatic500) {
- await moveExportedPage("/_error", "/500", "/500", false, "html");
- }
- for (const page1 of combinedPages){
- const isSsg = ssgPages.has(page1);
- const isStaticSsgFallback = ssgStaticFallbackPages.has(page1);
- const isDynamic = (0, _utils).isDynamicRoute(page1);
- const hasAmp = hybridAmpPages.has(page1);
- const file = (0, _normalizePagePath).normalizePagePath(page1);
- const pageInfo = pageInfos.get(page1);
- const durationInfo = exportConfig.pageDurationMap[page1];
- if (pageInfo && durationInfo) {
- // Set Build Duration
- if (pageInfo.ssgPageRoutes) {
- pageInfo.ssgPageDurations = pageInfo.ssgPageRoutes.map((pagePath)=>durationInfo[pagePath]);
- }
- pageInfo.pageDuration = durationInfo[page1];
- }
- // The dynamic version of SSG pages are only prerendered if the
- // fallback is enabled. Below, we handle the specific prerenders
- // of these.
- const hasHtmlOutput = !(isSsg && isDynamic && !isStaticSsgFallback);
- if (hasHtmlOutput) {
- await moveExportedPage(page1, page1, file, isSsg, "html");
- }
- if (hasAmp && (!isSsg || isSsg && !isDynamic)) {
- const ampPage = `${file}.amp`;
- await moveExportedPage(page1, ampPage, ampPage, isSsg, "html");
- if (isSsg) {
- await moveExportedPage(page1, ampPage, ampPage, isSsg, "json");
- }
- }
- if (isSsg) {
- // For a non-dynamic SSG page, we must copy its data file
- // from export, we already moved the HTML file above
- if (!isDynamic) {
- await moveExportedPage(page1, page1, file, isSsg, "json");
- if (i18n) {
- // TODO: do we want to show all locale variants in build output
- for (const locale of i18n.locales){
- const localePage = `/${locale}${page1 === "/" ? "" : page1}`;
- finalPrerenderRoutes[localePage] = {
- initialRevalidateSeconds: exportConfig.initialPageRevalidationMap[localePage],
- srcRoute: null,
- dataRoute: _path.default.posix.join("/_next/data", buildId, `${file}.json`)
- };
- }
- } else {
- finalPrerenderRoutes[page1] = {
- initialRevalidateSeconds: exportConfig.initialPageRevalidationMap[page1],
- srcRoute: null,
- dataRoute: _path.default.posix.join("/_next/data", buildId, `${file}.json`)
- };
- }
- // Set Page Revalidation Interval
- if (pageInfo) {
- pageInfo.initialRevalidateSeconds = exportConfig.initialPageRevalidationMap[page1];
- }
- } else {
- // For a dynamic SSG page, we did not copy its data exports and only
- // copy the fallback HTML file (if present).
- // We must also copy specific versions of this page as defined by
- // `getStaticPaths` (additionalSsgPaths).
- const extraRoutes = additionalSsgPaths.get(page1) || [];
- for (const route of extraRoutes){
- const pageFile = (0, _normalizePagePath).normalizePagePath(route);
- await moveExportedPage(page1, route, pageFile, isSsg, "html", true);
- await moveExportedPage(page1, route, pageFile, isSsg, "json", true);
- if (hasAmp) {
- const ampPage = `${pageFile}.amp`;
- await moveExportedPage(page1, ampPage, ampPage, isSsg, "html", true);
- await moveExportedPage(page1, ampPage, ampPage, isSsg, "json", true);
- }
- finalPrerenderRoutes[route] = {
- initialRevalidateSeconds: exportConfig.initialPageRevalidationMap[route],
- srcRoute: page1,
- dataRoute: _path.default.posix.join("/_next/data", buildId, `${(0, _normalizePagePath).normalizePagePath(route)}.json`)
- };
- // Set route Revalidation Interval
- if (pageInfo) {
- pageInfo.initialRevalidateSeconds = exportConfig.initialPageRevalidationMap[route];
- }
- }
- }
- }
- }
- // remove temporary export folder
- await (0, _recursiveDelete).recursiveDelete(exportOptions.outdir);
- await _fs.promises.rmdir(exportOptions.outdir);
- await _fs.promises.writeFile(manifestPath, JSON.stringify(pagesManifest, null, 2), "utf8");
- if (postBuildSpinner) postBuildSpinner.stopAndPersist();
- console.log();
- });
- }
- // ensure the worker is not left hanging
- staticWorkers.close();
- const analysisEnd = process.hrtime(analysisBegin);
- var ref5;
- telemetry.record((0, _events).eventBuildOptimize(pagesPaths, {
- durationInSeconds: analysisEnd[0],
- staticPageCount: staticPages.size,
- staticPropsPageCount: ssgPages.size,
- serverPropsPageCount: serverPropsPages.size,
- ssrPageCount: pagesPaths.length - (staticPages.size + ssgPages.size + serverPropsPages.size),
- hasStatic404: useStatic404,
- hasReportWebVitals: (ref5 = namedExports == null ? void 0 : namedExports.includes("reportWebVitals")) != null ? ref5 : false,
- rewritesCount: combinedRewrites.length,
- headersCount: headers.length,
- redirectsCount: redirects.length - 1,
- headersWithHasCount: headers.filter((r)=>!!r.has).length,
- rewritesWithHasCount: combinedRewrites.filter((r)=>!!r.has).length,
- redirectsWithHasCount: redirects.filter((r)=>!!r.has).length,
- middlewareCount: Object.keys(rootPaths).length > 0 ? 1 : 0
- }));
- if (telemetryPlugin) {
- const events = (0, _events).eventBuildFeatureUsage(telemetryPlugin);
- telemetry.record(events);
- telemetry.record((0, _events).eventPackageUsedInGetServerSideProps(telemetryPlugin));
- }
- if (ssgPages.size > 0 || appDir) {
- var ref6;
- tbdPrerenderRoutes.forEach((tbdRoute)=>{
- const normalizedRoute = (0, _normalizePagePath).normalizePagePath(tbdRoute);
- const dataRoute = _path.default.posix.join("/_next/data", buildId, `${normalizedRoute}.json`);
- finalDynamicRoutes[tbdRoute] = {
- routeRegex: (0, _loadCustomRoutes).normalizeRouteRegex((0, _routeRegex).getNamedRouteRegex(tbdRoute).re.source),
- dataRoute,
- fallback: ssgBlockingFallbackPages.has(tbdRoute) ? null : ssgStaticFallbackPages.has(tbdRoute) ? `${normalizedRoute}.html` : false,
- dataRouteRegex: (0, _loadCustomRoutes).normalizeRouteRegex((0, _routeRegex).getNamedRouteRegex(dataRoute.replace(/\.json$/, "")).re.source.replace(/\(\?:\\\/\)\?\$$/, "\\.json$"))
- };
- });
- const prerenderManifest = {
- version: 3,
- routes: finalPrerenderRoutes,
- dynamicRoutes: finalDynamicRoutes,
- notFoundRoutes: ssgNotFoundPaths,
- preview: previewProps
- };
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.PRERENDER_MANIFEST), JSON.stringify(prerenderManifest), "utf8");
- await generateClientSsgManifest(prerenderManifest, {
- distDir,
- buildId,
- locales: ((ref6 = config.i18n) == null ? void 0 : ref6.locales) || []
- });
- } else {
- const prerenderManifest = {
- version: 3,
- routes: {},
- dynamicRoutes: {},
- preview: previewProps,
- notFoundRoutes: []
- };
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.PRERENDER_MANIFEST), JSON.stringify(prerenderManifest), "utf8");
- }
- const images = {
- ...config.images
- };
- const { deviceSizes , imageSizes } = images;
- images.sizes = [
- ...deviceSizes,
- ...imageSizes
- ];
- var _pathname;
- images.remotePatterns = ((config == null ? void 0 : (ref1 = config.images) == null ? void 0 : ref1.remotePatterns) || []).map((p)=>({
- // Should be the same as matchRemotePattern()
- protocol: p.protocol,
- hostname: (0, _micromatch).makeRe(p.hostname).source,
- port: p.port,
- pathname: (0, _micromatch).makeRe((_pathname = p.pathname) != null ? _pathname : "**").source
- }));
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.IMAGES_MANIFEST), JSON.stringify({
- version: 1,
- images
- }), "utf8");
- await _fs.promises.writeFile(_path.default.join(distDir, _constants1.EXPORT_MARKER), JSON.stringify({
- version: 1,
- hasExportPathMap: typeof config.exportPathMap === "function",
- exportTrailingSlash: config.trailingSlash === true,
- isNextImageImported: isNextImageImported1 === true
- }), "utf8");
- await _fs.promises.unlink(_path.default.join(distDir, _constants1.EXPORT_DETAIL)).catch((err)=>{
- if (err.code === "ENOENT") {
- return Promise.resolve();
- }
- return Promise.reject(err);
- });
- if (config.output === "standalone") {
- for (const file of [
- ...requiredServerFiles.files,
- _path.default.join(config.distDir, _constants1.SERVER_FILES_MANIFEST),
- ...loadedEnvFiles.reduce((acc, envFile)=>{
- if ([
- ".env",
- ".env.production"
- ].includes(envFile.path)) {
- acc.push(envFile.path);
- }
- return acc;
- }, []),
- ]){
- const filePath = _path.default.join(dir, file);
- const outputPath = _path.default.join(distDir, "standalone", _path.default.relative(outputFileTracingRoot, filePath));
- await _fs.promises.mkdir(_path.default.dirname(outputPath), {
- recursive: true
- });
- await _fs.promises.copyFile(filePath, outputPath);
- }
- await (0, _recursiveCopy).recursiveCopy(_path.default.join(distDir, _constants1.SERVER_DIRECTORY, "pages"), _path.default.join(distDir, "standalone", _path.default.relative(outputFileTracingRoot, distDir), _constants1.SERVER_DIRECTORY, "pages"), {
- overwrite: true
- });
- }
- staticPages.forEach((pg)=>allStaticPages.add(pg));
- pageInfos.forEach((info, key)=>{
- allPageInfos.set(key, info);
- });
- await nextBuildSpan.traceChild("print-tree-view").traceAsyncFn(()=>(0, _utils2).printTreeView(pageKeys, allPageInfos, isLikeServerless, {
- distPath: distDir,
- buildId: buildId,
- pagesDir,
- useStatic404,
- pageExtensions: config.pageExtensions,
- appBuildManifest,
- buildManifest,
- middlewareManifest,
- gzipSize: config.experimental.gzipSize
- }));
- if (debugOutput) {
- nextBuildSpan.traceChild("print-custom-routes").traceFn(()=>(0, _utils2).printCustomRoutes({
- redirects,
- rewrites,
- headers
- }));
- }
- if (config.analyticsId) {
- console.log(_chalk.default.bold.green("Next.js Analytics") + " is enabled for this production build. " + "You'll receive a Real Experience Score computed by all of your visitors.");
- console.log("");
- }
- if (Boolean(config.experimental.nextScriptWorkers)) {
- await nextBuildSpan.traceChild("verify-partytown-setup").traceAsyncFn(async ()=>{
- await (0, _verifyPartytownSetup).verifyPartytownSetup(dir, (0, _path).join(distDir, _constants1.CLIENT_STATIC_FILES_PATH));
- });
- }
- await nextBuildSpan.traceChild("telemetry-flush").traceAsyncFn(()=>telemetry.flush());
- });
- return buildResult;
- } finally{
- // Ensure we wait for lockfile patching if present
- await _swc.lockfilePatchPromise.cur;
- // Ensure all traces are flushed before finishing the command
- await (0, _trace).flushAllTraces();
- (0, _swc).teardownTraceSubscriber();
- (0, _swc).teardownCrashReporter();
- }
- }
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {
- default: obj
- };
- }
- function _getRequireWildcardCache() {
- if (typeof WeakMap !== "function") return null;
- var cache = new WeakMap();
- _getRequireWildcardCache = function() {
- return cache;
- };
- return cache;
- }
- function _interopRequireWildcard(obj) {
- if (obj && obj.__esModule) {
- return obj;
- }
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
- return {
- default: obj
- };
- }
- var cache = _getRequireWildcardCache();
- if (cache && cache.has(obj)) {
- return cache.get(obj);
- }
- var newObj = {};
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
- for(var key in obj){
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
- if (desc && (desc.get || desc.set)) {
- Object.defineProperty(newObj, key, desc);
- } else {
- newObj[key] = obj[key];
- }
- }
- }
- newObj.default = obj;
- if (cache) {
- cache.set(obj, newObj);
- }
- return newObj;
- }
- /**
- * typescript will be loaded in "next/lib/verifyTypeScriptSetup" and
- * then passed to "next/lib/typescript/runTypeCheck" as a parameter.
- *
- * Since it is impossible to pass a function from main thread to a worker,
- * instead of running "next/lib/typescript/runTypeCheck" in a worker,
- * we will run entire "next/lib/verifyTypeScriptSetup" in a worker instead.
- */ function verifyTypeScriptSetup(dir, intentDirs, typeCheckPreflight, tsconfigPath, disableStaticImages, cacheDir, numWorkers, enableWorkerThreads) {
- const typeCheckWorker = new _jestWorker.Worker(require.resolve("../lib/verifyTypeScriptSetup"), {
- numWorkers,
- enableWorkerThreads,
- maxRetries: 0
- });
- typeCheckWorker.getStdout().pipe(process.stdout);
- typeCheckWorker.getStderr().pipe(process.stderr);
- return typeCheckWorker.verifyTypeScriptSetup({
- dir,
- intentDirs,
- typeCheckPreflight,
- tsconfigPath,
- disableStaticImages,
- cacheDir
- }).then((result)=>{
- typeCheckWorker.end();
- return result;
- });
- }
- function generateClientSsgManifest(prerenderManifest, { buildId , distDir , locales }) {
- const ssgPages = new Set([
- ...Object.entries(prerenderManifest.routes)// Filter out dynamic routes
- .filter(([, { srcRoute }])=>srcRoute == null).map(([route])=>(0, _normalizeLocalePath).normalizeLocalePath(route, locales).pathname),
- ...Object.keys(prerenderManifest.dynamicRoutes),
- ].sort());
- const clientSsgManifestContent = `self.__SSG_MANIFEST=${(0, _devalue).default(ssgPages)};self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()`;
- (0, _fs).writeFileSync(_path.default.join(distDir, _constants1.CLIENT_STATIC_FILES_PATH, buildId, "_ssgManifest.js"), clientSsgManifestContent);
- }
- function isTelemetryPlugin(plugin) {
- return plugin instanceof _telemetryPlugin.TelemetryPlugin;
- }
- function pageToRoute(page) {
- const routeRegex = (0, _routeRegex).getNamedRouteRegex(page);
- return {
- page,
- regex: (0, _loadCustomRoutes).normalizeRouteRegex(routeRegex.re.source),
- routeKeys: routeRegex.routeKeys,
- namedRegex: routeRegex.namedRegex
- };
- }
- //# sourceMappingURL=index.js.map
|