UNPKG

next

Version:

The React Framework

24 lines 7.03 kB
"use strict";exports.__esModule=true;exports.default=void 0;var _devalue=_interopRequireDefault(require("next/dist/compiled/devalue"));var _webpack=require("next/dist/compiled/webpack/webpack");var _constants=require("../../../next-server/lib/constants");var _getRouteFromEntrypoint=_interopRequireDefault(require("../../../next-server/server/get-route-from-entrypoint"));var _nextDropClientPagePlugin=require("./next-drop-client-page-plugin");var _utils=require("../../../next-server/lib/router/utils");var _profilingPlugin=require("./profiling-plugin");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// This function takes the asset map generated in BuildManifestPlugin and creates a // reduced version to send to the client. function generateClientManifest(compiler,assetMap,rewrites){const compilerSpan=_profilingPlugin.spans.get(compiler);const genClientManifestSpan=compilerSpan==null?void 0:compilerSpan.traceChild('NextJsBuildManifest-generateClientManifest');return genClientManifestSpan==null?void 0:genClientManifestSpan.traceFn(()=>{const clientManifest={// TODO: update manifest type to include rewrites __rewrites:rewrites};const appDependencies=new Set(assetMap.pages['/_app']);const sortedPageKeys=(0,_utils.getSortedRoutes)(Object.keys(assetMap.pages));sortedPageKeys.forEach(page=>{const dependencies=assetMap.pages[page];if(page==='/_app')return;// Filter out dependencies in the _app entry, because those will have already // been loaded by the client prior to a navigation event const filteredDeps=dependencies.filter(dep=>!appDependencies.has(dep));// The manifest can omit the page if it has no requirements if(filteredDeps.length){clientManifest[page]=filteredDeps;}});// provide the sorted pages as an array so we don't rely on the object's keys // being in order and we don't slow down look-up time for page assets clientManifest.sortedPages=sortedPageKeys;return(0,_devalue.default)(clientManifest);});}function getEntrypointFiles(entrypoint){var _entrypoint$getFiles$;return(_entrypoint$getFiles$=entrypoint==null?void 0:entrypoint.getFiles().filter(file=>{// We don't want to include `.hot-update.js` files into the initial page return /(?<!\.hot-update)\.(js|css)($|\?)/.test(file);}).map(file=>file.replace(/\\/g,'/')))!=null?_entrypoint$getFiles$:[];}const processRoute=r=>{const rewrite={...r};// omit external rewrite destinations since these aren't // handled client-side if(!rewrite.destination.startsWith('/')){delete rewrite.destination;}return rewrite;};// This plugin creates a build-manifest.json for all assets that are being output // It has a mapping of "entry" filename to real filename. Because the real filename can be hashed in production class BuildManifestPlugin{constructor(options){this.buildId=void 0;this.rewrites=void 0;this.isDevFallback=void 0;this.buildId=options.buildId;this.isDevFallback=!!options.isDevFallback;this.rewrites={beforeFiles:[],afterFiles:[],fallback:[]};this.rewrites.beforeFiles=options.rewrites.beforeFiles.map(processRoute);this.rewrites.afterFiles=options.rewrites.afterFiles.map(processRoute);this.rewrites.fallback=options.rewrites.fallback.map(processRoute);}createAssets(compiler,compilation,assets){const compilerSpan=_profilingPlugin.spans.get(compiler);const createAssetsSpan=compilerSpan==null?void 0:compilerSpan.traceChild('NextJsBuildManifest-createassets');return createAssetsSpan==null?void 0:createAssetsSpan.traceFn(()=>{const entrypoints=compilation.entrypoints;const assetMap={polyfillFiles:[],devFiles:[],ampDevFiles:[],lowPriorityFiles:[],pages:{'/_app':[]},ampFirstPages:[]};const ampFirstEntryNames=_nextDropClientPagePlugin.ampFirstEntryNamesMap.get(compilation);if(ampFirstEntryNames){for(const entryName of ampFirstEntryNames){const pagePath=(0,_getRouteFromEntrypoint.default)(entryName);if(!pagePath){continue;}assetMap.ampFirstPages.push(pagePath);}}const mainFiles=new Set(getEntrypointFiles(entrypoints.get(_constants.CLIENT_STATIC_FILES_RUNTIME_MAIN)));assetMap.polyfillFiles=getEntrypointFiles(entrypoints.get(_constants.CLIENT_STATIC_FILES_RUNTIME_POLYFILLS)).filter(file=>!mainFiles.has(file));assetMap.devFiles=getEntrypointFiles(entrypoints.get(_constants.CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH)).filter(file=>!mainFiles.has(file));assetMap.ampDevFiles=getEntrypointFiles(entrypoints.get(_constants.CLIENT_STATIC_FILES_RUNTIME_AMP));const systemEntrypoints=new Set([_constants.CLIENT_STATIC_FILES_RUNTIME_MAIN,_constants.CLIENT_STATIC_FILES_RUNTIME_POLYFILLS,_constants.CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH,_constants.CLIENT_STATIC_FILES_RUNTIME_AMP]);for(const entrypoint of compilation.entrypoints.values()){if(systemEntrypoints.has(entrypoint.name))continue;const pagePath=(0,_getRouteFromEntrypoint.default)(entrypoint.name);if(!pagePath){continue;}const filesForPage=getEntrypointFiles(entrypoint);assetMap.pages[pagePath]=[...new Set([...mainFiles,...filesForPage])];}if(!this.isDevFallback){// Add the runtime build manifest file (generated later in this file) // as a dependency for the app. If the flag is false, the file won't be // downloaded by the client. assetMap.lowPriorityFiles.push(`${_constants.CLIENT_STATIC_FILES_PATH}/${this.buildId}/_buildManifest.js`);// Add the runtime ssg manifest file as a lazy-loaded file dependency. // We also stub this file out for development mode (when it is not // generated). const srcEmptySsgManifest=`self.__SSG_MANIFEST=new Set;self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()`;const ssgManifestPath=`${_constants.CLIENT_STATIC_FILES_PATH}/${this.buildId}/_ssgManifest.js`;assetMap.lowPriorityFiles.push(ssgManifestPath);assets[ssgManifestPath]=new _webpack.sources.RawSource(srcEmptySsgManifest);}assetMap.pages=Object.keys(assetMap.pages).sort()// eslint-disable-next-line .reduce((a,c)=>(a[c]=assetMap.pages[c],a),{});let buildManifestName=_constants.BUILD_MANIFEST;if(this.isDevFallback){buildManifestName=`fallback-${_constants.BUILD_MANIFEST}`;}assets[buildManifestName]=new _webpack.sources.RawSource(JSON.stringify(assetMap,null,2));if(!this.isDevFallback){const clientManifestPath=`${_constants.CLIENT_STATIC_FILES_PATH}/${this.buildId}/_buildManifest.js`;assets[clientManifestPath]=new _webpack.sources.RawSource(`self.__BUILD_MANIFEST = ${generateClientManifest(compiler,assetMap,this.rewrites)};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB()`);}return assets;});}apply(compiler){if(_webpack.isWebpack5){compiler.hooks.make.tap('NextJsBuildManifest',compilation=>{// @ts-ignore TODO: Remove ignore when webpack 5 is stable compilation.hooks.processAssets.tap({name:'NextJsBuildManifest',// @ts-ignore TODO: Remove ignore when webpack 5 is stable stage:_webpack.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS},assets=>{this.createAssets(compiler,compilation,assets);});});return;}compiler.hooks.emit.tap('NextJsBuildManifest',compilation=>{this.createAssets(compiler,compilation,compilation.assets);});}}exports.default=BuildManifestPlugin; //# sourceMappingURL=build-manifest-plugin.js.map