UNPKG

next

Version:

The React Framework

411 lines (410 loc) • 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { getJestSWCOptions: null, getLoaderSWCOptions: null, getParserOptions: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { getJestSWCOptions: function() { return getJestSWCOptions; }, getLoaderSWCOptions: function() { return getLoaderSWCOptions; }, getParserOptions: function() { return getParserOptions; } }); const _path = /*#__PURE__*/ _interop_require_default(require("path")); const _constants = require("../../lib/constants"); const _utils = require("../utils"); const _escaperegexp = require("../../shared/lib/escape-regexp"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const nextDirname = _path.default.dirname(require.resolve('next/package.json')); const nextDistPath = new RegExp(`${(0, _escaperegexp.escapeStringRegexp)(nextDirname)}[\\/]dist[\\/](shared[\\/]lib|client|pages)`); const nodeModulesPath = /[\\/]node_modules[\\/]/; const regeneratorRuntimePath = require.resolve('next/dist/compiled/regenerator-runtime'); function isTypeScriptFile(filename) { return filename.endsWith('.ts') || filename.endsWith('.tsx'); } function isCommonJSFile(filename) { return filename.endsWith('.cjs'); } // Ensure Next.js internals and .cjs files are output as CJS modules, // By default all modules are output as ESM or will treated as CJS if next-swc/auto-cjs plugin detects file is CJS. function shouldOutputCommonJs(filename) { return isCommonJSFile(filename) || nextDistPath.test(filename); } function getParserOptions({ filename, jsConfig, ...rest }) { var _jsConfig_compilerOptions; const isTSFile = filename.endsWith('.ts'); const hasTsSyntax = isTypeScriptFile(filename); const enableDecorators = Boolean(jsConfig == null ? void 0 : (_jsConfig_compilerOptions = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions.experimentalDecorators); return { ...rest, syntax: hasTsSyntax ? 'typescript' : 'ecmascript', dynamicImport: true, decorators: enableDecorators, // Exclude regular TypeScript files from React transformation to prevent e.g. generic parameters and angle-bracket type assertion from being interpreted as JSX tags. [hasTsSyntax ? 'tsx' : 'jsx']: !isTSFile, importAssertions: true }; } function getBaseSWCOptions({ filename, jest, development, hasReactRefresh, globalWindow, esm, configDir, modularizeImports, swcPlugins, compilerOptions, resolvedBaseUrl, jsConfig, supportedBrowsers, swcCacheDir, serverComponents, serverReferenceHashSalt, bundleLayer, isCacheComponents, cacheHandlers, useCacheEnabled, taintEnabled, trackDynamicImports, pageExtensions }) { var _jsConfig_compilerOptions, _jsConfig_compilerOptions1, _jsConfig_compilerOptions2, _jsConfig_compilerOptions3, _jsConfig_compilerOptions4, _jsConfig_experimental; const isReactServerLayer = (0, _utils.shouldUseReactServerCondition)(bundleLayer); const isAppRouterPagesLayer = (0, _utils.isWebpackAppPagesLayer)(bundleLayer); const parserConfig = getParserOptions({ filename, jsConfig }); const paths = jsConfig == null ? void 0 : (_jsConfig_compilerOptions = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions.paths; const enableDecorators = Boolean(jsConfig == null ? void 0 : (_jsConfig_compilerOptions1 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions1.experimentalDecorators); const emitDecoratorMetadata = Boolean(jsConfig == null ? void 0 : (_jsConfig_compilerOptions2 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions2.emitDecoratorMetadata); const useDefineForClassFields = Boolean(jsConfig == null ? void 0 : (_jsConfig_compilerOptions3 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions3.useDefineForClassFields); const plugins = (swcPlugins ?? []).filter(Array.isArray).map(([name, options])=>[ require.resolve(name, configDir ? { paths: [ configDir ] } : undefined), options ]); return { jsc: { ...resolvedBaseUrl && paths ? { baseUrl: resolvedBaseUrl.baseUrl, paths } : {}, externalHelpers: !process.versions.pnp && !jest, parser: parserConfig, experimental: { keepImportAttributes: true, emitAssertForImportAttributes: true, plugins, cacheRoot: swcCacheDir }, transform: { // Enables https://github.com/swc-project/swc/blob/0359deb4841be743d73db4536d4a22ac797d7f65/crates/swc_ecma_ext_transforms/src/jest.rs ...jest ? { hidden: { jest: true } } : {}, legacyDecorator: enableDecorators, decoratorMetadata: emitDecoratorMetadata, useDefineForClassFields: useDefineForClassFields, react: { importSource: (jsConfig == null ? void 0 : (_jsConfig_compilerOptions4 = jsConfig.compilerOptions) == null ? void 0 : _jsConfig_compilerOptions4.jsxImportSource) ?? ((compilerOptions == null ? void 0 : compilerOptions.emotion) && !isReactServerLayer ? '@emotion/react' : 'react'), runtime: 'automatic', pragmaFrag: 'React.Fragment', throwIfNamespace: true, development: !!development, useBuiltins: true, refresh: !!hasReactRefresh }, optimizer: { simplify: false, globals: jest ? undefined : { typeofs: { window: globalWindow ? 'object' : 'undefined' }, envs: { NODE_ENV: development ? '"development"' : '"production"' } } }, regenerator: { importPath: regeneratorRuntimePath } } }, sourceMaps: jest ? 'inline' : undefined, removeConsole: compilerOptions == null ? void 0 : compilerOptions.removeConsole, // disable "reactRemoveProperties" when "jest" is true // otherwise the setting from next.config.js will be used reactRemoveProperties: jest ? false : compilerOptions == null ? void 0 : compilerOptions.reactRemoveProperties, // Map the k-v map to an array of pairs. modularizeImports: modularizeImports ? Object.fromEntries(Object.entries(modularizeImports).map(([mod, config])=>[ mod, { ...config, transform: typeof config.transform === 'string' ? config.transform : Object.entries(config.transform).map(([key, value])=>[ key, value ]) } ])) : undefined, relay: compilerOptions == null ? void 0 : compilerOptions.relay, // Always transform styled-jsx and error when `client-only` condition is triggered styledJsx: (compilerOptions == null ? void 0 : compilerOptions.styledJsx) ?? { useLightningcss: (jsConfig == null ? void 0 : (_jsConfig_experimental = jsConfig.experimental) == null ? void 0 : _jsConfig_experimental.useLightningcss) ?? false }, // Disable css-in-js libs (without client-only integration) transform on server layer for server components ...!isReactServerLayer && { emotion: getEmotionOptions(compilerOptions == null ? void 0 : compilerOptions.emotion, development), styledComponents: getStyledComponentsOptions(compilerOptions == null ? void 0 : compilerOptions.styledComponents, development) }, serverComponents: serverComponents && !jest ? { isReactServerLayer, cacheComponentsEnabled: isCacheComponents, useCacheEnabled, taintEnabled, pageExtensions: pageExtensions || [] } : undefined, serverActions: isAppRouterPagesLayer && !jest ? { isReactServerLayer, isDevelopment: development, useCacheEnabled, hashSalt: serverReferenceHashSalt, cacheKinds: [ 'default', 'remote', 'private' ].concat(cacheHandlers ? Object.keys(cacheHandlers) : []) } : undefined, // For app router we prefer to bundle ESM, // On server side of pages router we prefer CJS. preferEsm: esm, lintCodemodComments: true, trackDynamicImports: trackDynamicImports, debugFunctionName: development, ...supportedBrowsers && supportedBrowsers.length > 0 ? { cssEnv: { targets: supportedBrowsers } } : {} }; } function getStyledComponentsOptions(styledComponentsConfig, development) { if (!styledComponentsConfig) { return null; } else if (typeof styledComponentsConfig === 'object') { return { ...styledComponentsConfig, displayName: styledComponentsConfig.displayName ?? Boolean(development) }; } else { return { displayName: Boolean(development) }; } } function getEmotionOptions(emotionConfig, development) { if (!emotionConfig) { return null; } let autoLabel = !!development; if (typeof emotionConfig === 'object' && emotionConfig.autoLabel) { switch(emotionConfig.autoLabel){ case 'never': autoLabel = false; break; case 'always': autoLabel = true; break; case 'dev-only': break; default: emotionConfig.autoLabel; } } return { enabled: true, autoLabel, sourcemap: development, ...typeof emotionConfig === 'object' && { importMap: emotionConfig.importMap, labelFormat: emotionConfig.labelFormat, sourcemap: development && emotionConfig.sourceMap } }; } function getJestSWCOptions({ isServer, filename, esm, modularizeImports, configDir, swcPlugins, compilerOptions, jsConfig, resolvedBaseUrl, pagesDir, imageConfig, serverReferenceHashSalt }) { let baseOptions = getBaseSWCOptions({ filename, jest: true, development: false, hasReactRefresh: false, configDir, globalWindow: !isServer, modularizeImports, swcPlugins, compilerOptions, jsConfig, resolvedBaseUrl, supportedBrowsers: undefined, esm, // Don't apply server layer transformations for Jest // Disable server / client graph assertions for Jest bundleLayer: undefined, serverComponents: false, serverReferenceHashSalt }); // In production, webpack DefinePlugin replaces process.env.__NEXT_IMAGE_OPTS // with an object literal at compile time. Emulate that here by enabling // SWC's optimizer globals.envs so the same compile-time replacement happens // during Jest transforms. if (imageConfig) { var _baseOptions_jsc_transform_optimizer_globals; baseOptions.jsc.transform.optimizer.globals = { envs: { ...(_baseOptions_jsc_transform_optimizer_globals = baseOptions.jsc.transform.optimizer.globals) == null ? void 0 : _baseOptions_jsc_transform_optimizer_globals.envs, __NEXT_IMAGE_OPTS: JSON.stringify(imageConfig) } }; } const useCjsModules = shouldOutputCommonJs(filename); return { ...baseOptions, env: { targets: { // Targets the current version of Node.js node: process.versions.node } }, module: { type: esm && !useCjsModules ? 'es6' : 'commonjs' }, disableNextSsg: true, pagesDir }; } function getLoaderSWCOptions({ // This is not passed yet as "paths" resolving is handled by webpack currently. // resolvedBaseUrl, filename, development, isServer, pagesDir, appDir, isPageFile, isCacheComponents, hasReactRefresh, // The folder containing the next.config.js, used for resolving relative config paths. configDir, modularizeImports, optimizeServerReact, optimizePackageImports, swcPlugins, swcEnvOptions, compilerOptions, jsConfig, supportedBrowsers, swcCacheDir, relativeFilePathFromRoot, serverComponents, serverReferenceHashSalt, bundleLayer, esm, cacheHandlers, useCacheEnabled, taintEnabled, trackDynamicImports, pageExtensions }) { let baseOptions = getBaseSWCOptions({ filename, development, globalWindow: !isServer, hasReactRefresh, configDir, modularizeImports, swcPlugins, compilerOptions, jsConfig, // resolvedBaseUrl, supportedBrowsers, swcCacheDir, bundleLayer, serverComponents, serverReferenceHashSalt, esm: !!esm, isCacheComponents, cacheHandlers, useCacheEnabled, taintEnabled, trackDynamicImports, pageExtensions }); baseOptions.fontLoaders = { fontLoaders: [ 'next/font/local', 'next/font/google' ], relativeFilePathFromRoot }; baseOptions.cjsRequireOptimizer = { packages: { 'next/server': { transforms: { NextRequest: 'next/dist/server/web/spec-extension/request', NextResponse: 'next/dist/server/web/spec-extension/response', ImageResponse: 'next/dist/server/web/spec-extension/image-response', userAgentFromString: 'next/dist/server/web/spec-extension/user-agent', userAgent: 'next/dist/server/web/spec-extension/user-agent' } } } }; if (optimizeServerReact && isServer && !development) { baseOptions.optimizeServerReact = { optimize_use_state: false }; } // Modularize import optimization for barrel files if (optimizePackageImports) { baseOptions.autoModularizeImports = { packages: optimizePackageImports }; } const isNodeModules = nodeModulesPath.test(filename); const isAppBrowserLayer = bundleLayer === _constants.WEBPACK_LAYERS.appPagesBrowser; const moduleResolutionConfig = shouldOutputCommonJs(filename) ? { module: { type: 'commonjs' } } : {}; let options; if (isServer) { options = { ...baseOptions, ...moduleResolutionConfig, // Disables getStaticProps/getServerSideProps tree shaking on the server compilation for pages disableNextSsg: true, isDevelopment: development, isServerCompiler: isServer, pagesDir, appDir, preferEsm: !!esm, isPageFile, env: { targets: { // Targets the current version of Node.js node: process.versions.node } } }; } else { options = { ...baseOptions, ...moduleResolutionConfig, disableNextSsg: !isPageFile, isDevelopment: development, isServerCompiler: isServer, pagesDir, appDir, isPageFile, ...supportedBrowsers && supportedBrowsers.length > 0 ? { env: { targets: supportedBrowsers, ...swcEnvOptions } } : {} }; if (!options.env) { // Matches default @babel/preset-env behavior options.jsc.target = 'es5'; } } // For node_modules in app browser layer, we don't need to do any server side transformation. // Only keep server actions transform to discover server actions from client components. if (isAppBrowserLayer && isNodeModules) { var _options_jsc_transform_optimizer_globals; options.disableNextSsg = true; options.isPageFile = false; options.optimizeServerReact = undefined; options.cjsRequireOptimizer = undefined; // Disable optimizer for node_modules in app browser layer, to avoid unnecessary replacement. // e.g. typeof window could result differently in js worker or browser. if (((_options_jsc_transform_optimizer_globals = options.jsc.transform.optimizer.globals) == null ? void 0 : _options_jsc_transform_optimizer_globals.typeofs) && !filename.includes(nextDirname)) { delete options.jsc.transform.optimizer.globals.typeofs.window; } } return options; } //# sourceMappingURL=options.js.map