You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
8.9 KiB
JavaScript
211 lines
8.9 KiB
JavaScript
|
9 months ago
|
"use strict";
|
||
|
|
Object.defineProperty(exports, "__esModule", {
|
||
|
|
value: true
|
||
|
|
});
|
||
|
|
Object.defineProperty(exports, "validateTurboNextConfig", {
|
||
|
|
enumerable: true,
|
||
|
|
get: function() {
|
||
|
|
return validateTurboNextConfig;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
||
|
|
const _config = /*#__PURE__*/ _interop_require_default(require("../server/config"));
|
||
|
|
const _log = /*#__PURE__*/ _interop_require_wildcard(require("../build/output/log"));
|
||
|
|
const _constants = require("../shared/lib/constants");
|
||
|
|
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 unsupportedTurbopackNextConfigOptions = [
|
||
|
|
// is this supported?
|
||
|
|
// 'amp',
|
||
|
|
// 'experimental.amp',
|
||
|
|
// Left to be implemented (priority)
|
||
|
|
// 'experimental.clientRouterFilter',
|
||
|
|
// 'experimental.optimizePackageImports',
|
||
|
|
// 'compiler.emotion',
|
||
|
|
"compiler.reactRemoveProperties",
|
||
|
|
// 'compiler.relay',
|
||
|
|
"compiler.removeConsole",
|
||
|
|
// 'compiler.styledComponents',
|
||
|
|
"experimental.fetchCacheKeyPrefix",
|
||
|
|
// Left to be implemented
|
||
|
|
// 'excludeDefaultMomentLocales',
|
||
|
|
// 'experimental.optimizeServerReact',
|
||
|
|
"experimental.clientRouterFilterAllowedRate",
|
||
|
|
// 'experimental.serverMinification',
|
||
|
|
// 'experimental.serverSourceMaps',
|
||
|
|
"experimental.adjustFontFallbacks",
|
||
|
|
"experimental.adjustFontFallbacksWithSizeAdjust",
|
||
|
|
"experimental.allowedRevalidateHeaderKeys",
|
||
|
|
"experimental.bundlePagesExternals",
|
||
|
|
"experimental.extensionAlias",
|
||
|
|
"experimental.fallbackNodePolyfills",
|
||
|
|
"experimental.sri.algorithm",
|
||
|
|
"experimental.swcTraceProfiling",
|
||
|
|
"experimental.typedRoutes",
|
||
|
|
// Left to be implemented (Might not be needed for Turbopack)
|
||
|
|
"experimental.craCompat",
|
||
|
|
"experimental.disablePostcssPresetEnv",
|
||
|
|
"experimental.esmExternals",
|
||
|
|
// This is used to force swc-loader to run regardless of finding Babel.
|
||
|
|
"experimental.forceSwcTransforms",
|
||
|
|
"experimental.fullySpecified",
|
||
|
|
"experimental.urlImports"
|
||
|
|
];
|
||
|
|
// The following will need to be supported by `next build --turbo`
|
||
|
|
const prodSpecificTurboNextConfigOptions = [
|
||
|
|
"eslint",
|
||
|
|
"typescript",
|
||
|
|
"outputFileTracing",
|
||
|
|
"generateBuildId",
|
||
|
|
"compress",
|
||
|
|
"productionBrowserSourceMaps",
|
||
|
|
"optimizeFonts",
|
||
|
|
"poweredByHeader",
|
||
|
|
"staticPageGenerationTimeout",
|
||
|
|
"reactProductionProfiling",
|
||
|
|
"cleanDistDir",
|
||
|
|
"experimental.turbotrace",
|
||
|
|
"experimental.outputFileTracingRoot",
|
||
|
|
"experimental.outputFileTracingExcludes",
|
||
|
|
"experimental.outputFileTracingIgnores",
|
||
|
|
"experimental.outputFileTracingIncludes"
|
||
|
|
];
|
||
|
|
async function validateTurboNextConfig({ dir, isDev }) {
|
||
|
|
const { getPkgManager } = require("../lib/helpers/get-pkg-manager");
|
||
|
|
const { getBabelConfigFile } = require("../build/get-babel-config-file");
|
||
|
|
const { defaultConfig } = require("../server/config-shared");
|
||
|
|
const { bold, cyan, red, underline } = require("../lib/picocolors");
|
||
|
|
const { interopDefault } = require("../lib/interop-default");
|
||
|
|
let unsupportedParts = "";
|
||
|
|
let babelrc = await getBabelConfigFile(dir);
|
||
|
|
if (babelrc) babelrc = _path.default.basename(babelrc);
|
||
|
|
let hasWebpack = false;
|
||
|
|
let hasTurbo = !!process.env.TURBOPACK;
|
||
|
|
let unsupportedConfig = [];
|
||
|
|
let rawNextConfig = {};
|
||
|
|
try {
|
||
|
|
rawNextConfig = interopDefault(await (0, _config.default)(_constants.PHASE_DEVELOPMENT_SERVER, dir, {
|
||
|
|
rawConfig: true
|
||
|
|
}));
|
||
|
|
if (typeof rawNextConfig === "function") {
|
||
|
|
rawNextConfig = rawNextConfig(_constants.PHASE_DEVELOPMENT_SERVER, {
|
||
|
|
defaultConfig
|
||
|
|
});
|
||
|
|
}
|
||
|
|
const flattenKeys = (obj, prefix = "")=>{
|
||
|
|
let keys = [];
|
||
|
|
for(const key in obj){
|
||
|
|
if (typeof (obj == null ? void 0 : obj[key]) === "undefined") {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
const pre = prefix.length ? `${prefix}.` : "";
|
||
|
|
if (typeof obj[key] === "object" && !Array.isArray(obj[key]) && obj[key] !== null) {
|
||
|
|
keys = keys.concat(flattenKeys(obj[key], pre + key));
|
||
|
|
} else {
|
||
|
|
keys.push(pre + key);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return keys;
|
||
|
|
};
|
||
|
|
const getDeepValue = (obj, keys)=>{
|
||
|
|
if (typeof keys === "string") {
|
||
|
|
keys = keys.split(".");
|
||
|
|
}
|
||
|
|
if (keys.length === 1) {
|
||
|
|
return obj == null ? void 0 : obj[keys == null ? void 0 : keys[0]];
|
||
|
|
}
|
||
|
|
return getDeepValue(obj == null ? void 0 : obj[keys == null ? void 0 : keys[0]], keys.slice(1));
|
||
|
|
};
|
||
|
|
const customKeys = flattenKeys(rawNextConfig);
|
||
|
|
let unsupportedKeys = isDev ? unsupportedTurbopackNextConfigOptions : prodSpecificTurboNextConfigOptions;
|
||
|
|
for (const key of customKeys){
|
||
|
|
if (key.startsWith("webpack")) {
|
||
|
|
hasWebpack = true;
|
||
|
|
}
|
||
|
|
if (key.startsWith("experimental.turbo")) {
|
||
|
|
hasTurbo = true;
|
||
|
|
}
|
||
|
|
let isUnsupported = unsupportedKeys.some((unsupportedKey)=>// Either the key matches (or is a more specific subkey) of
|
||
|
|
// unsupportedKey, or the key is the path to a specific subkey.
|
||
|
|
// | key | unsupportedKey |
|
||
|
|
// |---------|----------------|
|
||
|
|
// | foo | foo |
|
||
|
|
// | foo.bar | foo |
|
||
|
|
// | foo | foo.bar |
|
||
|
|
key.startsWith(unsupportedKey) || unsupportedKey.startsWith(`${key}.`)) && getDeepValue(rawNextConfig, key) !== getDeepValue(defaultConfig, key);
|
||
|
|
if (isUnsupported) {
|
||
|
|
unsupportedConfig.push(key);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
} catch (e) {
|
||
|
|
_log.error("Unexpected error occurred while checking config", e);
|
||
|
|
}
|
||
|
|
const feedbackMessage = `Learn more about Next.js and Turbopack: ${underline("https://nextjs.link/with-turbopack")}\n`;
|
||
|
|
if (hasWebpack && !hasTurbo) {
|
||
|
|
_log.warn(`Webpack is configured while Turbopack is not, which may cause problems.`);
|
||
|
|
_log.warn(`See instructions if you need to configure Turbopack:\n https://turbo.build/pack/docs/features/customizing-turbopack\n`);
|
||
|
|
}
|
||
|
|
if (babelrc) {
|
||
|
|
unsupportedParts += `Babel detected (${cyan(babelrc)})\n Babel is not yet supported. To use Turbopack at the moment,\n you'll need to remove your usage of Babel.`;
|
||
|
|
}
|
||
|
|
if (unsupportedConfig.length === 1 && unsupportedConfig[0] === "experimental.optimizePackageImports") {
|
||
|
|
_log.warn(`'experimental.optimizePackageImports' is not yet supported by Turbopack and will be ignored.`);
|
||
|
|
} else if (unsupportedConfig.length) {
|
||
|
|
unsupportedParts += `\n\n- Unsupported Next.js configuration option(s) (${cyan("next.config.js")})\n To use Turbopack, remove the following configuration options:\n${unsupportedConfig.map((name)=>` - ${red(name)}\n`).join("")}`;
|
||
|
|
}
|
||
|
|
if (unsupportedParts) {
|
||
|
|
const pkgManager = getPkgManager(dir);
|
||
|
|
_log.error(`You are using configuration and/or tools that are not yet\nsupported by Next.js with Turbopack:\n${unsupportedParts}\n
|
||
|
|
If you cannot make the changes above, but still want to try out\nNext.js with Turbopack, create the Next.js playground app\nby running the following commands:
|
||
|
|
|
||
|
|
${bold(cyan(`${pkgManager === "npm" ? "npx create-next-app" : `${pkgManager} create next-app`} --example with-turbopack with-turbopack-app`))}\n cd with-turbopack-app\n ${pkgManager} run dev
|
||
|
|
`);
|
||
|
|
_log.warn(feedbackMessage);
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
return rawNextConfig;
|
||
|
|
}
|
||
|
|
|
||
|
|
//# sourceMappingURL=turbopack-warning.js.map
|