2415 lines
118 KiB
JavaScript
2415 lines
118 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
0 && (module.exports = {
|
|
getBabelConfigFile: null,
|
|
getDefineEnv: null,
|
|
attachReactRefresh: null,
|
|
NODE_RESOLVE_OPTIONS: null,
|
|
NODE_BASE_RESOLVE_OPTIONS: null,
|
|
NODE_ESM_RESOLVE_OPTIONS: null,
|
|
NODE_BASE_ESM_RESOLVE_OPTIONS: null,
|
|
nextImageLoaderRegex: null,
|
|
resolveExternal: null,
|
|
loadProjectInfo: null,
|
|
default: null
|
|
});
|
|
function _export(target, all) {
|
|
for(var name in all)Object.defineProperty(target, name, {
|
|
enumerable: true,
|
|
get: all[name]
|
|
});
|
|
}
|
|
_export(exports, {
|
|
getBabelConfigFile: function() {
|
|
return getBabelConfigFile;
|
|
},
|
|
getDefineEnv: function() {
|
|
return getDefineEnv;
|
|
},
|
|
attachReactRefresh: function() {
|
|
return attachReactRefresh;
|
|
},
|
|
NODE_RESOLVE_OPTIONS: function() {
|
|
return NODE_RESOLVE_OPTIONS;
|
|
},
|
|
NODE_BASE_RESOLVE_OPTIONS: function() {
|
|
return NODE_BASE_RESOLVE_OPTIONS;
|
|
},
|
|
NODE_ESM_RESOLVE_OPTIONS: function() {
|
|
return NODE_ESM_RESOLVE_OPTIONS;
|
|
},
|
|
NODE_BASE_ESM_RESOLVE_OPTIONS: function() {
|
|
return NODE_BASE_ESM_RESOLVE_OPTIONS;
|
|
},
|
|
nextImageLoaderRegex: function() {
|
|
return nextImageLoaderRegex;
|
|
},
|
|
resolveExternal: function() {
|
|
return resolveExternal;
|
|
},
|
|
loadProjectInfo: function() {
|
|
return loadProjectInfo;
|
|
},
|
|
default: function() {
|
|
return getBaseWebpackConfig;
|
|
}
|
|
});
|
|
const _react = /*#__PURE__*/ _interop_require_default(require("react"));
|
|
const _ReactRefreshWebpackPlugin = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/@next/react-refresh-utils/dist/ReactRefreshWebpackPlugin"));
|
|
const _chalk = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/chalk"));
|
|
const _crypto = /*#__PURE__*/ _interop_require_default(require("crypto"));
|
|
const _webpack = require("next/dist/compiled/webpack/webpack");
|
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
const _semver = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/semver"));
|
|
const _escaperegexp = require("../shared/lib/escape-regexp");
|
|
const _constants = require("../lib/constants");
|
|
const _fileexists = require("../lib/file-exists");
|
|
const _isedgeruntime = require("../lib/is-edge-runtime");
|
|
const _constants1 = require("../shared/lib/constants");
|
|
const _utils = require("../shared/lib/utils");
|
|
const _entries = require("./entries");
|
|
const _log = /*#__PURE__*/ _interop_require_wildcard(require("./output/log"));
|
|
const _config = require("./webpack/config");
|
|
const _middlewareplugin = /*#__PURE__*/ _interop_require_wildcard(require("./webpack/plugins/middleware-plugin"));
|
|
const _buildmanifestplugin = /*#__PURE__*/ _interop_require_default(require("./webpack/plugins/build-manifest-plugin"));
|
|
const _jsconfigpathsplugin = require("./webpack/plugins/jsconfig-paths-plugin");
|
|
const _nextdropclientpageplugin = require("./webpack/plugins/next-drop-client-page-plugin");
|
|
const _pagesmanifestplugin = /*#__PURE__*/ _interop_require_default(require("./webpack/plugins/pages-manifest-plugin"));
|
|
const _profilingplugin = require("./webpack/plugins/profiling-plugin");
|
|
const _reactloadableplugin = require("./webpack/plugins/react-loadable-plugin");
|
|
const _wellknownerrorsplugin = require("./webpack/plugins/wellknown-errors-plugin");
|
|
const _css = require("./webpack/config/blocks/css");
|
|
const _copyfileplugin = require("./webpack/plugins/copy-file-plugin");
|
|
const _flightmanifestplugin = require("./webpack/plugins/flight-manifest-plugin");
|
|
const _flightcliententryplugin = require("./webpack/plugins/flight-client-entry-plugin");
|
|
const _nexttypesplugin = require("./webpack/plugins/next-types-plugin");
|
|
const _loadjsconfig = /*#__PURE__*/ _interop_require_default(require("./load-jsconfig"));
|
|
const _swc = require("./swc");
|
|
const _appbuildmanifestplugin = require("./webpack/plugins/app-build-manifest-plugin");
|
|
const _subresourceintegrityplugin = require("./webpack/plugins/subresource-integrity-plugin");
|
|
const _nextfontmanifestplugin = require("./webpack/plugins/next-font-manifest-plugin");
|
|
const _utils1 = require("./utils");
|
|
function _interop_require_default(obj) {
|
|
return obj && obj.__esModule ? obj : {
|
|
default: obj
|
|
};
|
|
}
|
|
function _getRequireWildcardCache(nodeInterop) {
|
|
if (typeof WeakMap !== "function") return null;
|
|
var cacheBabelInterop = new WeakMap();
|
|
var cacheNodeInterop = new WeakMap();
|
|
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
})(nodeInterop);
|
|
}
|
|
function _interop_require_wildcard(obj, nodeInterop) {
|
|
if (!nodeInterop && obj && obj.__esModule) {
|
|
return obj;
|
|
}
|
|
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
return {
|
|
default: obj
|
|
};
|
|
}
|
|
var cache = _getRequireWildcardCache(nodeInterop);
|
|
if (cache && cache.has(obj)) {
|
|
return cache.get(obj);
|
|
}
|
|
var newObj = {};
|
|
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
for(var key in obj){
|
|
if (key !== "default" && 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;
|
|
}
|
|
const EXTERNAL_PACKAGES = require("../lib/server-external-packages.json");
|
|
const NEXT_PROJECT_ROOT = _path.default.join(__dirname, "..", "..");
|
|
const NEXT_PROJECT_ROOT_DIST = _path.default.join(NEXT_PROJECT_ROOT, "dist");
|
|
const NEXT_PROJECT_ROOT_DIST_CLIENT = _path.default.join(NEXT_PROJECT_ROOT_DIST, "client");
|
|
if (parseInt(_react.default.version) < 18) {
|
|
throw new Error("Next.js requires react >= 18.2.0 to be installed.");
|
|
}
|
|
const babelIncludeRegexes = [
|
|
/next[\\/]dist[\\/](esm[\\/])?shared[\\/]lib/,
|
|
/next[\\/]dist[\\/](esm[\\/])?client/,
|
|
/next[\\/]dist[\\/](esm[\\/])?pages/,
|
|
/[\\/](strip-ansi|ansi-regex|styled-jsx)[\\/]/
|
|
];
|
|
const reactPackagesRegex = /^(react|react-dom|react-server-dom-webpack)($|\/)/;
|
|
const asyncStoragesRegex = /next[\\/]dist[\\/](esm[\\/])?client[\\/]components[\\/](static-generation-async-storage|action-async-storage|request-async-storage)/;
|
|
// exports.<conditionName>
|
|
const edgeConditionNames = [
|
|
"edge-light",
|
|
"worker",
|
|
// inherits the default conditions
|
|
"..."
|
|
];
|
|
// packageJson.<mainField>
|
|
const mainFieldsPerCompiler = {
|
|
[_constants1.COMPILER_NAMES.server]: [
|
|
"main",
|
|
"module"
|
|
],
|
|
[_constants1.COMPILER_NAMES.client]: [
|
|
"browser",
|
|
"module",
|
|
"main"
|
|
],
|
|
[_constants1.COMPILER_NAMES.edgeServer]: [
|
|
"edge-light",
|
|
"worker",
|
|
// inherits the default conditions
|
|
"..."
|
|
]
|
|
};
|
|
const BABEL_CONFIG_FILES = [
|
|
".babelrc",
|
|
".babelrc.json",
|
|
".babelrc.js",
|
|
".babelrc.mjs",
|
|
".babelrc.cjs",
|
|
"babel.config.js",
|
|
"babel.config.json",
|
|
"babel.config.mjs",
|
|
"babel.config.cjs"
|
|
];
|
|
const getBabelConfigFile = async (dir)=>{
|
|
const babelConfigFile = await BABEL_CONFIG_FILES.reduce(async (memo, filename)=>{
|
|
const configFilePath = _path.default.join(dir, filename);
|
|
return await memo || (await (0, _fileexists.fileExists)(configFilePath) ? configFilePath : undefined);
|
|
}, Promise.resolve(undefined));
|
|
return babelConfigFile;
|
|
};
|
|
// Support for NODE_PATH
|
|
const nodePathList = (process.env.NODE_PATH || "").split(process.platform === "win32" ? ";" : ":").filter((p)=>!!p);
|
|
const watchOptions = Object.freeze({
|
|
aggregateTimeout: 5,
|
|
ignored: // Matches **/node_modules/**, **/.git/** and **/.next/**
|
|
/^((?:[^/]*(?:\/|$))*)(\.(git|next)|node_modules)(\/((?:[^/]*(?:\/|$))*)(?:$|\/))?/
|
|
});
|
|
function isModuleCSS(module1) {
|
|
return(// mini-css-extract-plugin
|
|
module1.type === `css/mini-extract` || // extract-css-chunks-webpack-plugin (old)
|
|
module1.type === `css/extract-chunks` || // extract-css-chunks-webpack-plugin (new)
|
|
module1.type === `css/extract-css-chunks`);
|
|
}
|
|
function errorIfEnvConflicted(config, key) {
|
|
const isPrivateKey = /^(?:NODE_.+)|^(?:__.+)$/i.test(key);
|
|
const hasNextRuntimeKey = key === "NEXT_RUNTIME";
|
|
if (isPrivateKey || hasNextRuntimeKey) {
|
|
throw new Error(`The key "${key}" under "env" in ${config.configFileName} is not allowed. https://nextjs.org/docs/messages/env-key-not-allowed`);
|
|
}
|
|
}
|
|
function isResourceInPackages(resource, packageNames, packageDirMapping) {
|
|
return packageNames == null ? void 0 : packageNames.some((p)=>packageDirMapping && packageDirMapping.has(p) ? resource.startsWith(packageDirMapping.get(p) + _path.default.sep) : resource.includes(_path.default.sep + _path.default.join("node_modules", p.replace(/\//g, _path.default.sep)) + _path.default.sep));
|
|
}
|
|
function getDefineEnv({ dev , config , distDir , isClient , hasRewrites , isNodeServer , isEdgeServer , middlewareMatchers , clientRouterFilters , previewModeId , fetchCacheKeyPrefix , allowedRevalidateHeaderKeys }) {
|
|
var _config_images, _config_images1, _config_i18n;
|
|
return {
|
|
// internal field to identify the plugin config
|
|
__NEXT_DEFINE_ENV: "true",
|
|
...Object.keys(process.env).reduce((prev, key)=>{
|
|
if (key.startsWith("NEXT_PUBLIC_")) {
|
|
prev[`process.env.${key}`] = JSON.stringify(process.env[key]);
|
|
}
|
|
return prev;
|
|
}, {}),
|
|
...Object.keys(config.env).reduce((acc, key)=>{
|
|
errorIfEnvConflicted(config, key);
|
|
return {
|
|
...acc,
|
|
[`process.env.${key}`]: JSON.stringify(config.env[key])
|
|
};
|
|
}, {}),
|
|
...!isEdgeServer ? {} : {
|
|
EdgeRuntime: JSON.stringify(/**
|
|
* Cloud providers can set this environment variable to allow users
|
|
* and library authors to have different implementations based on
|
|
* the runtime they are running with, if it's not using `edge-runtime`
|
|
*/ process.env.NEXT_EDGE_RUNTIME_PROVIDER || "edge-runtime")
|
|
},
|
|
"process.turbopack": JSON.stringify(false),
|
|
// TODO: enforce `NODE_ENV` on `process.env`, and add a test:
|
|
"process.env.NODE_ENV": JSON.stringify(dev ? "development" : "production"),
|
|
"process.env.NEXT_RUNTIME": JSON.stringify(isEdgeServer ? "edge" : isNodeServer ? "nodejs" : undefined),
|
|
"process.env.__NEXT_ACTIONS_DEPLOYMENT_ID": JSON.stringify(config.experimental.useDeploymentIdServerActions),
|
|
"process.env.NEXT_DEPLOYMENT_ID": JSON.stringify(config.experimental.deploymentId),
|
|
"process.env.__NEXT_FETCH_CACHE_KEY_PREFIX": JSON.stringify(fetchCacheKeyPrefix),
|
|
"process.env.__NEXT_PREVIEW_MODE_ID": JSON.stringify(previewModeId),
|
|
"process.env.__NEXT_ALLOWED_REVALIDATE_HEADERS": JSON.stringify(allowedRevalidateHeaderKeys),
|
|
"process.env.__NEXT_MIDDLEWARE_MATCHERS": JSON.stringify(middlewareMatchers || []),
|
|
"process.env.__NEXT_MANUAL_CLIENT_BASE_PATH": JSON.stringify(config.experimental.manualClientBasePath),
|
|
"process.env.__NEXT_NEW_LINK_BEHAVIOR": JSON.stringify(config.experimental.newNextLinkBehavior),
|
|
"process.env.__NEXT_CLIENT_ROUTER_FILTER_ENABLED": JSON.stringify(config.experimental.clientRouterFilter),
|
|
"process.env.__NEXT_CLIENT_ROUTER_S_FILTER": JSON.stringify(clientRouterFilters == null ? void 0 : clientRouterFilters.staticFilter),
|
|
"process.env.__NEXT_CLIENT_ROUTER_D_FILTER": JSON.stringify(clientRouterFilters == null ? void 0 : clientRouterFilters.dynamicFilter),
|
|
"process.env.__NEXT_OPTIMISTIC_CLIENT_CACHE": JSON.stringify(config.experimental.optimisticClientCache),
|
|
"process.env.__NEXT_MIDDLEWARE_PREFETCH": JSON.stringify(config.experimental.middlewarePrefetch),
|
|
"process.env.__NEXT_CROSS_ORIGIN": JSON.stringify(config.crossOrigin),
|
|
"process.browser": JSON.stringify(isClient),
|
|
"process.env.__NEXT_TEST_MODE": JSON.stringify(process.env.__NEXT_TEST_MODE),
|
|
// This is used in client/dev-error-overlay/hot-dev-client.js to replace the dist directory
|
|
...dev && (isClient || isEdgeServer) ? {
|
|
"process.env.__NEXT_DIST_DIR": JSON.stringify(distDir)
|
|
} : {},
|
|
"process.env.__NEXT_TRAILING_SLASH": JSON.stringify(config.trailingSlash),
|
|
"process.env.__NEXT_BUILD_INDICATOR": JSON.stringify(config.devIndicators.buildActivity),
|
|
"process.env.__NEXT_BUILD_INDICATOR_POSITION": JSON.stringify(config.devIndicators.buildActivityPosition),
|
|
"process.env.__NEXT_STRICT_MODE": JSON.stringify(config.reactStrictMode === null ? false : config.reactStrictMode),
|
|
"process.env.__NEXT_STRICT_MODE_APP": JSON.stringify(// When next.config.js does not have reactStrictMode enabling appDir will enable it.
|
|
config.reactStrictMode === null ? config.experimental.appDir ? true : false : config.reactStrictMode),
|
|
"process.env.__NEXT_OPTIMIZE_FONTS": JSON.stringify(!dev && config.optimizeFonts),
|
|
"process.env.__NEXT_OPTIMIZE_CSS": JSON.stringify(config.experimental.optimizeCss && !dev),
|
|
"process.env.__NEXT_SCRIPT_WORKERS": JSON.stringify(config.experimental.nextScriptWorkers && !dev),
|
|
"process.env.__NEXT_SCROLL_RESTORATION": JSON.stringify(config.experimental.scrollRestoration),
|
|
"process.env.__NEXT_IMAGE_OPTS": JSON.stringify({
|
|
deviceSizes: config.images.deviceSizes,
|
|
imageSizes: config.images.imageSizes,
|
|
path: config.images.path,
|
|
loader: config.images.loader,
|
|
dangerouslyAllowSVG: config.images.dangerouslyAllowSVG,
|
|
unoptimized: config == null ? void 0 : (_config_images = config.images) == null ? void 0 : _config_images.unoptimized,
|
|
...dev ? {
|
|
// pass domains in development to allow validating on the client
|
|
domains: config.images.domains,
|
|
remotePatterns: (_config_images1 = config.images) == null ? void 0 : _config_images1.remotePatterns,
|
|
output: config.output
|
|
} : {}
|
|
}),
|
|
"process.env.__NEXT_ROUTER_BASEPATH": JSON.stringify(config.basePath),
|
|
"process.env.__NEXT_STRICT_NEXT_HEAD": JSON.stringify(config.experimental.strictNextHead),
|
|
"process.env.__NEXT_HAS_REWRITES": JSON.stringify(hasRewrites),
|
|
"process.env.__NEXT_CONFIG_OUTPUT": JSON.stringify(config.output),
|
|
"process.env.__NEXT_I18N_SUPPORT": JSON.stringify(!!config.i18n),
|
|
"process.env.__NEXT_I18N_DOMAINS": JSON.stringify((_config_i18n = config.i18n) == null ? void 0 : _config_i18n.domains),
|
|
"process.env.__NEXT_ANALYTICS_ID": JSON.stringify(config.analyticsId),
|
|
"process.env.__NEXT_NO_MIDDLEWARE_URL_NORMALIZE": JSON.stringify(config.skipMiddlewareUrlNormalize),
|
|
"process.env.__NEXT_EXTERNAL_MIDDLEWARE_REWRITE_RESOLVE": JSON.stringify(config.experimental.externalMiddlewareRewritesResolve),
|
|
"process.env.__NEXT_MANUAL_TRAILING_SLASH": JSON.stringify(config.skipTrailingSlashRedirect),
|
|
"process.env.__NEXT_HAS_WEB_VITALS_ATTRIBUTION": JSON.stringify(config.experimental.webVitalsAttribution && config.experimental.webVitalsAttribution.length > 0),
|
|
"process.env.__NEXT_WEB_VITALS_ATTRIBUTION": JSON.stringify(config.experimental.webVitalsAttribution),
|
|
...isNodeServer || isEdgeServer ? {
|
|
// Fix bad-actors in the npm ecosystem (e.g. `node-formidable`)
|
|
// This is typically found in unmaintained modules from the
|
|
// pre-webpack era (common in server-side code)
|
|
"global.GENTLY": JSON.stringify(false)
|
|
} : undefined,
|
|
// stub process.env with proxy to warn a missing value is
|
|
// being accessed in development mode
|
|
...config.experimental.pageEnv && dev ? {
|
|
"process.env": `
|
|
new Proxy(${isNodeServer ? "process.env" : "{}"}, {
|
|
get(target, prop) {
|
|
if (typeof target[prop] === 'undefined') {
|
|
console.warn(\`An environment variable (\${prop}) that was not provided in the environment was accessed.\nSee more info here: https://nextjs.org/docs/messages/missing-env-value\`)
|
|
}
|
|
return target[prop]
|
|
}
|
|
})
|
|
`
|
|
} : {}
|
|
};
|
|
}
|
|
function getReactProfilingInProduction() {
|
|
return {
|
|
"react-dom$": "react-dom/profiling",
|
|
"scheduler/tracing": "scheduler/tracing-profiling"
|
|
};
|
|
}
|
|
function createRSCAliases(bundledReactChannel, opts) {
|
|
const alias = {
|
|
react$: `next/dist/compiled/react${bundledReactChannel}`,
|
|
"react-dom$": `next/dist/compiled/react-dom${bundledReactChannel}`,
|
|
"react/jsx-runtime$": `next/dist/compiled/react${bundledReactChannel}/jsx-runtime`,
|
|
"react/jsx-dev-runtime$": `next/dist/compiled/react${bundledReactChannel}/jsx-dev-runtime`,
|
|
"react-dom/client$": `next/dist/compiled/react-dom${bundledReactChannel}/client`,
|
|
"react-dom/server$": `next/dist/compiled/react-dom${bundledReactChannel}/server`,
|
|
"react-dom/server.edge$": `next/dist/compiled/react-dom${bundledReactChannel}/server.edge`,
|
|
"react-dom/server.browser$": `next/dist/compiled/react-dom${bundledReactChannel}/server.browser`,
|
|
"react-server-dom-webpack/client$": `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client`,
|
|
"react-server-dom-webpack/client.edge$": `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client.edge`,
|
|
"react-server-dom-webpack/server.edge$": `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.edge`,
|
|
"react-server-dom-webpack/server.node$": `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.node`
|
|
};
|
|
if (opts.reactSharedSubset) {
|
|
alias["react$"] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset`;
|
|
}
|
|
// Use server rendering stub for RSC
|
|
// x-ref: https://github.com/facebook/react/pull/25436
|
|
if (opts.reactDomServerRenderingStub) {
|
|
alias["react-dom$"] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub`;
|
|
}
|
|
// Alias `server-only` and `client-only` modules to their server/client only, vendored versions.
|
|
// These aliases are necessary if the user doesn't have those two packages installed manually.
|
|
if (typeof opts.reactServerCondition !== "undefined") {
|
|
if (opts.reactServerCondition) {
|
|
// Alias to the `react-server` exports.
|
|
alias["server-only$"] = "next/dist/compiled/server-only/empty";
|
|
alias["client-only$"] = "next/dist/compiled/client-only/error";
|
|
} else {
|
|
alias["server-only$"] = "next/dist/compiled/server-only/index";
|
|
alias["client-only$"] = "next/dist/compiled/client-only/index";
|
|
}
|
|
}
|
|
if (opts.reactProductionProfiling) {
|
|
alias["react-dom$"] = `next/dist/compiled/react-dom${bundledReactChannel}/profiling`;
|
|
alias["scheduler/tracing"] = `next/dist/compiled/scheduler${bundledReactChannel}/tracing-profiling`;
|
|
}
|
|
return alias;
|
|
}
|
|
const devtoolRevertWarning = (0, _utils.execOnce)((devtool)=>{
|
|
console.warn(_chalk.default.yellow.bold("Warning: ") + _chalk.default.bold(`Reverting webpack devtool to '${devtool}'.\n`) + "Changing the webpack devtool in development mode will cause severe performance regressions.\n" + "Read more: https://nextjs.org/docs/messages/improper-devtool");
|
|
});
|
|
let loggedSwcDisabled = false;
|
|
let loggedIgnoredCompilerOptions = false;
|
|
function getOptimizedAliases() {
|
|
const stubWindowFetch = _path.default.join(__dirname, "polyfills", "fetch", "index.js");
|
|
const stubObjectAssign = _path.default.join(__dirname, "polyfills", "object-assign.js");
|
|
const shimAssign = _path.default.join(__dirname, "polyfills", "object.assign");
|
|
return Object.assign({}, {
|
|
unfetch$: stubWindowFetch,
|
|
"isomorphic-unfetch$": stubWindowFetch,
|
|
"whatwg-fetch$": _path.default.join(__dirname, "polyfills", "fetch", "whatwg-fetch.js")
|
|
}, {
|
|
"object-assign$": stubObjectAssign,
|
|
// Stub Package: object.assign
|
|
"object.assign/auto": _path.default.join(shimAssign, "auto.js"),
|
|
"object.assign/implementation": _path.default.join(shimAssign, "implementation.js"),
|
|
"object.assign$": _path.default.join(shimAssign, "index.js"),
|
|
"object.assign/polyfill": _path.default.join(shimAssign, "polyfill.js"),
|
|
"object.assign/shim": _path.default.join(shimAssign, "shim.js"),
|
|
// Replace: full URL polyfill with platform-based polyfill
|
|
url: require.resolve("next/dist/compiled/native-url")
|
|
});
|
|
}
|
|
function attachReactRefresh(webpackConfig, targetLoader) {
|
|
var _webpackConfig_module, _webpackConfig_module_rules;
|
|
let injections = 0;
|
|
const reactRefreshLoaderName = "next/dist/compiled/@next/react-refresh-utils/dist/loader";
|
|
const reactRefreshLoader = require.resolve(reactRefreshLoaderName);
|
|
(_webpackConfig_module = webpackConfig.module) == null ? void 0 : (_webpackConfig_module_rules = _webpackConfig_module.rules) == null ? void 0 : _webpackConfig_module_rules.forEach((rule)=>{
|
|
if (rule && typeof rule === "object" && "use" in rule) {
|
|
const curr = rule.use;
|
|
// When the user has configured `defaultLoaders.babel` for a input file:
|
|
if (curr === targetLoader) {
|
|
++injections;
|
|
rule.use = [
|
|
reactRefreshLoader,
|
|
curr
|
|
];
|
|
} else if (Array.isArray(curr) && curr.some((r)=>r === targetLoader) && // Check if loader already exists:
|
|
!curr.some((r)=>r === reactRefreshLoader || r === reactRefreshLoaderName)) {
|
|
++injections;
|
|
const idx = curr.findIndex((r)=>r === targetLoader);
|
|
// Clone to not mutate user input
|
|
rule.use = [
|
|
...curr
|
|
];
|
|
// inject / input: [other, babel] output: [other, refresh, babel]:
|
|
rule.use.splice(idx, 0, reactRefreshLoader);
|
|
}
|
|
}
|
|
});
|
|
if (injections) {
|
|
_log.info(`automatically enabled Fast Refresh for ${injections} custom loader${injections > 1 ? "s" : ""}`);
|
|
}
|
|
}
|
|
const NODE_RESOLVE_OPTIONS = {
|
|
dependencyType: "commonjs",
|
|
modules: [
|
|
"node_modules"
|
|
],
|
|
fallback: false,
|
|
exportsFields: [
|
|
"exports"
|
|
],
|
|
importsFields: [
|
|
"imports"
|
|
],
|
|
conditionNames: [
|
|
"node",
|
|
"require"
|
|
],
|
|
descriptionFiles: [
|
|
"package.json"
|
|
],
|
|
extensions: [
|
|
".js",
|
|
".json",
|
|
".node"
|
|
],
|
|
enforceExtensions: false,
|
|
symlinks: true,
|
|
mainFields: [
|
|
"main"
|
|
],
|
|
mainFiles: [
|
|
"index"
|
|
],
|
|
roots: [],
|
|
fullySpecified: false,
|
|
preferRelative: false,
|
|
preferAbsolute: false,
|
|
restrictions: []
|
|
};
|
|
const NODE_BASE_RESOLVE_OPTIONS = {
|
|
...NODE_RESOLVE_OPTIONS,
|
|
alias: false
|
|
};
|
|
const NODE_ESM_RESOLVE_OPTIONS = {
|
|
...NODE_RESOLVE_OPTIONS,
|
|
alias: false,
|
|
dependencyType: "esm",
|
|
conditionNames: [
|
|
"node",
|
|
"import"
|
|
],
|
|
fullySpecified: true
|
|
};
|
|
const NODE_BASE_ESM_RESOLVE_OPTIONS = {
|
|
...NODE_ESM_RESOLVE_OPTIONS,
|
|
alias: false
|
|
};
|
|
const nextImageLoaderRegex = /\.(png|jpg|jpeg|gif|webp|avif|ico|bmp|svg)$/i;
|
|
async function resolveExternal(dir, esmExternalsConfig, context, request, isEsmRequested, hasAppDir, getResolve, isLocalCallback, baseResolveCheck = true, esmResolveOptions = NODE_ESM_RESOLVE_OPTIONS, nodeResolveOptions = NODE_RESOLVE_OPTIONS, baseEsmResolveOptions = NODE_BASE_ESM_RESOLVE_OPTIONS, baseResolveOptions = NODE_BASE_RESOLVE_OPTIONS) {
|
|
const esmExternals = !!esmExternalsConfig;
|
|
const looseEsmExternals = esmExternalsConfig === "loose";
|
|
let res = null;
|
|
let isEsm = false;
|
|
let preferEsmOptions = esmExternals && isEsmRequested ? [
|
|
true,
|
|
false
|
|
] : [
|
|
false
|
|
];
|
|
// Disable esm resolving for app/ and pages/ so for esm package using under pages/
|
|
// won't load react through esm loader
|
|
if (hasAppDir) {
|
|
preferEsmOptions = [
|
|
false
|
|
];
|
|
}
|
|
for (const preferEsm of preferEsmOptions){
|
|
const resolve = getResolve(preferEsm ? esmResolveOptions : nodeResolveOptions);
|
|
// Resolve the import with the webpack provided context, this
|
|
// ensures we're resolving the correct version when multiple
|
|
// exist.
|
|
try {
|
|
[res, isEsm] = await resolve(context, request);
|
|
} catch (err) {
|
|
res = null;
|
|
}
|
|
if (!res) {
|
|
continue;
|
|
}
|
|
// ESM externals can only be imported (and not required).
|
|
// Make an exception in loose mode.
|
|
if (!isEsmRequested && isEsm && !looseEsmExternals) {
|
|
continue;
|
|
}
|
|
if (isLocalCallback) {
|
|
return {
|
|
localRes: isLocalCallback(res)
|
|
};
|
|
}
|
|
// Bundled Node.js code is relocated without its node_modules tree.
|
|
// This means we need to make sure its request resolves to the same
|
|
// package that'll be available at runtime. If it's not identical,
|
|
// we need to bundle the code (even if it _should_ be external).
|
|
if (baseResolveCheck) {
|
|
let baseRes;
|
|
let baseIsEsm;
|
|
try {
|
|
const baseResolve = getResolve(isEsm ? baseEsmResolveOptions : baseResolveOptions);
|
|
[baseRes, baseIsEsm] = await baseResolve(dir, request);
|
|
} catch (err) {
|
|
baseRes = null;
|
|
baseIsEsm = false;
|
|
}
|
|
// Same as above: if the package, when required from the root,
|
|
// would be different from what the real resolution would use, we
|
|
// cannot externalize it.
|
|
// if request is pointing to a symlink it could point to the the same file,
|
|
// the resolver will resolve symlinks so this is handled
|
|
if (baseRes !== res || isEsm !== baseIsEsm) {
|
|
res = null;
|
|
continue;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return {
|
|
res,
|
|
isEsm
|
|
};
|
|
}
|
|
async function loadProjectInfo({ dir , config , dev }) {
|
|
const { jsConfig , resolvedBaseUrl } = await (0, _loadjsconfig.default)(dir, config);
|
|
const supportedBrowsers = await (0, _utils1.getSupportedBrowsers)(dir, dev, config);
|
|
return {
|
|
jsConfig,
|
|
resolvedBaseUrl,
|
|
supportedBrowsers
|
|
};
|
|
}
|
|
async function getBaseWebpackConfig(dir, { buildId , config , compilerType , dev =false , entrypoints , isDevFallback =false , pagesDir , reactProductionProfiling =false , rewrites , originalRewrites , originalRedirects , runWebpackSpan , appDir , middlewareMatchers , noMangling =false , jsConfig , resolvedBaseUrl , supportedBrowsers , clientRouterFilters , previewModeId , fetchCacheKeyPrefix , allowedRevalidateHeaderKeys }) {
|
|
var _config_experimental, _config_experimental_sri, _config_experimental_sri1, _config_compiler, _config_compiler1, _config_compiler2, _jsConfig_compilerOptions, _config_compiler3, _jsConfig_compilerOptions1, _config_compiler4, // allows add JsConfigPathsPlugin to allow hot-reloading
|
|
// if the config is added/removed
|
|
_webpackConfig_resolve, _webpackConfig_resolve_plugins, _jsConfig_compilerOptions2, _config_compiler5, _config_compiler6, _config_compiler7, _config_compiler8, _config_compiler9, _config_experimental1, _webpackConfig_module, _webpackConfig_module1, _webpackConfig_module_rules;
|
|
const isClient = compilerType === _constants1.COMPILER_NAMES.client;
|
|
const isEdgeServer = compilerType === _constants1.COMPILER_NAMES.edgeServer;
|
|
const isNodeServer = compilerType === _constants1.COMPILER_NAMES.server;
|
|
const hasRewrites = rewrites.beforeFiles.length > 0 || rewrites.afterFiles.length > 0 || rewrites.fallback.length > 0;
|
|
const hasAppDir = !!config.experimental.appDir && !!appDir;
|
|
const hasServerComponents = hasAppDir;
|
|
const disableOptimizedLoading = true;
|
|
const enableTypedRoutes = !!config.experimental.typedRoutes && hasAppDir;
|
|
const useServerActions = !!config.experimental.serverActions && hasAppDir;
|
|
const bundledReactChannel = useServerActions ? "-experimental" : "";
|
|
if (isClient) {
|
|
if (// @ts-expect-error: experimental.runtime is deprecated
|
|
(0, _isedgeruntime.isEdgeRuntime)(config.experimental.runtime)) {
|
|
_log.warn("You are using `experimental.runtime` which was removed. Check https://nextjs.org/docs/api-routes/edge-api-routes on how to use edge runtime.");
|
|
}
|
|
}
|
|
const babelConfigFile = await getBabelConfigFile(dir);
|
|
const distDir = _path.default.join(dir, config.distDir);
|
|
let useSWCLoader = !babelConfigFile || config.experimental.forceSwcTransforms;
|
|
let SWCBinaryTarget = undefined;
|
|
if (useSWCLoader) {
|
|
var _require, _require_getBinaryMetadata;
|
|
// TODO: we do not collect wasm target yet
|
|
const binaryTarget = (_require = require("./swc")) == null ? void 0 : _require.getBinaryMetadata == null ? void 0 : (_require_getBinaryMetadata = _require.getBinaryMetadata()) == null ? void 0 : _require_getBinaryMetadata.target;
|
|
SWCBinaryTarget = binaryTarget ? [
|
|
`swc/target/${binaryTarget}`,
|
|
true
|
|
] : undefined;
|
|
}
|
|
if (!loggedSwcDisabled && !useSWCLoader && babelConfigFile) {
|
|
_log.info(`Disabled SWC as replacement for Babel because of custom Babel configuration "${_path.default.relative(dir, babelConfigFile)}" https://nextjs.org/docs/messages/swc-disabled`);
|
|
loggedSwcDisabled = true;
|
|
}
|
|
// eagerly load swc bindings instead of waiting for transform calls
|
|
if (!babelConfigFile && isClient) {
|
|
await (0, _swc.loadBindings)();
|
|
}
|
|
if (!loggedIgnoredCompilerOptions && !useSWCLoader && config.compiler) {
|
|
_log.info("`compiler` options in `next.config.js` will be ignored while using Babel https://nextjs.org/docs/messages/ignored-compiler-options");
|
|
loggedIgnoredCompilerOptions = true;
|
|
}
|
|
const getBabelLoader = ()=>{
|
|
return {
|
|
loader: require.resolve("./babel/loader/index"),
|
|
options: {
|
|
configFile: babelConfigFile,
|
|
isServer: isNodeServer || isEdgeServer,
|
|
distDir,
|
|
pagesDir,
|
|
cwd: dir,
|
|
development: dev,
|
|
hasServerComponents,
|
|
hasReactRefresh: dev && isClient,
|
|
hasJsxRuntime: true
|
|
}
|
|
};
|
|
};
|
|
let swcTraceProfilingInitialized = false;
|
|
const getSwcLoader = (extraOptions)=>{
|
|
var _config_experimental;
|
|
if ((config == null ? void 0 : (_config_experimental = config.experimental) == null ? void 0 : _config_experimental.swcTraceProfiling) && !swcTraceProfilingInitialized) {
|
|
var _require;
|
|
// This will init subscribers once only in a single process lifecycle,
|
|
// even though it can be called multiple times.
|
|
// Subscriber need to be initialized _before_ any actual swc's call (transform, etcs)
|
|
// to collect correct trace spans when they are called.
|
|
swcTraceProfilingInitialized = true;
|
|
(_require = require("./swc")) == null ? void 0 : _require.initCustomTraceSubscriber == null ? void 0 : _require.initCustomTraceSubscriber(_path.default.join(distDir, `swc-trace-profile-${Date.now()}.json`));
|
|
}
|
|
return {
|
|
loader: "next-swc-loader",
|
|
options: {
|
|
isServer: isNodeServer || isEdgeServer,
|
|
rootDir: dir,
|
|
pagesDir,
|
|
appDir,
|
|
hasReactRefresh: dev && isClient,
|
|
hasServerComponents: true,
|
|
fileReading: config.experimental.swcFileReading,
|
|
nextConfig: config,
|
|
jsConfig,
|
|
supportedBrowsers,
|
|
swcCacheDir: _path.default.join(dir, (config == null ? void 0 : config.distDir) ?? ".next", "cache", "swc"),
|
|
...extraOptions
|
|
}
|
|
};
|
|
};
|
|
const defaultLoaders = {
|
|
babel: useSWCLoader ? getSwcLoader() : getBabelLoader()
|
|
};
|
|
const swcLoaderForServerLayer = hasServerComponents ? useSWCLoader ? [
|
|
getSwcLoader({
|
|
isServerLayer: true
|
|
})
|
|
] : // as an additional pass to handle RSC correctly.
|
|
// This will cause some performance overhead but
|
|
// acceptable as Babel will not be recommended.
|
|
[
|
|
getSwcLoader({
|
|
isServerLayer: true
|
|
}),
|
|
getBabelLoader()
|
|
] : [];
|
|
const swcLoaderForClientLayer = hasServerComponents ? useSWCLoader ? [
|
|
getSwcLoader({
|
|
hasServerComponents,
|
|
isServerLayer: false
|
|
})
|
|
] : // as an additional pass to handle RSC correctly.
|
|
// This will cause some performance overhead but
|
|
// acceptable as Babel will not be recommended.
|
|
[
|
|
getSwcLoader({
|
|
isServerLayer: false
|
|
}),
|
|
getBabelLoader()
|
|
] : [];
|
|
const swcLoaderForMiddlewareLayer = useSWCLoader ? getSwcLoader({
|
|
hasServerComponents: false
|
|
}) : // for middleware to tree shake the unused default optimized imports like "next/server".
|
|
// This will cause some performance overhead but
|
|
// acceptable as Babel will not be recommended.
|
|
[
|
|
getSwcLoader({
|
|
hasServerComponents: false
|
|
}),
|
|
getBabelLoader()
|
|
];
|
|
// Loader for API routes needs to be differently configured as it shouldn't
|
|
// have RSC transpiler enabled, so syntax checks such as invalid imports won't
|
|
// be performed.
|
|
const loaderForAPIRoutes = hasServerComponents && useSWCLoader ? {
|
|
loader: "next-swc-loader",
|
|
options: {
|
|
...getSwcLoader().options,
|
|
hasServerComponents: false
|
|
}
|
|
} : defaultLoaders.babel;
|
|
const pageExtensions = config.pageExtensions;
|
|
const outputPath = isNodeServer || isEdgeServer ? _path.default.join(distDir, _constants1.SERVER_DIRECTORY) : distDir;
|
|
const reactServerCondition = [
|
|
"react-server",
|
|
...isEdgeServer ? edgeConditionNames : [],
|
|
// inherits the default conditions
|
|
"..."
|
|
];
|
|
const clientEntries = isClient ? {
|
|
// Backwards compatibility
|
|
"main.js": [],
|
|
...dev ? {
|
|
[_constants1.CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH]: require.resolve(`next/dist/compiled/@next/react-refresh-utils/dist/runtime`),
|
|
[_constants1.CLIENT_STATIC_FILES_RUNTIME_AMP]: `./` + _path.default.relative(dir, _path.default.join(NEXT_PROJECT_ROOT_DIST_CLIENT, "dev", "amp-dev")).replace(/\\/g, "/")
|
|
} : {},
|
|
[_constants1.CLIENT_STATIC_FILES_RUNTIME_MAIN]: `./` + _path.default.relative(dir, _path.default.join(NEXT_PROJECT_ROOT_DIST_CLIENT, dev ? `next-dev.js` : "next.js")).replace(/\\/g, "/"),
|
|
...hasAppDir ? {
|
|
[_constants1.CLIENT_STATIC_FILES_RUNTIME_MAIN_APP]: dev ? [
|
|
require.resolve(`next/dist/compiled/@next/react-refresh-utils/dist/runtime`),
|
|
`./` + _path.default.relative(dir, _path.default.join(NEXT_PROJECT_ROOT_DIST_CLIENT, "app-next-dev.js")).replace(/\\/g, "/")
|
|
] : [
|
|
`./` + _path.default.relative(dir, _path.default.join(NEXT_PROJECT_ROOT_DIST_CLIENT, "app-next.js")).replace(/\\/g, "/")
|
|
]
|
|
} : {}
|
|
} : undefined;
|
|
// tell webpack where to look for _app and _document
|
|
// using aliases to allow falling back to the default
|
|
// version when removed or not present
|
|
const clientResolveRewrites = require.resolve("../shared/lib/router/utils/resolve-rewrites");
|
|
const customAppAliases = {};
|
|
const customErrorAlias = {};
|
|
const customDocumentAliases = {};
|
|
const customRootAliases = {};
|
|
if (dev) {
|
|
const nextDist = "next/dist/" + (isEdgeServer ? "esm/" : "");
|
|
customAppAliases[`${_constants.PAGES_DIR_ALIAS}/_app`] = [
|
|
...pagesDir ? pageExtensions.reduce((prev, ext)=>{
|
|
prev.push(_path.default.join(pagesDir, `_app.${ext}`));
|
|
return prev;
|
|
}, []) : [],
|
|
`${nextDist}pages/_app.js`
|
|
];
|
|
customAppAliases[`${_constants.PAGES_DIR_ALIAS}/_error`] = [
|
|
...pagesDir ? pageExtensions.reduce((prev, ext)=>{
|
|
prev.push(_path.default.join(pagesDir, `_error.${ext}`));
|
|
return prev;
|
|
}, []) : [],
|
|
`${nextDist}pages/_error.js`
|
|
];
|
|
customDocumentAliases[`${_constants.PAGES_DIR_ALIAS}/_document`] = [
|
|
...pagesDir ? pageExtensions.reduce((prev, ext)=>{
|
|
prev.push(_path.default.join(pagesDir, `_document.${ext}`));
|
|
return prev;
|
|
}, []) : [],
|
|
`${nextDist}pages/_document.js`
|
|
];
|
|
}
|
|
let hasExternalOtelApiPackage = false;
|
|
try {
|
|
const opentelemetryPackageJson = require("@opentelemetry/api/package.json");
|
|
if (opentelemetryPackageJson.version) {
|
|
// 0.19.0 is the first version of the package that has the `tracer.getSpan` API that we need:
|
|
// https://github.com/vercel/next.js/issues/48118
|
|
if (_semver.default.gte(opentelemetryPackageJson.version, "0.19.0")) {
|
|
hasExternalOtelApiPackage = true;
|
|
} else {
|
|
throw new Error(`Installed "@opentelemetry/api" with version ${opentelemetryPackageJson.version} is not supported by Next.js. Please upgrade to 0.19.0 or newer version.`);
|
|
}
|
|
}
|
|
} catch {}
|
|
const resolveConfig = {
|
|
// Disable .mjs for node_modules bundling
|
|
extensions: isNodeServer ? [
|
|
".js",
|
|
".mjs",
|
|
".tsx",
|
|
".ts",
|
|
".jsx",
|
|
".json",
|
|
".wasm"
|
|
] : [
|
|
".mjs",
|
|
".js",
|
|
".tsx",
|
|
".ts",
|
|
".jsx",
|
|
".json",
|
|
".wasm"
|
|
],
|
|
extensionAlias: config.experimental.extensionAlias,
|
|
modules: [
|
|
"node_modules",
|
|
...nodePathList
|
|
],
|
|
alias: {
|
|
// Alias 3rd party @vercel/og package to vendored og image package to reduce bundle size
|
|
"@vercel/og": "next/dist/server/web/spec-extension/image-response",
|
|
// Alias next/dist imports to next/dist/esm assets,
|
|
// let this alias hit before `next` alias.
|
|
...isEdgeServer ? {
|
|
"next/dist/client": "next/dist/esm/client",
|
|
"next/dist/shared": "next/dist/esm/shared",
|
|
"next/dist/pages": "next/dist/esm/pages",
|
|
"next/dist/lib": "next/dist/esm/lib",
|
|
"next/dist/server": "next/dist/esm/server",
|
|
// Alias the usage of next public APIs
|
|
[`${NEXT_PROJECT_ROOT}/server`]: "next/dist/esm/server/web/exports/index",
|
|
[`${NEXT_PROJECT_ROOT}/dist/client/link`]: "next/dist/esm/client/link",
|
|
[`${NEXT_PROJECT_ROOT}/dist/shared/lib/image-external`]: "next/dist/esm/shared/lib/image-external",
|
|
[`${NEXT_PROJECT_ROOT}/dist/client/script`]: "next/dist/esm/client/script",
|
|
[`${NEXT_PROJECT_ROOT}/dist/client/router`]: "next/dist/esm/client/router",
|
|
[`${NEXT_PROJECT_ROOT}/dist/shared/lib/head`]: "next/dist/esm/shared/lib/head",
|
|
[`${NEXT_PROJECT_ROOT}/dist/shared/lib/dynamic`]: "next/dist/esm/shared/lib/dynamic",
|
|
[`${NEXT_PROJECT_ROOT}/dist/pages/_document`]: "next/dist/esm/pages/_document",
|
|
[`${NEXT_PROJECT_ROOT}/dist/pages/_app`]: "next/dist/esm/pages/_app",
|
|
[`${NEXT_PROJECT_ROOT}/dist/client/components/navigation`]: "next/dist/esm/client/components/navigation",
|
|
[`${NEXT_PROJECT_ROOT}/dist/client/components/headers`]: "next/dist/esm/client/components/headers"
|
|
} : undefined,
|
|
// For RSC server bundle
|
|
...!hasExternalOtelApiPackage && {
|
|
"@opentelemetry/api": "next/dist/compiled/@opentelemetry/api"
|
|
},
|
|
...config.images.loaderFile ? {
|
|
"next/dist/shared/lib/image-loader": config.images.loaderFile,
|
|
...isEdgeServer && {
|
|
"next/dist/esm/shared/lib/image-loader": config.images.loaderFile
|
|
}
|
|
} : undefined,
|
|
next: NEXT_PROJECT_ROOT,
|
|
"styled-jsx/style$": require.resolve(`styled-jsx/style`),
|
|
"styled-jsx$": require.resolve(`styled-jsx`),
|
|
...customAppAliases,
|
|
...customErrorAlias,
|
|
...customDocumentAliases,
|
|
...customRootAliases,
|
|
...pagesDir ? {
|
|
[_constants.PAGES_DIR_ALIAS]: pagesDir
|
|
} : {},
|
|
...appDir ? {
|
|
[_constants.APP_DIR_ALIAS]: appDir
|
|
} : {},
|
|
[_constants.ROOT_DIR_ALIAS]: dir,
|
|
[_constants.DOT_NEXT_ALIAS]: distDir,
|
|
...isClient || isEdgeServer ? getOptimizedAliases() : {},
|
|
...reactProductionProfiling ? getReactProfilingInProduction() : {},
|
|
[_constants.RSC_ACTION_VALIDATE_ALIAS]: "next/dist/build/webpack/loaders/next-flight-loader/action-validate",
|
|
[_constants.RSC_ACTION_CLIENT_WRAPPER_ALIAS]: "next/dist/build/webpack/loaders/next-flight-loader/action-client-wrapper",
|
|
[_constants.RSC_ACTION_PROXY_ALIAS]: "next/dist/build/webpack/loaders/next-flight-loader/action-proxy",
|
|
...isClient || isEdgeServer ? {
|
|
[clientResolveRewrites]: hasRewrites ? clientResolveRewrites : false
|
|
} : {},
|
|
"@swc/helpers/_": _path.default.join(_path.default.dirname(require.resolve("@swc/helpers/package.json")), "_"),
|
|
setimmediate: "next/dist/compiled/setimmediate"
|
|
},
|
|
...isClient || isEdgeServer ? {
|
|
fallback: {
|
|
process: require.resolve("./polyfills/process")
|
|
}
|
|
} : undefined,
|
|
mainFields: mainFieldsPerCompiler[compilerType],
|
|
...isEdgeServer && {
|
|
conditionNames: edgeConditionNames
|
|
},
|
|
plugins: []
|
|
};
|
|
const terserOptions = {
|
|
parse: {
|
|
ecma: 8
|
|
},
|
|
compress: {
|
|
ecma: 5,
|
|
warnings: false,
|
|
// The following two options are known to break valid JavaScript code
|
|
comparisons: false,
|
|
inline: 2
|
|
},
|
|
mangle: {
|
|
safari10: true,
|
|
...process.env.__NEXT_MANGLING_DEBUG || noMangling ? {
|
|
toplevel: true,
|
|
module: true,
|
|
keep_classnames: true,
|
|
keep_fnames: true
|
|
} : {}
|
|
},
|
|
output: {
|
|
ecma: 5,
|
|
safari10: true,
|
|
comments: false,
|
|
// Fixes usage of Emoji and certain Regex
|
|
ascii_only: true,
|
|
...process.env.__NEXT_MANGLING_DEBUG || noMangling ? {
|
|
beautify: true
|
|
} : {}
|
|
}
|
|
};
|
|
// Packages which will be split into the 'framework' chunk.
|
|
// Only top-level packages are included, e.g. nested copies like
|
|
// 'node_modules/meow/node_modules/object-assign' are not included.
|
|
const topLevelFrameworkPaths = [];
|
|
const visitedFrameworkPackages = new Set();
|
|
// Adds package-paths of dependencies recursively
|
|
const addPackagePath = (packageName, relativeToPath)=>{
|
|
try {
|
|
if (visitedFrameworkPackages.has(packageName)) {
|
|
return;
|
|
}
|
|
visitedFrameworkPackages.add(packageName);
|
|
const packageJsonPath = require.resolve(`${packageName}/package.json`, {
|
|
paths: [
|
|
relativeToPath
|
|
]
|
|
});
|
|
// Include a trailing slash so that a `.startsWith(packagePath)` check avoids false positives
|
|
// when one package name starts with the full name of a different package.
|
|
// For example:
|
|
// "node_modules/react-slider".startsWith("node_modules/react") // true
|
|
// "node_modules/react-slider".startsWith("node_modules/react/") // false
|
|
const directory = _path.default.join(packageJsonPath, "../");
|
|
// Returning from the function in case the directory has already been added and traversed
|
|
if (topLevelFrameworkPaths.includes(directory)) return;
|
|
topLevelFrameworkPaths.push(directory);
|
|
const dependencies = require(packageJsonPath).dependencies || {};
|
|
for (const name of Object.keys(dependencies)){
|
|
addPackagePath(name, directory);
|
|
}
|
|
} catch (_) {
|
|
// don't error on failing to resolve framework packages
|
|
}
|
|
};
|
|
for (const packageName of [
|
|
"react",
|
|
"react-dom"
|
|
]){
|
|
addPackagePath(packageName, dir);
|
|
}
|
|
const crossOrigin = config.crossOrigin;
|
|
const looseEsmExternals = ((_config_experimental = config.experimental) == null ? void 0 : _config_experimental.esmExternals) === "loose";
|
|
const optOutBundlingPackages = EXTERNAL_PACKAGES.concat(...config.experimental.serverComponentsExternalPackages || []);
|
|
const optOutBundlingPackageRegex = new RegExp(`[/\\\\]node_modules[/\\\\](${optOutBundlingPackages.map((p)=>p.replace(/\//g, "[/\\\\]")).join("|")})[/\\\\]`);
|
|
let resolvedExternalPackageDirs;
|
|
async function handleExternals(context, request, dependencyType, layer, getResolve) {
|
|
// We need to externalize internal requests for files intended to
|
|
// not be bundled.
|
|
const isLocal = request.startsWith(".") || // Always check for unix-style path, as webpack sometimes
|
|
// normalizes as posix.
|
|
_path.default.posix.isAbsolute(request) || // When on Windows, we also want to check for Windows-specific
|
|
// absolute paths.
|
|
process.platform === "win32" && _path.default.win32.isAbsolute(request);
|
|
// make sure import "next" shows a warning when imported
|
|
// in pages/components
|
|
if (request === "next") {
|
|
return `commonjs next/dist/lib/import-next-warning`;
|
|
}
|
|
const isAppLayer = [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.client,
|
|
_constants.WEBPACK_LAYERS.appClient,
|
|
_constants.WEBPACK_LAYERS.action
|
|
].includes(layer);
|
|
if (request === "react/jsx-dev-runtime" || request === "react/jsx-runtime") {
|
|
if (isAppLayer) {
|
|
return `commonjs next/dist/compiled/${request.replace("react", "react" + bundledReactChannel)}`;
|
|
}
|
|
return;
|
|
}
|
|
// Special internal modules that must be bundled for Server Components.
|
|
if (layer === _constants.WEBPACK_LAYERS.server) {
|
|
// React needs to be bundled for Server Components so the special
|
|
// `react-server` export condition can be used.
|
|
if (reactPackagesRegex.test(request)) {
|
|
return;
|
|
}
|
|
}
|
|
// Relative requires don't need custom resolution, because they
|
|
// are relative to requests we've already resolved here.
|
|
// Absolute requires (require('/foo')) are extremely uncommon, but
|
|
// also have no need for customization as they're already resolved.
|
|
if (!isLocal) {
|
|
if (/^(?:next$)/.test(request)) {
|
|
return `commonjs ${request}`;
|
|
}
|
|
if (reactPackagesRegex.test(request)) {
|
|
// override react-dom to server-rendering-stub for server
|
|
if (request === "react-dom" && (layer === _constants.WEBPACK_LAYERS.client || layer === _constants.WEBPACK_LAYERS.server || layer === _constants.WEBPACK_LAYERS.action)) {
|
|
request = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub`;
|
|
} else if (isAppLayer) {
|
|
request = "next/dist/compiled/" + request.replace(/^(react-server-dom-webpack|react-dom|react)/, (name)=>{
|
|
return name + bundledReactChannel;
|
|
});
|
|
}
|
|
return `commonjs ${request}`;
|
|
}
|
|
const notExternalModules = /^(?:private-next-pages\/|next\/(?:dist\/pages\/|(?:app|document|link|image|legacy\/image|constants|dynamic|script|navigation|headers)$)|string-hash|private-next-rsc-action-validate|private-next-rsc-action-client-wrapper|private-next-rsc-action-proxy$)/;
|
|
if (notExternalModules.test(request)) {
|
|
return;
|
|
}
|
|
}
|
|
// @swc/helpers should not be external as it would
|
|
// require hoisting the package which we can't rely on
|
|
if (request.includes("@swc/helpers")) {
|
|
return;
|
|
}
|
|
// When in esm externals mode, and using import, we resolve with
|
|
// ESM resolving options.
|
|
// Also disable esm request when appDir is enabled
|
|
const isEsmRequested = dependencyType === "esm";
|
|
const isLocalCallback = (localRes)=>{
|
|
// Makes sure dist/shared and dist/server are not bundled
|
|
// we need to process shared `router/router`, `head` and `dynamic`,
|
|
// so that the DefinePlugin can inject process.env values.
|
|
// Treat next internals as non-external for server layer
|
|
if (layer === _constants.WEBPACK_LAYERS.server || layer === _constants.WEBPACK_LAYERS.action) {
|
|
return;
|
|
}
|
|
const isNextExternal = /next[/\\]dist[/\\](esm[\\/])?(shared|server)[/\\](?!lib[/\\](router[/\\]router|dynamic|app-dynamic|image-external|lazy-dynamic|head[^-]))/.test(localRes);
|
|
if (isNextExternal) {
|
|
// Generate Next.js external import
|
|
const externalRequest = _path.default.posix.join("next", "dist", _path.default.relative(// Root of Next.js package:
|
|
_path.default.join(__dirname, ".."), localRes)// Windows path normalization
|
|
.replace(/\\/g, "/"));
|
|
return `commonjs ${externalRequest}`;
|
|
}
|
|
};
|
|
// Don't bundle @vercel/og nodejs bundle for nodejs runtime.
|
|
// TODO-APP: bundle route.js with different layer that externals common node_module deps.
|
|
if (layer === _constants.WEBPACK_LAYERS.server && request === "next/dist/compiled/@vercel/og/index.node.js") {
|
|
return `module ${request}`;
|
|
}
|
|
// Specific Next.js imports that should remain external
|
|
// TODO-APP: Investigate if we can remove this.
|
|
if (request.startsWith("next/dist/")) {
|
|
// Image loader needs to be transpiled
|
|
if (/^next\/dist\/shared\/lib\/image-loader/.test(request)) {
|
|
return;
|
|
}
|
|
if (/^next\/dist\/shared\/(?!lib\/router\/router)/.test(request) || /^next\/dist\/compiled\/.*\.c?js$/.test(request)) {
|
|
return `commonjs ${request}`;
|
|
}
|
|
if (/^next\/dist\/esm\/shared\/(?!lib\/router\/router)/.test(request) || /^next\/dist\/compiled\/.*\.mjs$/.test(request)) {
|
|
return `module ${request}`;
|
|
}
|
|
// Other Next.js internals need to be transpiled.
|
|
return;
|
|
}
|
|
// Early return if the request needs to be bundled, such as in the client layer.
|
|
// Treat react packages and next internals as external for SSR layer,
|
|
// also map react to builtin ones with require-hook.
|
|
if (layer === _constants.WEBPACK_LAYERS.client) {
|
|
if (reactPackagesRegex.test(request)) {
|
|
return `commonjs next/dist/compiled/${request.replace(/^(react-server-dom-webpack|react-dom|react)/, (name)=>{
|
|
return name + bundledReactChannel;
|
|
})}`;
|
|
}
|
|
const isRelative = request.startsWith(".");
|
|
const fullRequest = isRelative ? _path.default.join(context, request).replace(/\\/g, "/") : request;
|
|
const resolveNextExternal = isLocalCallback(fullRequest);
|
|
return resolveNextExternal;
|
|
}
|
|
// TODO-APP: Let's avoid this resolve call as much as possible, and eventually get rid of it.
|
|
const resolveResult = await resolveExternal(dir, config.experimental.esmExternals, context, request, isEsmRequested, hasAppDir, getResolve, isLocal ? isLocalCallback : undefined);
|
|
if ("localRes" in resolveResult) {
|
|
return resolveResult.localRes;
|
|
}
|
|
// Forcedly resolve the styled-jsx installed by next.js,
|
|
// since `resolveExternal` cannot find the styled-jsx dep with pnpm
|
|
if (request === "styled-jsx/style") {
|
|
resolveResult.res = require.resolve(request);
|
|
}
|
|
const { res , isEsm } = resolveResult;
|
|
// If the request cannot be resolved we need to have
|
|
// webpack "bundle" it so it surfaces the not found error.
|
|
if (!res) {
|
|
return;
|
|
}
|
|
// ESM externals can only be imported (and not required).
|
|
// Make an exception in loose mode.
|
|
if (!isEsmRequested && isEsm && !looseEsmExternals) {
|
|
throw new Error(`ESM packages (${request}) need to be imported. Use 'import' to reference the package instead. https://nextjs.org/docs/messages/import-esm-externals`);
|
|
}
|
|
const externalType = isEsm ? "module" : "commonjs";
|
|
// Default pages have to be transpiled
|
|
if (// This is the @babel/plugin-transform-runtime "helpers: true" option
|
|
/node_modules[/\\]@babel[/\\]runtime[/\\]/.test(res)) {
|
|
return;
|
|
}
|
|
// Webpack itself has to be compiled because it doesn't always use module relative paths
|
|
if (/node_modules[/\\]webpack/.test(res) || /node_modules[/\\]css-loader/.test(res)) {
|
|
return;
|
|
}
|
|
// If a package should be transpiled by Next.js, we skip making it external.
|
|
// It doesn't matter what the extension is, as we'll transpile it anyway.
|
|
if (config.transpilePackages && !resolvedExternalPackageDirs) {
|
|
resolvedExternalPackageDirs = new Map();
|
|
// We need to resolve all the external package dirs initially.
|
|
for (const pkg of config.transpilePackages){
|
|
const pkgRes = await resolveExternal(dir, config.experimental.esmExternals, context, pkg + "/package.json", hasAppDir, isEsmRequested, getResolve, isLocal ? isLocalCallback : undefined);
|
|
if (pkgRes.res) {
|
|
resolvedExternalPackageDirs.set(pkg, _path.default.dirname(pkgRes.res));
|
|
}
|
|
}
|
|
}
|
|
// If a package is included in `transpilePackages`, we don't want to make it external.
|
|
// And also, if that resource is an ES module, we bundle it too because we can't
|
|
// rely on the require hook to alias `react` to our precompiled version.
|
|
const shouldBeBundled = isResourceInPackages(res, config.transpilePackages, resolvedExternalPackageDirs) || isEsm && isAppLayer;
|
|
if (/node_modules[/\\].*\.[mc]?js$/.test(res)) {
|
|
if (layer === _constants.WEBPACK_LAYERS.server || layer === _constants.WEBPACK_LAYERS.action) {
|
|
// All packages should be bundled for the server layer if they're not opted out.
|
|
// This option takes priority over the transpilePackages option.
|
|
if (optOutBundlingPackageRegex.test(res)) {
|
|
return `${externalType} ${request}`;
|
|
}
|
|
return;
|
|
}
|
|
if (shouldBeBundled) return;
|
|
// Anything else that is standard JavaScript within `node_modules`
|
|
// can be externalized.
|
|
return `${externalType} ${request}`;
|
|
}
|
|
if (shouldBeBundled) return;
|
|
// Default behavior: bundle the code!
|
|
}
|
|
const shouldIncludeExternalDirs = config.experimental.externalDir || !!config.transpilePackages;
|
|
const codeCondition = {
|
|
test: /\.(tsx|ts|js|cjs|mjs|jsx)$/,
|
|
...shouldIncludeExternalDirs ? {} : {
|
|
include: [
|
|
dir,
|
|
...babelIncludeRegexes
|
|
]
|
|
},
|
|
exclude: (excludePath)=>{
|
|
if (babelIncludeRegexes.some((r)=>r.test(excludePath))) {
|
|
return false;
|
|
}
|
|
const shouldBeBundled = isResourceInPackages(excludePath, config.transpilePackages);
|
|
if (shouldBeBundled) return false;
|
|
return excludePath.includes("node_modules");
|
|
}
|
|
};
|
|
let webpackConfig = {
|
|
parallelism: Number(process.env.NEXT_WEBPACK_PARALLELISM) || undefined,
|
|
...isNodeServer ? {
|
|
externalsPresets: {
|
|
node: true
|
|
}
|
|
} : {},
|
|
// @ts-ignore
|
|
externals: isClient || isEdgeServer ? // bundles in case a user imported types and it wasn't removed
|
|
// TODO: should we warn/error for this instead?
|
|
[
|
|
"next",
|
|
...isEdgeServer ? [
|
|
{
|
|
"@builder.io/partytown": "{}",
|
|
"next/dist/compiled/etag": "{}",
|
|
"next/dist/compiled/chalk": "{}"
|
|
},
|
|
(0, _middlewareplugin.getEdgePolyfilledModules)(),
|
|
_middlewareplugin.handleWebpackExternalForEdgeRuntime
|
|
] : []
|
|
] : [
|
|
({ context , request , dependencyType , contextInfo , getResolve })=>{
|
|
return handleExternals(context, request, dependencyType, contextInfo.issuerLayer, (options)=>{
|
|
const resolveFunction = getResolve(options);
|
|
return (resolveContext, requestToResolve)=>{
|
|
return new Promise((resolve, reject)=>{
|
|
resolveFunction(resolveContext, requestToResolve, (err, result, resolveData)=>{
|
|
var _resolveData_descriptionFileData;
|
|
if (err) return reject(err);
|
|
if (!result) return resolve([
|
|
null,
|
|
false
|
|
]);
|
|
const isEsm = /\.js$/i.test(result) ? (resolveData == null ? void 0 : (_resolveData_descriptionFileData = resolveData.descriptionFileData) == null ? void 0 : _resolveData_descriptionFileData.type) === "module" : /\.mjs$/i.test(result);
|
|
resolve([
|
|
result,
|
|
isEsm
|
|
]);
|
|
});
|
|
});
|
|
};
|
|
});
|
|
}
|
|
],
|
|
optimization: {
|
|
emitOnErrors: !dev,
|
|
checkWasmTypes: false,
|
|
nodeEnv: false,
|
|
splitChunks: (()=>{
|
|
if (dev) {
|
|
return false;
|
|
}
|
|
if (isNodeServer) {
|
|
return {
|
|
filename: "[name].js",
|
|
chunks: "all",
|
|
minSize: 1000
|
|
};
|
|
}
|
|
if (isEdgeServer) {
|
|
return {
|
|
filename: "edge-chunks/[name].js",
|
|
minChunks: 2
|
|
};
|
|
}
|
|
return {
|
|
// Keep main and _app chunks unsplitted in webpack 5
|
|
// as we don't need a separate vendor chunk from that
|
|
// and all other chunk depend on them so there is no
|
|
// duplication that need to be pulled out.
|
|
chunks: (chunk)=>!/^(polyfills|main|pages\/_app)$/.test(chunk.name),
|
|
cacheGroups: {
|
|
framework: {
|
|
chunks: "all",
|
|
name: "framework",
|
|
// Ensures the framework chunk is not created for App Router.
|
|
layer (layer) {
|
|
return layer === null || layer === undefined;
|
|
},
|
|
test (module1) {
|
|
const resource = module1.nameForCondition == null ? void 0 : module1.nameForCondition();
|
|
return resource ? topLevelFrameworkPaths.some((pkgPath)=>resource.startsWith(pkgPath)) : false;
|
|
},
|
|
priority: 40,
|
|
// Don't let webpack eliminate this chunk (prevents this chunk from
|
|
// becoming a part of the commons chunk)
|
|
enforce: true
|
|
},
|
|
lib: {
|
|
test (module1) {
|
|
return module1.size() > 160000 && /node_modules[/\\]/.test(module1.nameForCondition() || "");
|
|
},
|
|
name (module1) {
|
|
const hash = _crypto.default.createHash("sha1");
|
|
if (isModuleCSS(module1)) {
|
|
module1.updateHash(hash);
|
|
} else {
|
|
if (!module1.libIdent) {
|
|
throw new Error(`Encountered unknown module type: ${module1.type}. Please open an issue.`);
|
|
}
|
|
hash.update(module1.libIdent({
|
|
context: dir
|
|
}));
|
|
}
|
|
// Ensures the name of the chunk is not the same between two modules in different layers
|
|
// E.g. if you import 'button-library' in App Router and Pages Router we don't want these to be bundled in the same chunk
|
|
// as they're never used on the same page.
|
|
if (module1.layer) {
|
|
hash.update(module1.layer);
|
|
}
|
|
return hash.digest("hex").substring(0, 8);
|
|
},
|
|
priority: 30,
|
|
minChunks: 1,
|
|
reuseExistingChunk: true
|
|
}
|
|
},
|
|
maxInitialRequests: 25,
|
|
minSize: 20000
|
|
};
|
|
})(),
|
|
runtimeChunk: isClient ? {
|
|
name: _constants1.CLIENT_STATIC_FILES_RUNTIME_WEBPACK
|
|
} : undefined,
|
|
minimize: !dev && (isClient || isEdgeServer || isNodeServer && config.experimental.serverMinification),
|
|
minimizer: [
|
|
// Minify JavaScript
|
|
(compiler)=>{
|
|
// @ts-ignore No typings yet
|
|
const { TerserPlugin } = require("./webpack/plugins/terser-webpack-plugin/src/index.js");
|
|
new TerserPlugin({
|
|
cacheDir: _path.default.join(distDir, "cache", "next-minifier"),
|
|
parallel: config.experimental.cpus,
|
|
swcMinify: config.swcMinify,
|
|
terserOptions: {
|
|
...terserOptions,
|
|
compress: {
|
|
...terserOptions.compress
|
|
},
|
|
mangle: {
|
|
...terserOptions.mangle
|
|
}
|
|
}
|
|
}).apply(compiler);
|
|
},
|
|
// Minify CSS
|
|
(compiler)=>{
|
|
const { CssMinimizerPlugin } = require("./webpack/plugins/css-minimizer-plugin");
|
|
new CssMinimizerPlugin({
|
|
postcssOptions: {
|
|
map: {
|
|
// `inline: false` generates the source map in a separate file.
|
|
// Otherwise, the CSS file is needlessly large.
|
|
inline: false,
|
|
// `annotation: false` skips appending the `sourceMappingURL`
|
|
// to the end of the CSS file. Webpack already handles this.
|
|
annotation: false
|
|
}
|
|
}
|
|
}).apply(compiler);
|
|
}
|
|
]
|
|
},
|
|
context: dir,
|
|
// Kept as function to be backwards compatible
|
|
entry: async ()=>{
|
|
return {
|
|
...clientEntries ? clientEntries : {},
|
|
...entrypoints
|
|
};
|
|
},
|
|
watchOptions,
|
|
output: {
|
|
// we must set publicPath to an empty value to override the default of
|
|
// auto which doesn't work in IE11
|
|
publicPath: `${config.assetPrefix ? config.assetPrefix.endsWith("/") ? config.assetPrefix.slice(0, -1) : config.assetPrefix : ""}/_next/`,
|
|
path: !dev && isNodeServer ? _path.default.join(outputPath, "chunks") : outputPath,
|
|
// On the server we don't use hashes
|
|
filename: isNodeServer || isEdgeServer ? dev || isEdgeServer ? `[name].js` : `../[name].js` : `static/chunks/${isDevFallback ? "fallback/" : ""}[name]${dev ? "" : appDir ? "-[chunkhash]" : "-[contenthash]"}.js`,
|
|
library: isClient || isEdgeServer ? "_N_E" : undefined,
|
|
libraryTarget: isClient || isEdgeServer ? "assign" : "commonjs2",
|
|
hotUpdateChunkFilename: "static/webpack/[id].[fullhash].hot-update.js",
|
|
hotUpdateMainFilename: "static/webpack/[fullhash].[runtime].hot-update.json",
|
|
// This saves chunks with the name given via `import()`
|
|
chunkFilename: isNodeServer || isEdgeServer ? "[name].js" : `static/chunks/${isDevFallback ? "fallback/" : ""}${dev ? "[name]" : "[name].[contenthash]"}.js`,
|
|
strictModuleExceptionHandling: true,
|
|
crossOriginLoading: crossOrigin,
|
|
webassemblyModuleFilename: "static/wasm/[modulehash].wasm",
|
|
hashFunction: "xxhash64",
|
|
hashDigestLength: 16
|
|
},
|
|
performance: false,
|
|
resolve: resolveConfig,
|
|
resolveLoader: {
|
|
// The loaders Next.js provides
|
|
alias: [
|
|
"error-loader",
|
|
"next-swc-loader",
|
|
"next-client-pages-loader",
|
|
"next-image-loader",
|
|
"next-metadata-image-loader",
|
|
"next-style-loader",
|
|
"next-flight-loader",
|
|
"next-flight-client-entry-loader",
|
|
"next-flight-action-entry-loader",
|
|
"next-flight-client-module-loader",
|
|
"noop-loader",
|
|
"next-middleware-loader",
|
|
"next-edge-function-loader",
|
|
"next-edge-app-route-loader",
|
|
"next-edge-ssr-loader",
|
|
"next-middleware-asset-loader",
|
|
"next-middleware-wasm-loader",
|
|
"next-app-loader",
|
|
"next-route-loader",
|
|
"next-font-loader",
|
|
"next-invalid-import-error-loader",
|
|
"next-metadata-route-loader"
|
|
].reduce((alias, loader)=>{
|
|
// using multiple aliases to replace `resolveLoader.modules`
|
|
alias[loader] = _path.default.join(__dirname, "webpack", "loaders", loader);
|
|
return alias;
|
|
}, {}),
|
|
modules: [
|
|
"node_modules",
|
|
...nodePathList
|
|
],
|
|
plugins: []
|
|
},
|
|
module: {
|
|
rules: [
|
|
...hasAppDir ? [
|
|
{
|
|
// Make sure that AsyncLocalStorage module instance is shared between server and client
|
|
// layers.
|
|
layer: _constants.WEBPACK_LAYERS.shared,
|
|
test: asyncStoragesRegex
|
|
},
|
|
{
|
|
// All app dir layers need to use this configured resolution logic
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.client,
|
|
_constants.WEBPACK_LAYERS.appClient,
|
|
_constants.WEBPACK_LAYERS.action,
|
|
_constants.WEBPACK_LAYERS.shared
|
|
]
|
|
},
|
|
resolve: {
|
|
alias: {
|
|
// Alias next/head component to noop for RSC
|
|
[require.resolve("next/head")]: require.resolve("next/dist/client/components/noop-head"),
|
|
// Alias next/dynamic
|
|
[require.resolve("next/dynamic")]: require.resolve("next/dist/shared/lib/app-dynamic"),
|
|
...createRSCAliases(bundledReactChannel, {
|
|
reactSharedSubset: false,
|
|
reactDomServerRenderingStub: false,
|
|
reactProductionProfiling
|
|
})
|
|
}
|
|
}
|
|
}
|
|
] : [],
|
|
...hasAppDir && !isClient ? [
|
|
{
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.action
|
|
]
|
|
},
|
|
test: {
|
|
// Resolve it if it is a source code file, and it has NOT been
|
|
// opted out of bundling.
|
|
and: [
|
|
codeCondition.test,
|
|
{
|
|
not: [
|
|
optOutBundlingPackageRegex,
|
|
asyncStoragesRegex
|
|
]
|
|
}
|
|
]
|
|
},
|
|
resolve: {
|
|
conditionNames: reactServerCondition,
|
|
alias: {
|
|
// If missing the alias override here, the default alias will be used which aliases
|
|
// react to the direct file path, not the package name. In that case the condition
|
|
// will be ignored completely.
|
|
...createRSCAliases(bundledReactChannel, {
|
|
reactSharedSubset: true,
|
|
reactDomServerRenderingStub: true,
|
|
reactServerCondition: true,
|
|
// No server components profiling
|
|
reactProductionProfiling
|
|
})
|
|
}
|
|
},
|
|
use: {
|
|
loader: "next-flight-loader"
|
|
}
|
|
}
|
|
] : [],
|
|
// TODO: FIXME: do NOT webpack 5 support with this
|
|
// x-ref: https://github.com/webpack/webpack/issues/11467
|
|
...!config.experimental.fullySpecified ? [
|
|
{
|
|
test: /\.m?js/,
|
|
resolve: {
|
|
fullySpecified: false
|
|
}
|
|
}
|
|
] : [],
|
|
...hasAppDir ? [
|
|
{
|
|
resourceQuery: new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.metadataRoute),
|
|
layer: _constants.WEBPACK_LAYERS.metadataImage
|
|
}
|
|
] : [],
|
|
...hasAppDir && isEdgeServer ? [
|
|
// The Edge bundle includes the server in its entrypoint, so it has to
|
|
// be in the SSR layer — here we convert the actual page request to
|
|
// the RSC layer via a webpack rule.
|
|
{
|
|
resourceQuery: new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.edgeSSREntry),
|
|
layer: _constants.WEBPACK_LAYERS.server
|
|
}
|
|
] : [],
|
|
...hasServerComponents ? [
|
|
{
|
|
// Alias react-dom for ReactDOM.preload usage.
|
|
// Alias react for switching between default set and share subset.
|
|
oneOf: [
|
|
{
|
|
exclude: [
|
|
asyncStoragesRegex
|
|
],
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.action
|
|
]
|
|
},
|
|
test: {
|
|
// Resolve it if it is a source code file, and it has NOT been
|
|
// opted out of bundling.
|
|
and: [
|
|
codeCondition.test,
|
|
{
|
|
not: [
|
|
optOutBundlingPackageRegex
|
|
]
|
|
}
|
|
]
|
|
},
|
|
resolve: {
|
|
// It needs `conditionNames` here to require the proper asset,
|
|
// when react is acting as dependency of compiled/react-dom.
|
|
alias: {
|
|
...createRSCAliases(bundledReactChannel, {
|
|
reactSharedSubset: true,
|
|
reactDomServerRenderingStub: true,
|
|
reactServerCondition: true,
|
|
reactProductionProfiling
|
|
})
|
|
}
|
|
}
|
|
},
|
|
{
|
|
test: codeCondition.test,
|
|
issuerLayer: _constants.WEBPACK_LAYERS.client,
|
|
resolve: {
|
|
alias: {
|
|
...createRSCAliases(bundledReactChannel, {
|
|
reactSharedSubset: false,
|
|
reactDomServerRenderingStub: true,
|
|
reactServerCondition: false,
|
|
reactProductionProfiling
|
|
})
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
test: codeCondition.test,
|
|
issuerLayer: _constants.WEBPACK_LAYERS.appClient,
|
|
resolve: {
|
|
alias: {
|
|
...createRSCAliases(bundledReactChannel, {
|
|
// Only alias server rendering stub in client SSR layer.
|
|
reactSharedSubset: false,
|
|
reactDomServerRenderingStub: false,
|
|
reactServerCondition: false,
|
|
reactProductionProfiling
|
|
})
|
|
}
|
|
}
|
|
}
|
|
] : [],
|
|
{
|
|
oneOf: [
|
|
{
|
|
...codeCondition,
|
|
issuerLayer: _constants.WEBPACK_LAYERS.api,
|
|
parser: {
|
|
// Switch back to normal URL handling
|
|
url: true
|
|
},
|
|
use: loaderForAPIRoutes
|
|
},
|
|
{
|
|
test: codeCondition.test,
|
|
issuerLayer: _constants.WEBPACK_LAYERS.middleware,
|
|
use: swcLoaderForMiddlewareLayer
|
|
},
|
|
...hasServerComponents ? [
|
|
{
|
|
test: codeCondition.test,
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.action
|
|
]
|
|
},
|
|
exclude: [
|
|
asyncStoragesRegex
|
|
],
|
|
use: swcLoaderForServerLayer
|
|
},
|
|
{
|
|
test: codeCondition.test,
|
|
resourceQuery: new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.edgeSSREntry),
|
|
use: swcLoaderForServerLayer
|
|
},
|
|
{
|
|
...codeCondition,
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.client,
|
|
_constants.WEBPACK_LAYERS.appClient
|
|
]
|
|
},
|
|
exclude: [
|
|
asyncStoragesRegex,
|
|
codeCondition.exclude
|
|
],
|
|
use: [
|
|
...dev && isClient ? [
|
|
require.resolve("next/dist/compiled/@next/react-refresh-utils/dist/loader")
|
|
] : [],
|
|
{
|
|
// This loader handles actions and client entries
|
|
// in the client layer.
|
|
loader: "next-flight-client-module-loader"
|
|
},
|
|
...swcLoaderForClientLayer
|
|
]
|
|
}
|
|
] : [],
|
|
{
|
|
...codeCondition,
|
|
use: dev && isClient ? [
|
|
require.resolve("next/dist/compiled/@next/react-refresh-utils/dist/loader"),
|
|
defaultLoaders.babel
|
|
] : defaultLoaders.babel
|
|
}
|
|
]
|
|
},
|
|
...!config.images.disableStaticImages ? [
|
|
{
|
|
test: nextImageLoaderRegex,
|
|
loader: "next-image-loader",
|
|
issuer: {
|
|
not: _css.regexLikeCss
|
|
},
|
|
dependency: {
|
|
not: [
|
|
"url"
|
|
]
|
|
},
|
|
resourceQuery: {
|
|
not: [
|
|
new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.metadata),
|
|
new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.metadataRoute),
|
|
new RegExp(_constants.WEBPACK_RESOURCE_QUERIES.metadataImageMeta)
|
|
]
|
|
},
|
|
options: {
|
|
isDev: dev,
|
|
compilerType,
|
|
basePath: config.basePath,
|
|
assetPrefix: config.assetPrefix
|
|
}
|
|
}
|
|
] : [],
|
|
...isEdgeServer ? [
|
|
{
|
|
resolve: {
|
|
fallback: {
|
|
process: require.resolve("./polyfills/process")
|
|
}
|
|
}
|
|
}
|
|
] : isClient ? [
|
|
{
|
|
resolve: {
|
|
fallback: config.experimental.fallbackNodePolyfills === false ? {
|
|
assert: false,
|
|
buffer: false,
|
|
constants: false,
|
|
crypto: false,
|
|
domain: false,
|
|
http: false,
|
|
https: false,
|
|
os: false,
|
|
path: false,
|
|
punycode: false,
|
|
process: false,
|
|
querystring: false,
|
|
stream: false,
|
|
string_decoder: false,
|
|
sys: false,
|
|
timers: false,
|
|
tty: false,
|
|
util: false,
|
|
vm: false,
|
|
zlib: false,
|
|
events: false,
|
|
setImmediate: false
|
|
} : {
|
|
assert: require.resolve("next/dist/compiled/assert"),
|
|
buffer: require.resolve("next/dist/compiled/buffer/"),
|
|
constants: require.resolve("next/dist/compiled/constants-browserify"),
|
|
crypto: require.resolve("next/dist/compiled/crypto-browserify"),
|
|
domain: require.resolve("next/dist/compiled/domain-browser"),
|
|
http: require.resolve("next/dist/compiled/stream-http"),
|
|
https: require.resolve("next/dist/compiled/https-browserify"),
|
|
os: require.resolve("next/dist/compiled/os-browserify"),
|
|
path: require.resolve("next/dist/compiled/path-browserify"),
|
|
punycode: require.resolve("next/dist/compiled/punycode"),
|
|
process: require.resolve("./polyfills/process"),
|
|
// Handled in separate alias
|
|
querystring: require.resolve("next/dist/compiled/querystring-es3"),
|
|
stream: require.resolve("next/dist/compiled/stream-browserify"),
|
|
string_decoder: require.resolve("next/dist/compiled/string_decoder"),
|
|
sys: require.resolve("next/dist/compiled/util/"),
|
|
timers: require.resolve("next/dist/compiled/timers-browserify"),
|
|
tty: require.resolve("next/dist/compiled/tty-browserify"),
|
|
// Handled in separate alias
|
|
// url: require.resolve('url/'),
|
|
util: require.resolve("next/dist/compiled/util/"),
|
|
vm: require.resolve("next/dist/compiled/vm-browserify"),
|
|
zlib: require.resolve("next/dist/compiled/browserify-zlib"),
|
|
events: require.resolve("next/dist/compiled/events/"),
|
|
setImmediate: require.resolve("next/dist/compiled/setimmediate")
|
|
}
|
|
}
|
|
}
|
|
] : [],
|
|
{
|
|
test: /(node_modules|next[/\\]dist[/\\]compiled)[/\\]client-only[/\\]error.js/,
|
|
loader: "next-invalid-import-error-loader",
|
|
issuerLayer: {
|
|
or: [
|
|
_constants.WEBPACK_LAYERS.server,
|
|
_constants.WEBPACK_LAYERS.action
|
|
]
|
|
},
|
|
options: {
|
|
message: "'client-only' cannot be imported from a Server Component module. It should only be used from a Client Component."
|
|
}
|
|
},
|
|
{
|
|
test: /(node_modules|next[/\\]dist[/\\]compiled)[/\\]server-only[/\\]index.js/,
|
|
loader: "next-invalid-import-error-loader",
|
|
issuerLayer: _constants.WEBPACK_LAYERS.client,
|
|
options: {
|
|
message: "'server-only' cannot be imported from a Client Component module. It should only be used from a Server Component."
|
|
}
|
|
},
|
|
{
|
|
// Mark `image-response.js` as side-effects free to make sure we can
|
|
// tree-shake it if not used.
|
|
test: /[\\/]next[\\/]dist[\\/](esm[\\/])?server[\\/]web[\\/]exports[\\/]image-response\.js/,
|
|
sideEffects: false
|
|
}
|
|
].filter(Boolean)
|
|
},
|
|
plugins: [
|
|
dev && isClient && new _ReactRefreshWebpackPlugin.default(_webpack.webpack),
|
|
// Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4)
|
|
(isClient || isEdgeServer) && new _webpack.webpack.ProvidePlugin({
|
|
// Buffer is used by getInlineScriptSource
|
|
Buffer: [
|
|
require.resolve("buffer"),
|
|
"Buffer"
|
|
],
|
|
// Avoid process being overridden when in web run time
|
|
...isClient && {
|
|
process: [
|
|
require.resolve("process")
|
|
]
|
|
}
|
|
}),
|
|
new _webpack.webpack.DefinePlugin(getDefineEnv({
|
|
dev,
|
|
config,
|
|
distDir,
|
|
isClient,
|
|
hasRewrites,
|
|
isNodeServer,
|
|
isEdgeServer,
|
|
middlewareMatchers,
|
|
clientRouterFilters,
|
|
previewModeId,
|
|
fetchCacheKeyPrefix,
|
|
allowedRevalidateHeaderKeys
|
|
})),
|
|
isClient && new _reactloadableplugin.ReactLoadablePlugin({
|
|
filename: _constants1.REACT_LOADABLE_MANIFEST,
|
|
pagesDir,
|
|
runtimeAsset: `server/${_constants1.MIDDLEWARE_REACT_LOADABLE_MANIFEST}.js`,
|
|
dev
|
|
}),
|
|
(isClient || isEdgeServer) && new _nextdropclientpageplugin.DropClientPage(),
|
|
config.outputFileTracing && isNodeServer && !dev && new (require("./webpack/plugins/next-trace-entrypoints-plugin")).TraceEntryPointsPlugin({
|
|
rootDir: dir,
|
|
appDir: appDir,
|
|
pagesDir: pagesDir,
|
|
esmExternals: config.experimental.esmExternals,
|
|
outputFileTracingRoot: config.experimental.outputFileTracingRoot,
|
|
appDirEnabled: hasAppDir,
|
|
turbotrace: config.experimental.turbotrace,
|
|
traceIgnores: config.experimental.outputFileTracingIgnores || []
|
|
}),
|
|
// Moment.js is an extremely popular library that bundles large locale files
|
|
// by default due to how Webpack interprets its code. This is a practical
|
|
// solution that requires the user to opt into importing specific locales.
|
|
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
|
|
config.excludeDefaultMomentLocales && new _webpack.webpack.IgnorePlugin({
|
|
resourceRegExp: /^\.\/locale$/,
|
|
contextRegExp: /moment$/
|
|
}),
|
|
...dev ? (()=>{
|
|
// Even though require.cache is server only we have to clear assets from both compilations
|
|
// This is because the client compilation generates the build manifest that's used on the server side
|
|
const { NextJsRequireCacheHotReloader } = require("./webpack/plugins/nextjs-require-cache-hot-reloader");
|
|
const devPlugins = [
|
|
new NextJsRequireCacheHotReloader({
|
|
hasServerComponents
|
|
})
|
|
];
|
|
if (isClient || isEdgeServer) {
|
|
devPlugins.push(new _webpack.webpack.HotModuleReplacementPlugin());
|
|
}
|
|
return devPlugins;
|
|
})() : [],
|
|
!dev && new _webpack.webpack.IgnorePlugin({
|
|
resourceRegExp: /react-is/,
|
|
contextRegExp: /next[\\/]dist[\\/]/
|
|
}),
|
|
(isNodeServer || isEdgeServer) && new _pagesmanifestplugin.default({
|
|
dev,
|
|
isEdgeRuntime: isEdgeServer,
|
|
appDirEnabled: hasAppDir
|
|
}),
|
|
// MiddlewarePlugin should be after DefinePlugin so NEXT_PUBLIC_*
|
|
// replacement is done before its process.env.* handling
|
|
isEdgeServer && new _middlewareplugin.default({
|
|
dev,
|
|
sriEnabled: !dev && !!((_config_experimental_sri = config.experimental.sri) == null ? void 0 : _config_experimental_sri.algorithm)
|
|
}),
|
|
isClient && new _buildmanifestplugin.default({
|
|
buildId,
|
|
rewrites,
|
|
isDevFallback,
|
|
exportRuntime: true,
|
|
appDirEnabled: hasAppDir
|
|
}),
|
|
new _profilingplugin.ProfilingPlugin({
|
|
runWebpackSpan
|
|
}),
|
|
config.optimizeFonts && !dev && isNodeServer && function() {
|
|
const { FontStylesheetGatheringPlugin } = require("./webpack/plugins/font-stylesheet-gathering-plugin");
|
|
return new FontStylesheetGatheringPlugin({
|
|
adjustFontFallbacks: config.experimental.adjustFontFallbacks,
|
|
adjustFontFallbacksWithSizeAdjust: config.experimental.adjustFontFallbacksWithSizeAdjust
|
|
});
|
|
}(),
|
|
new _wellknownerrorsplugin.WellKnownErrorsPlugin(),
|
|
isClient && new _copyfileplugin.CopyFilePlugin({
|
|
filePath: require.resolve("./polyfills/polyfill-nomodule"),
|
|
cacheKey: "13.4.9",
|
|
name: `static/chunks/polyfills${dev ? "" : "-[hash]"}.js`,
|
|
minimize: false,
|
|
info: {
|
|
[_constants1.CLIENT_STATIC_FILES_RUNTIME_POLYFILLS_SYMBOL]: 1,
|
|
// This file is already minified
|
|
minimized: true
|
|
}
|
|
}),
|
|
hasAppDir && isClient && new _appbuildmanifestplugin.AppBuildManifestPlugin({
|
|
dev
|
|
}),
|
|
hasServerComponents && (isClient ? new _flightmanifestplugin.ClientReferenceManifestPlugin({
|
|
dev,
|
|
appDir
|
|
}) : new _flightcliententryplugin.FlightClientEntryPlugin({
|
|
appDir,
|
|
dev,
|
|
isEdgeServer,
|
|
useServerActions
|
|
})),
|
|
hasAppDir && !isClient && new _nexttypesplugin.NextTypesPlugin({
|
|
dir,
|
|
distDir: config.distDir,
|
|
appDir,
|
|
dev,
|
|
isEdgeServer,
|
|
pageExtensions: config.pageExtensions,
|
|
typedRoutes: enableTypedRoutes,
|
|
originalRewrites,
|
|
originalRedirects
|
|
}),
|
|
!dev && isClient && !!((_config_experimental_sri1 = config.experimental.sri) == null ? void 0 : _config_experimental_sri1.algorithm) && new _subresourceintegrityplugin.SubresourceIntegrityPlugin(config.experimental.sri.algorithm),
|
|
isClient && new _nextfontmanifestplugin.NextFontManifestPlugin({
|
|
appDir
|
|
}),
|
|
!dev && isClient && new (require("./webpack/plugins/telemetry-plugin")).TelemetryPlugin(new Map([
|
|
[
|
|
"swcLoader",
|
|
useSWCLoader
|
|
],
|
|
[
|
|
"swcMinify",
|
|
config.swcMinify
|
|
],
|
|
[
|
|
"swcRelay",
|
|
!!((_config_compiler = config.compiler) == null ? void 0 : _config_compiler.relay)
|
|
],
|
|
[
|
|
"swcStyledComponents",
|
|
!!((_config_compiler1 = config.compiler) == null ? void 0 : _config_compiler1.styledComponents)
|
|
],
|
|
[
|
|
"swcReactRemoveProperties",
|
|
!!((_config_compiler2 = config.compiler) == null ? void 0 : _config_compiler2.reactRemoveProperties)
|
|
],
|
|
[
|
|
"swcExperimentalDecorators",
|
|
!!(jsConfig == null ? void 0 : (_jsConfig_compilerOptions = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions.experimentalDecorators)
|
|
],
|
|
[
|
|
"swcRemoveConsole",
|
|
!!((_config_compiler3 = config.compiler) == null ? void 0 : _config_compiler3.removeConsole)
|
|
],
|
|
[
|
|
"swcImportSource",
|
|
!!(jsConfig == null ? void 0 : (_jsConfig_compilerOptions1 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions1.jsxImportSource)
|
|
],
|
|
[
|
|
"swcEmotion",
|
|
!!((_config_compiler4 = config.compiler) == null ? void 0 : _config_compiler4.emotion)
|
|
],
|
|
[
|
|
"turbotrace",
|
|
!!config.experimental.turbotrace
|
|
],
|
|
[
|
|
"transpilePackages",
|
|
!!config.transpilePackages
|
|
],
|
|
[
|
|
"skipMiddlewareUrlNormalize",
|
|
!!config.skipMiddlewareUrlNormalize
|
|
],
|
|
[
|
|
"skipTrailingSlashRedirect",
|
|
!!config.skipTrailingSlashRedirect
|
|
],
|
|
[
|
|
"modularizeImports",
|
|
!!config.modularizeImports
|
|
],
|
|
SWCBinaryTarget
|
|
].filter(Boolean)))
|
|
].filter(Boolean)
|
|
};
|
|
// Support tsconfig and jsconfig baseUrl
|
|
if (resolvedBaseUrl) {
|
|
var _webpackConfig_resolve1, _webpackConfig_resolve_modules;
|
|
(_webpackConfig_resolve1 = webpackConfig.resolve) == null ? void 0 : (_webpackConfig_resolve_modules = _webpackConfig_resolve1.modules) == null ? void 0 : _webpackConfig_resolve_modules.push(resolvedBaseUrl);
|
|
}
|
|
(_webpackConfig_resolve = webpackConfig.resolve) == null ? void 0 : (_webpackConfig_resolve_plugins = _webpackConfig_resolve.plugins) == null ? void 0 : _webpackConfig_resolve_plugins.unshift(new _jsconfigpathsplugin.JsConfigPathsPlugin((jsConfig == null ? void 0 : (_jsConfig_compilerOptions2 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions2.paths) || {}, resolvedBaseUrl || dir));
|
|
const webpack5Config = webpackConfig;
|
|
if (isEdgeServer) {
|
|
var _webpack5Config_module, _webpack5Config_module_rules, _webpack5Config_module1, _webpack5Config_module_rules1, _webpack5Config_module2, _webpack5Config_module_rules2;
|
|
(_webpack5Config_module = webpack5Config.module) == null ? void 0 : (_webpack5Config_module_rules = _webpack5Config_module.rules) == null ? void 0 : _webpack5Config_module_rules.unshift({
|
|
test: /\.wasm$/,
|
|
loader: "next-middleware-wasm-loader",
|
|
type: "javascript/auto",
|
|
resourceQuery: /module/i
|
|
});
|
|
(_webpack5Config_module1 = webpack5Config.module) == null ? void 0 : (_webpack5Config_module_rules1 = _webpack5Config_module1.rules) == null ? void 0 : _webpack5Config_module_rules1.unshift({
|
|
dependency: "url",
|
|
loader: "next-middleware-asset-loader",
|
|
type: "javascript/auto",
|
|
layer: _constants.WEBPACK_LAYERS.edgeAsset
|
|
});
|
|
(_webpack5Config_module2 = webpack5Config.module) == null ? void 0 : (_webpack5Config_module_rules2 = _webpack5Config_module2.rules) == null ? void 0 : _webpack5Config_module_rules2.unshift({
|
|
issuerLayer: _constants.WEBPACK_LAYERS.edgeAsset,
|
|
type: "asset/source"
|
|
});
|
|
}
|
|
webpack5Config.experiments = {
|
|
layers: true,
|
|
cacheUnaffected: true,
|
|
buildHttp: Array.isArray(config.experimental.urlImports) ? {
|
|
allowedUris: config.experimental.urlImports,
|
|
cacheLocation: _path.default.join(dir, "next.lock/data"),
|
|
lockfileLocation: _path.default.join(dir, "next.lock/lock.json")
|
|
} : config.experimental.urlImports ? {
|
|
cacheLocation: _path.default.join(dir, "next.lock/data"),
|
|
lockfileLocation: _path.default.join(dir, "next.lock/lock.json"),
|
|
...config.experimental.urlImports
|
|
} : undefined
|
|
};
|
|
webpack5Config.module.parser = {
|
|
javascript: {
|
|
url: "relative"
|
|
}
|
|
};
|
|
webpack5Config.module.generator = {
|
|
asset: {
|
|
filename: "static/media/[name].[hash:8][ext]"
|
|
}
|
|
};
|
|
if (!webpack5Config.output) {
|
|
webpack5Config.output = {};
|
|
}
|
|
if (isClient) {
|
|
webpack5Config.output.trustedTypes = "nextjs#bundler";
|
|
}
|
|
if (isClient || isEdgeServer) {
|
|
webpack5Config.output.enabledLibraryTypes = [
|
|
"assign"
|
|
];
|
|
}
|
|
// This enables managedPaths for all node_modules
|
|
// and also for the unplugged folder when using yarn pnp
|
|
// It also add the yarn cache to the immutable paths
|
|
webpack5Config.snapshot = {};
|
|
if (process.versions.pnp === "3") {
|
|
webpack5Config.snapshot.managedPaths = [
|
|
/^(.+?(?:[\\/]\.yarn[\\/]unplugged[\\/][^\\/]+)?[\\/]node_modules[\\/])/
|
|
];
|
|
} else {
|
|
webpack5Config.snapshot.managedPaths = [
|
|
/^(.+?[\\/]node_modules[\\/])/
|
|
];
|
|
}
|
|
if (process.versions.pnp === "3") {
|
|
webpack5Config.snapshot.immutablePaths = [
|
|
/^(.+?[\\/]cache[\\/][^\\/]+\.zip[\\/]node_modules[\\/])/
|
|
];
|
|
}
|
|
if (dev) {
|
|
if (!webpack5Config.optimization) {
|
|
webpack5Config.optimization = {};
|
|
}
|
|
// For Server Components, it's necessary to have provided exports collected
|
|
// to generate the correct flight manifest.
|
|
if (!hasServerComponents) {
|
|
webpack5Config.optimization.providedExports = false;
|
|
}
|
|
webpack5Config.optimization.usedExports = false;
|
|
}
|
|
const configVars = JSON.stringify({
|
|
appDir: config.experimental.appDir,
|
|
crossOrigin: config.crossOrigin,
|
|
pageExtensions: pageExtensions,
|
|
trailingSlash: config.trailingSlash,
|
|
buildActivity: config.devIndicators.buildActivity,
|
|
buildActivityPosition: config.devIndicators.buildActivityPosition,
|
|
productionBrowserSourceMaps: !!config.productionBrowserSourceMaps,
|
|
reactStrictMode: config.reactStrictMode,
|
|
optimizeFonts: config.optimizeFonts,
|
|
optimizeCss: config.experimental.optimizeCss,
|
|
nextScriptWorkers: config.experimental.nextScriptWorkers,
|
|
scrollRestoration: config.experimental.scrollRestoration,
|
|
serverActions: config.experimental.serverActions,
|
|
typedRoutes: config.experimental.typedRoutes,
|
|
basePath: config.basePath,
|
|
pageEnv: config.experimental.pageEnv,
|
|
excludeDefaultMomentLocales: config.excludeDefaultMomentLocales,
|
|
assetPrefix: config.assetPrefix,
|
|
disableOptimizedLoading,
|
|
isEdgeRuntime: isEdgeServer,
|
|
reactProductionProfiling,
|
|
webpack: !!config.webpack,
|
|
hasRewrites,
|
|
swcMinify: config.swcMinify,
|
|
swcLoader: useSWCLoader,
|
|
removeConsole: (_config_compiler5 = config.compiler) == null ? void 0 : _config_compiler5.removeConsole,
|
|
reactRemoveProperties: (_config_compiler6 = config.compiler) == null ? void 0 : _config_compiler6.reactRemoveProperties,
|
|
styledComponents: (_config_compiler7 = config.compiler) == null ? void 0 : _config_compiler7.styledComponents,
|
|
relay: (_config_compiler8 = config.compiler) == null ? void 0 : _config_compiler8.relay,
|
|
emotion: (_config_compiler9 = config.compiler) == null ? void 0 : _config_compiler9.emotion,
|
|
modularizeImports: config.modularizeImports,
|
|
legacyBrowsers: (_config_experimental1 = config.experimental) == null ? void 0 : _config_experimental1.legacyBrowsers,
|
|
imageLoaderFile: config.images.loaderFile
|
|
});
|
|
const cache = {
|
|
type: "filesystem",
|
|
// Includes:
|
|
// - Next.js version
|
|
// - next.config.js keys that affect compilation
|
|
version: `${"13.4.9"}|${configVars}`,
|
|
cacheDirectory: _path.default.join(distDir, "cache", "webpack"),
|
|
compression: "gzip"
|
|
};
|
|
// Adds `next.config.js` as a buildDependency when custom webpack config is provided
|
|
if (config.webpack && config.configFile) {
|
|
cache.buildDependencies = {
|
|
config: [
|
|
config.configFile
|
|
]
|
|
};
|
|
}
|
|
webpack5Config.cache = cache;
|
|
if (process.env.NEXT_WEBPACK_LOGGING) {
|
|
const infra = process.env.NEXT_WEBPACK_LOGGING.includes("infrastructure");
|
|
const profileClient = process.env.NEXT_WEBPACK_LOGGING.includes("profile-client");
|
|
const profileServer = process.env.NEXT_WEBPACK_LOGGING.includes("profile-server");
|
|
const summaryClient = process.env.NEXT_WEBPACK_LOGGING.includes("summary-client");
|
|
const summaryServer = process.env.NEXT_WEBPACK_LOGGING.includes("summary-server");
|
|
const profile = profileClient && isClient || profileServer && (isNodeServer || isEdgeServer);
|
|
const summary = summaryClient && isClient || summaryServer && (isNodeServer || isEdgeServer);
|
|
const logDefault = !infra && !profile && !summary;
|
|
if (logDefault || infra) {
|
|
webpack5Config.infrastructureLogging = {
|
|
level: "verbose",
|
|
debug: /FileSystemInfo/
|
|
};
|
|
}
|
|
if (logDefault || profile) {
|
|
webpack5Config.plugins.push((compiler)=>{
|
|
compiler.hooks.done.tap("next-webpack-logging", (stats)=>{
|
|
console.log(stats.toString({
|
|
colors: true,
|
|
logging: logDefault ? "log" : "verbose"
|
|
}));
|
|
});
|
|
});
|
|
} else if (summary) {
|
|
webpack5Config.plugins.push((compiler)=>{
|
|
compiler.hooks.done.tap("next-webpack-logging", (stats)=>{
|
|
console.log(stats.toString({
|
|
preset: "summary",
|
|
colors: true,
|
|
timings: true
|
|
}));
|
|
});
|
|
});
|
|
}
|
|
if (profile) {
|
|
const ProgressPlugin = _webpack.webpack.ProgressPlugin;
|
|
webpack5Config.plugins.push(new ProgressPlugin({
|
|
profile: true
|
|
}));
|
|
webpack5Config.profile = true;
|
|
}
|
|
}
|
|
webpackConfig = await (0, _config.buildConfiguration)(webpackConfig, {
|
|
supportedBrowsers,
|
|
rootDirectory: dir,
|
|
customAppFile: pagesDir ? new RegExp((0, _escaperegexp.escapeStringRegexp)(_path.default.join(pagesDir, `_app`))) : undefined,
|
|
hasAppDir,
|
|
isDevelopment: dev,
|
|
isServer: isNodeServer || isEdgeServer,
|
|
isEdgeRuntime: isEdgeServer,
|
|
targetWeb: isClient || isEdgeServer,
|
|
assetPrefix: config.assetPrefix || "",
|
|
sassOptions: config.sassOptions,
|
|
productionBrowserSourceMaps: config.productionBrowserSourceMaps,
|
|
future: config.future,
|
|
experimental: config.experimental,
|
|
disableStaticImages: config.images.disableStaticImages,
|
|
transpilePackages: config.transpilePackages,
|
|
serverSourceMaps: config.experimental.serverSourceMaps
|
|
});
|
|
// @ts-ignore Cache exists
|
|
webpackConfig.cache.name = `${webpackConfig.name}-${webpackConfig.mode}${isDevFallback ? "-fallback" : ""}`;
|
|
let originalDevtool = webpackConfig.devtool;
|
|
if (typeof config.webpack === "function") {
|
|
var _webpack5Config_experiments, _webpack5Config_experiments1;
|
|
webpackConfig = config.webpack(webpackConfig, {
|
|
dir,
|
|
dev,
|
|
isServer: isNodeServer || isEdgeServer,
|
|
buildId,
|
|
config,
|
|
defaultLoaders,
|
|
totalPages: Object.keys(entrypoints).length,
|
|
webpack: _webpack.webpack,
|
|
...isNodeServer || isEdgeServer ? {
|
|
nextRuntime: isEdgeServer ? "edge" : "nodejs"
|
|
} : {}
|
|
});
|
|
if (!webpackConfig) {
|
|
throw new Error(`Webpack config is undefined. You may have forgot to return properly from within the "webpack" method of your ${config.configFileName}.\n` + "See more info here https://nextjs.org/docs/messages/undefined-webpack-config");
|
|
}
|
|
if (dev && originalDevtool !== webpackConfig.devtool) {
|
|
webpackConfig.devtool = originalDevtool;
|
|
devtoolRevertWarning(originalDevtool);
|
|
}
|
|
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
const webpack5Config = webpackConfig;
|
|
// disable lazy compilation of entries as next.js has it's own method here
|
|
if (((_webpack5Config_experiments = webpack5Config.experiments) == null ? void 0 : _webpack5Config_experiments.lazyCompilation) === true) {
|
|
webpack5Config.experiments.lazyCompilation = {
|
|
entries: false
|
|
};
|
|
} else if (typeof ((_webpack5Config_experiments1 = webpack5Config.experiments) == null ? void 0 : _webpack5Config_experiments1.lazyCompilation) === "object" && webpack5Config.experiments.lazyCompilation.entries !== false) {
|
|
webpack5Config.experiments.lazyCompilation.entries = false;
|
|
}
|
|
if (typeof webpackConfig.then === "function") {
|
|
console.warn("> Promise returned in next config. https://nextjs.org/docs/messages/promise-in-next-config");
|
|
}
|
|
}
|
|
if (!config.images.disableStaticImages) {
|
|
var _webpackConfig_module2;
|
|
const rules = ((_webpackConfig_module2 = webpackConfig.module) == null ? void 0 : _webpackConfig_module2.rules) || [];
|
|
const hasCustomSvg = rules.some((rule)=>rule && typeof rule === "object" && rule.loader !== "next-image-loader" && "test" in rule && rule.test instanceof RegExp && rule.test.test(".svg"));
|
|
const nextImageRule = rules.find((rule)=>rule && typeof rule === "object" && rule.loader === "next-image-loader");
|
|
if (hasCustomSvg && nextImageRule && nextImageRule && typeof nextImageRule === "object") {
|
|
// Exclude svg if the user already defined it in custom
|
|
// webpack config such as `@svgr/webpack` plugin or
|
|
// the `babel-plugin-inline-react-svg` plugin.
|
|
nextImageRule.test = /\.(png|jpg|jpeg|gif|webp|avif|ico|bmp)$/i;
|
|
}
|
|
}
|
|
if (config.experimental.craCompat && ((_webpackConfig_module = webpackConfig.module) == null ? void 0 : _webpackConfig_module.rules) && webpackConfig.plugins) {
|
|
// CRA allows importing non-webpack handled files with file-loader
|
|
// these need to be the last rule to prevent catching other items
|
|
// https://github.com/facebook/create-react-app/blob/fddce8a9e21bf68f37054586deb0c8636a45f50b/packages/react-scripts/config/webpack.config.js#L594
|
|
const fileLoaderExclude = [
|
|
/\.(js|mjs|jsx|ts|tsx|json)$/
|
|
];
|
|
const fileLoader = {
|
|
exclude: fileLoaderExclude,
|
|
issuer: fileLoaderExclude,
|
|
type: "asset/resource"
|
|
};
|
|
const topRules = [];
|
|
const innerRules = [];
|
|
for (const rule of webpackConfig.module.rules){
|
|
if (!rule || typeof rule !== "object") continue;
|
|
if (rule.resolve) {
|
|
topRules.push(rule);
|
|
} else {
|
|
if (rule.oneOf && !(rule.test || rule.exclude || rule.resource || rule.issuer)) {
|
|
rule.oneOf.forEach((r)=>innerRules.push(r));
|
|
} else {
|
|
innerRules.push(rule);
|
|
}
|
|
}
|
|
}
|
|
webpackConfig.module.rules = [
|
|
...topRules,
|
|
{
|
|
oneOf: [
|
|
...innerRules,
|
|
fileLoader
|
|
]
|
|
}
|
|
];
|
|
}
|
|
// Backwards compat with webpack-dev-middleware options object
|
|
if (typeof config.webpackDevMiddleware === "function") {
|
|
const options = config.webpackDevMiddleware({
|
|
watchOptions: webpackConfig.watchOptions
|
|
});
|
|
if (options.watchOptions) {
|
|
webpackConfig.watchOptions = options.watchOptions;
|
|
}
|
|
}
|
|
function canMatchCss(rule) {
|
|
if (!rule) {
|
|
return false;
|
|
}
|
|
const fileNames = [
|
|
"/tmp/NEXTJS_CSS_DETECTION_FILE.css",
|
|
"/tmp/NEXTJS_CSS_DETECTION_FILE.scss",
|
|
"/tmp/NEXTJS_CSS_DETECTION_FILE.sass",
|
|
"/tmp/NEXTJS_CSS_DETECTION_FILE.less",
|
|
"/tmp/NEXTJS_CSS_DETECTION_FILE.styl"
|
|
];
|
|
if (rule instanceof RegExp && fileNames.some((input)=>rule.test(input))) {
|
|
return true;
|
|
}
|
|
if (typeof rule === "function") {
|
|
if (fileNames.some((input)=>{
|
|
try {
|
|
if (rule(input)) {
|
|
return true;
|
|
}
|
|
} catch (_) {}
|
|
return false;
|
|
})) {
|
|
return true;
|
|
}
|
|
}
|
|
if (Array.isArray(rule) && rule.some(canMatchCss)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
const hasUserCssConfig = ((_webpackConfig_module1 = webpackConfig.module) == null ? void 0 : (_webpackConfig_module_rules = _webpackConfig_module1.rules) == null ? void 0 : _webpackConfig_module_rules.some((rule)=>canMatchCss(rule.test) || canMatchCss(rule.include))) ?? false;
|
|
if (hasUserCssConfig) {
|
|
var _webpackConfig_module3, _webpackConfig_module_rules1, _webpackConfig_plugins, _webpackConfig_optimization, _webpackConfig_optimization_minimizer;
|
|
// only show warning for one build
|
|
if (isNodeServer || isEdgeServer) {
|
|
console.warn(_chalk.default.yellow.bold("Warning: ") + _chalk.default.bold("Built-in CSS support is being disabled due to custom CSS configuration being detected.\n") + "See here for more info: https://nextjs.org/docs/messages/built-in-css-disabled\n");
|
|
}
|
|
if ((_webpackConfig_module3 = webpackConfig.module) == null ? void 0 : (_webpackConfig_module_rules1 = _webpackConfig_module3.rules) == null ? void 0 : _webpackConfig_module_rules1.length) {
|
|
// Remove default CSS Loaders
|
|
webpackConfig.module.rules.forEach((r)=>{
|
|
if (!r || typeof r !== "object") return;
|
|
if (Array.isArray(r.oneOf)) {
|
|
r.oneOf = r.oneOf.filter((o)=>o[Symbol.for("__next_css_remove")] !== true);
|
|
}
|
|
});
|
|
}
|
|
if ((_webpackConfig_plugins = webpackConfig.plugins) == null ? void 0 : _webpackConfig_plugins.length) {
|
|
// Disable CSS Extraction Plugin
|
|
webpackConfig.plugins = webpackConfig.plugins.filter((p)=>p.__next_css_remove !== true);
|
|
}
|
|
if ((_webpackConfig_optimization = webpackConfig.optimization) == null ? void 0 : (_webpackConfig_optimization_minimizer = _webpackConfig_optimization.minimizer) == null ? void 0 : _webpackConfig_optimization_minimizer.length) {
|
|
// Disable CSS Minifier
|
|
webpackConfig.optimization.minimizer = webpackConfig.optimization.minimizer.filter((e)=>e.__next_css_remove !== true);
|
|
}
|
|
}
|
|
// Inject missing React Refresh loaders so that development mode is fast:
|
|
if (dev && isClient) {
|
|
attachReactRefresh(webpackConfig, defaultLoaders.babel);
|
|
}
|
|
// check if using @zeit/next-typescript and show warning
|
|
if ((isNodeServer || isEdgeServer) && webpackConfig.module && Array.isArray(webpackConfig.module.rules)) {
|
|
let foundTsRule = false;
|
|
webpackConfig.module.rules = webpackConfig.module.rules.filter((rule)=>{
|
|
if (!rule || typeof rule !== "object") return true;
|
|
if (!(rule.test instanceof RegExp)) return true;
|
|
if (rule.test.test("noop.ts") && !rule.test.test("noop.js")) {
|
|
// remove if it matches @zeit/next-typescript
|
|
foundTsRule = rule.use === defaultLoaders.babel;
|
|
return !foundTsRule;
|
|
}
|
|
return true;
|
|
});
|
|
if (foundTsRule) {
|
|
console.warn(`\n@zeit/next-typescript is no longer needed since Next.js has built-in support for TypeScript now. Please remove it from your ${config.configFileName} and your .babelrc\n`);
|
|
}
|
|
}
|
|
// Patch `@zeit/next-sass`, `@zeit/next-less`, `@zeit/next-stylus` for compatibility
|
|
if (webpackConfig.module && Array.isArray(webpackConfig.module.rules)) {
|
|
[].forEach.call(webpackConfig.module.rules, function(rule) {
|
|
if (!(rule.test instanceof RegExp && Array.isArray(rule.use))) {
|
|
return;
|
|
}
|
|
const isSass = rule.test.source === "\\.scss$" || rule.test.source === "\\.sass$";
|
|
const isLess = rule.test.source === "\\.less$";
|
|
const isCss = rule.test.source === "\\.css$";
|
|
const isStylus = rule.test.source === "\\.styl$";
|
|
// Check if the rule we're iterating over applies to Sass, Less, or CSS
|
|
if (!(isSass || isLess || isCss || isStylus)) {
|
|
return;
|
|
}
|
|
[].forEach.call(rule.use, function(use) {
|
|
if (!(use && typeof use === "object" && // Identify use statements only pertaining to `css-loader`
|
|
(use.loader === "css-loader" || use.loader === "css-loader/locals") && use.options && typeof use.options === "object" && // The `minimize` property is a good heuristic that we need to
|
|
// perform this hack. The `minimize` property was only valid on
|
|
// old `css-loader` versions. Custom setups (that aren't next-sass,
|
|
// next-less or next-stylus) likely have the newer version.
|
|
// We still handle this gracefully below.
|
|
(Object.prototype.hasOwnProperty.call(use.options, "minimize") || Object.prototype.hasOwnProperty.call(use.options, "exportOnlyLocals")))) {
|
|
return;
|
|
}
|
|
// Try to monkey patch within a try-catch. We shouldn't fail the build
|
|
// if we cannot pull this off.
|
|
// The user may not even be using the `next-sass` or `next-less` or
|
|
// `next-stylus` plugins.
|
|
// If it does work, great!
|
|
try {
|
|
// Resolve the version of `@zeit/next-css` as depended on by the Sass,
|
|
// Less or Stylus plugin.
|
|
const correctNextCss = require.resolve("@zeit/next-css", {
|
|
paths: [
|
|
isCss ? dir : require.resolve(isSass ? "@zeit/next-sass" : isLess ? "@zeit/next-less" : isStylus ? "@zeit/next-stylus" : "next")
|
|
]
|
|
});
|
|
// If we found `@zeit/next-css` ...
|
|
if (correctNextCss) {
|
|
// ... resolve the version of `css-loader` shipped with that
|
|
// package instead of whichever was hoisted highest in your
|
|
// `node_modules` tree.
|
|
const correctCssLoader = require.resolve(use.loader, {
|
|
paths: [
|
|
correctNextCss
|
|
]
|
|
});
|
|
if (correctCssLoader) {
|
|
// We saved the user from a failed build!
|
|
use.loader = correctCssLoader;
|
|
}
|
|
}
|
|
} catch (_) {
|
|
// The error is not required to be handled.
|
|
}
|
|
});
|
|
});
|
|
}
|
|
// Backwards compat for `main.js` entry key
|
|
// and setup of dependencies between entries
|
|
// we can't do that in the initial entry for
|
|
// backward-compat reasons
|
|
const originalEntry = webpackConfig.entry;
|
|
if (typeof originalEntry !== "undefined") {
|
|
const updatedEntry = async ()=>{
|
|
const entry = typeof originalEntry === "function" ? await originalEntry() : originalEntry;
|
|
// Server compilation doesn't have main.js
|
|
if (clientEntries && Array.isArray(entry["main.js"]) && entry["main.js"].length > 0) {
|
|
const originalFile = clientEntries[_constants1.CLIENT_STATIC_FILES_RUNTIME_MAIN];
|
|
entry[_constants1.CLIENT_STATIC_FILES_RUNTIME_MAIN] = [
|
|
...entry["main.js"],
|
|
originalFile
|
|
];
|
|
}
|
|
delete entry["main.js"];
|
|
for (const name of Object.keys(entry)){
|
|
entry[name] = (0, _entries.finalizeEntrypoint)({
|
|
value: entry[name],
|
|
compilerType,
|
|
name,
|
|
hasAppDir
|
|
});
|
|
}
|
|
return entry;
|
|
};
|
|
// @ts-ignore webpack 5 typings needed
|
|
webpackConfig.entry = updatedEntry;
|
|
}
|
|
if (!dev && typeof webpackConfig.entry === "function") {
|
|
// entry is always a function
|
|
webpackConfig.entry = await webpackConfig.entry();
|
|
}
|
|
return webpackConfig;
|
|
}
|
|
|
|
//# sourceMappingURL=webpack-config.js.map
|