Skip to main content
doc0blade47/next.jsdocumentation home
Sign in

TypeScript Plugin

Last updated Oct 12, 2026100% grounded
Relevant source files

The following files were used as context for generating this wiki page:

Overview

The Next.js TypeScript plugin acts as an integrated language service extension that enhances the developer experience within the app directory by enforcing correct file conventions, validating segment configuration exports, and policing component boundaries. It provides intelligent autocompletion, hover hints, and diagnostic error checking directly inside editors supporting the TypeScript Language Service protocol. Sources: packages/next/src/server/typescript/index.ts:1-10

By proxying language service requests, the plugin intercepts semantic diagnostics, completion entries, and quick info lookups to restrict unauthorized React APIs in server components, validate route segment options, verify serialization constraints for "use client" and "use server" boundaries, and enforce proper component signatures. Sources: packages/next/src/server/typescript/index.ts:60-175, packages/next/src/server/typescript/index.ts:178-270

Language service plugin architecture

Plugin Initialization and Request Proxying

The Next.js TypeScript plugin exports a createTSPlugin function adhering to the tsModule.server.PluginModuleFactory signature. It receives a factory context containing the TypeScript module reference and returns an inner create closure taking a tsModule.server.PluginCreateInfo object. The plugin checks user configurations in tsconfig.json through info.config.enabled, defaulting to true. If disabled, it immediately returns the unmodified language service. When enabled, it calls init with the TypeScript module and creation info to set up project directory boundaries and regular expression matching for the app directory. Sources: packages/next/src/server/typescript/index.ts:31-48, packages/next/src/server/typescript/utils.ts:15-27

To intercept language service queries without breaking standard editing features, the plugin establishes a decorated proxy object using Object.create(null) and iterates over all keys of info.languageService. Each method is wrapped to delegate execution back to the underlying language service instance. Specific handlers such as getCompletionsAtPosition, getCompletionEntryDetails, getQuickInfoAtPosition, and getSemanticDiagnostics are overridden to inject custom diagnostics, filter out disallowed completions, or modify quick info tooltips for Next.js app directory files. Sources: packages/next/src/server/typescript/index.ts:51-176, packages/next/src/server/typescript/index.ts:178-270

Note

The language service proxy copies all native methods from info.languageService into a new dictionary object to preserve editor functionality while selectively layering custom AST rule checks over app directory files. Sources: packages/next/src/server/typescript/index.ts:51-57

Call-Chain Execution Walkthrough: create to log

During semantic diagnostics collection or entry analysis, the plugin executes the explicit call chain create() → getEntryInfo() → getSource() → log(). When diagnostic checking evaluates a file via getSemanticDiagnostics, it invokes getEntryInfo(fileName, true) from packages/next/src/server/typescript/index.ts:187. getEntryInfo() immediately calls getSource(fileName) from packages/next/src/server/typescript/utils.ts:122 to query the language service program for the file's AST SourceFile. When initialization runs, init() invokes log(message) from packages/next/src/server/typescript/utils.ts:26 to record plugin status through the project service logger. Sources: packages/next/src/server/typescript/index.ts:187-190, packages/next/src/server/typescript/utils.ts:10-12, packages/next/src/server/typescript/utils.ts:26-26, packages/next/src/server/typescript/utils.ts:51-58, packages/next/src/server/typescript/utils.ts:118-123

Sources: packages/next/src/server/typescript/index.ts:187-190, packages/next/src/server/typescript/utils.ts:10-12, packages/next/src/server/typescript/utils.ts:26-26, packages/next/src/server/typescript/utils.ts:51-58, packages/next/src/server/typescript/utils.ts:118-123

AST Utilities and Request Dispatching

The plugin provides helper functions in utils.ts to inspect Abstract Syntax Tree nodes and evaluate file paths against the app directory structure. Path validation relies on appDirRegExp, generated dynamically from the project's current working directory to match both standard app folders and src/app layouts. Sources: packages/next/src/server/typescript/utils.ts:19-27, packages/next/src/server/typescript/utils.ts:101-115

Utility FunctionParameter SignatureReturn TypePurpose
initopts: { ts: TypeScript, info: PluginCreateInfo }voidSets up project directory regex patterns and global references.
getTypeCheckernonetsModule.TypeChecker | undefinedRetrieves the type checker from the active language service program.
getSourcefileName: stringtsModule.SourceFile | undefinedFetches the parsed AST SourceFile for a given file path.
isPositionInsideNodeposition: number, node: tsModule.NodebooleanVerifies whether an editor cursor position falls within a node span.
isDefaultFunctionExportnode: tsModule.Nodeboolean guardChecks if an AST node represents an export default function declaration.
isInsideAppfilePath: stringbooleanTests whether a file path resides inside the configured app directory.
isAppEntryFilefilePath: stringbooleanConfirms if a file path matches page or layout extensions within app.
getEntryInfofileName: string, throwOnInvalidDirective?: boolean{ client: boolean, server: boolean }Parses leading string literals to detect "use client" or "use server" directives.

Sources: packages/next/src/server/typescript/utils.ts:15-181

Warning

Directive scanning in getEntryInfo stops tracking boundaries as soon as a non-expression statement or non-string literal node is encountered; directives placed below other statements are treated as invalid and will throw diagnostic errors if strict validation is enabled. Sources: packages/next/src/server/typescript/utils.ts:128-176

Segment config validation and completion

Segment Configuration Validation and Autocompletion

The TypeScript plugin validates route segment configurations and allowed entry exports within Next.js application files. It verifies variable declarations against a defined schema of allowed entry identifiers and reports semantic errors when invalid configuration options or values are supplied. Sources: packages/next/src/server/typescript/rules/config.ts:1-28, packages/next/src/server/typescript/rules/config.ts:620-642

Export IdentifierDescription / Allowed Values
configLegacy configuration export object.
generateStaticParamsFunction to generate static route parameters.
unstable_paramMatchingExperimental parameter matching definition.
unstable_generateParamMatchingExperimental parameter matching generator function.
metadataStatic metadata object for the page or layout.
generateMetadataAsynchronous or synchronous function returning dynamic Metadata.
viewportStatic viewport configuration object.
generateViewportFunction returning dynamic viewport settings.

Sources: packages/next/src/server/typescript/constant.ts:15-24

Warning

Export names that match neither ALLOWED_EXPORTS nor the configuration schema defined in API_DOCS trigger NEXT_TS_ERRORS.INVALID_ENTRY_EXPORT with code 71002, flagging the exact token span as an invalid Next.js entry export value. Sources: packages/next/src/server/typescript/constant.ts:3-3, packages/next/src/server/typescript/rules/config.ts:632-641

Metadata Import Code Actions

When autocompleting or inspecting metadata or generateMetadata entry points, the plugin checks the target source file for an existing type import from the 'next' module. If no import for Metadata is present, it provides an automatic code action to inject import type { Metadata } from 'next'; directly beneath top-level directive strings such as "use client". Sources: packages/next/src/server/typescript/rules/config.ts:504-602

Note

The metadata import insertion visitor inspects top-level string literal statements for expressions starting with use to position the import below directives while avoiding invalid placement. Sources: packages/next/src/server/typescript/rules/config.ts:530-542

Client boundary restrictions and diagnostics

Validating Client Component Props and Serializability

The TypeScript plugin inspects variable statements and function declarations in files carrying the "use client" directive to verify that component props adhere to serialization constraints. When analyzing function parameters, the plugin evaluates type literal members to detect non-serializable property types such as functions, constructors, and class declarations, emitting diagnostic warnings when invalid prop types are supplied across client boundaries. Sources: packages/next/src/server/typescript/rules/client-boundary.ts:7-49

export const NEXT_TS_ERRORS = {
  INVALID_SERVER_API: 71001,
  INVALID_ENTRY_EXPORT: 71002,
  INVALID_OPTION_VALUE: 71003,
  MISPLACED_ENTRY_DIRECTIVE: 71004,
  INVALID_PAGE_PROP: 71005,
  INVALID_CONFIG_OPTION: 71006,
  INVALID_CLIENT_ENTRY_PROP: 71007,
  INVALID_METADATA_EXPORT: 71008,
  INVALID_ERROR_COMPONENT: 71009,
  INVALID_ENTRY_DIRECTIVE: 71010,
  INVALID_SERVER_ENTRY_RETURN: 71011,
}

Sources: packages/next/src/server/typescript/constant.ts:1-13

Warning

The plugin flags invalid client entry props using diagnostic code 71007 (NEXT_TS_ERRORS.INVALID_CLIENT_ENTRY_PROP) with category DiagnosticCategory.Warning when encountering function types, constructor types, or class declarations that are not recognized as Server Actions or framework-managed error boundary props. Sources: packages/next/src/server/typescript/rules/client-boundary.ts:88-114

Server Actions and Error Boundary Exceptions

To accommodate legitimate callback patterns and framework integrations, the plugin applies specific naming and file-path heuristics before raising serializability diagnostics on function-typed props. Properties named action or ending with Action (such as formAction) are permitted under the assumption that they represent Server Actions. Additionally, files matching error.tsx or global-error.tsx are evaluated against framework-injected recovery functions (reset and retry), exempting them from client component serialization rules. Sources: packages/next/src/server/typescript/rules/client-boundary.ts:43-87

Note

Structural type checking cannot distinguish between arbitrary closures and Server Actions until TypeScript exposes directive metadata directly in function types, so the plugin uses property naming conventions as a heuristic to avoid high rates of false positives. Sources: packages/next/src/server/typescript/rules/client-boundary.ts:68-74

Server actions and boundaries validation

Verifying Async Signatures in Server Modules

The TypeScript plugin validates files governed by the "use server" directive to ensure that all exported entities conform to asynchronous execution requirements. Using the type checker, the plugin inspects export declarations, variable statements, arrow functions, function declarations, function expressions, call expressions, and identifiers to verify that every exported member returns a Promise. Sources: packages/next/src/server/typescript/rules/server-boundary.ts:1-157

function isPromiseType(type: tsModule.Type, typeChecker: tsModule.TypeChecker) {
  const typeReferenceType = type as tsModule.TypeReference
  if (!typeReferenceType.target) return false
 
  // target should be Promise or Promise<...>
  if (
    !/^Promise(<.+>)?$/.test(typeChecker.typeToString(typeReferenceType.target))
  ) {
    return false
  }
 
  return true
}

Sources: packages/next/src/server/typescript/rules/server-boundary.ts:8-20

Warning

When an export declaration or variable initializer in a server action module fails to return a Promise, the plugin reports diagnostic code 71011 (NEXT_TS_ERRORS.INVALID_SERVER_ENTRY_RETURN) with the message The "use server" file can only export async functions. Sources: packages/next/src/server/typescript/rules/server-boundary.ts:72-81, packages/next/src/server/typescript/constant.ts:1-13

Server Layer Component Restrictions

Within server components, the language service plugin filters completion entries and inspects import declarations to prevent the usage of disallowed client-side React hooks and class APIs. When processing import declarations from "react" or "react-dom", the plugin checks named bindings against explicit blacklists of client APIs such as state and effect hooks. Sources: packages/next/src/server/typescript/rules/server.ts:1-90

ModuleDisallowed APIsDiagnostic Code
reactuseState, useEffect, useEffectEvent, useLayoutEffect, useDeferredValue, useImperativeHandle, useInsertionEffect, useReducer, useRef, useSyncExternalStore, useTransition, Component, PureComponent, createContext, createFactory, experimental_useOptimistic, useOptimistic, useActionState71001 (NEXT_TS_ERRORS.INVALID_SERVER_API)
react-domuseFormStatus, useFormState71001 (NEXT_TS_ERRORS.INVALID_SERVER_API)

Sources: packages/next/src/server/typescript/constant.ts:28-52, packages/next/src/server/typescript/rules/server.ts:48-86

Note

The plugin checks both completion entry lists and import declarations to ensure developers receive immediate feedback when attempting to import stateful React primitives inside server layers. Sources: packages/next/src/server/typescript/rules/server.ts:11-33, packages/next/src/server/typescript/rules/server.ts:36-89

Entry point and error conventions

Page and Layout Component Parameter Validation

The language service plugin validates entry point components by inspecting the parameters of default export function declarations in page and layout files. For page entries determined via isPageFile, parameters are restricted to params and searchParams. For layout entries, the plugin reads the current directory using fs.readdirSync with withFileTypes: true to discover any directory names starting with @, which represent parallel route slots. These slot names are sliced and appended to the allowed layout properties. Sources: packages/next/src/server/typescript/rules/entry.ts:13-58, packages/next/src/server/typescript/rules/entry.ts:112-139

When semantic diagnostics are evaluated for an entry component, the plugin iterates over object binding pattern elements in the function parameters. If an element name is not included in the valid properties list, a diagnostic error is pushed with code NEXT_TS_ERRORS.INVALID_PAGE_PROP and message text specifying that the property is not a valid page or layout prop. Sources: packages/next/src/server/typescript/rules/entry.ts:112-161

const diagnostics: tsModule.Diagnostic[] = []
 
const props = node.parameters?.[0]?.name
if (props && ts.isObjectBindingPattern(props)) {
  for (const prop of props.elements) {
    const propName = (prop.propertyName || prop.name).getText()
    if (!validProps.includes(propName)) {
      diagnostics.push({
        file: source,
        category: ts.DiagnosticCategory.Error,
        code: NEXT_TS_ERRORS.INVALID_PAGE_PROP,
        messageText: `"${propName}" is not a valid ${type} prop.`,
        start: prop.getStart(),
        length: prop.getWidth(),
      })
    }
  }
}
 
return diagnostics

Sources: packages/next/src/server/typescript/rules/entry.ts:141-160

Warning

Using an unrecognized identifier inside page or layout destructuring patterns triggers an INVALID_PAGE_PROP error diagnostic at the exact start and width of the offending property node. Sources: packages/next/src/server/typescript/rules/entry.ts:143-157

Error Boundary Client Directive Enforcement

The error entry rule module inspects files matching the pattern error.tsx? or global-error.tsx? to enforce that error boundaries are designated client components. If the isClientEntry flag passed to getSemanticDiagnostics is false, the plugin immediately returns a diagnostic error for the entire file. Sources: packages/next/src/server/typescript/rules/error.ts:7-34

if (!isClientEntry) {
  // Error components must be Client Components
  return [
    {
      file: source,
      category: ts.DiagnosticCategory.Error,
      code: NEXT_TS_ERRORS.INVALID_ERROR_COMPONENT,
      messageText: `Error Components must be Client Components, please add the "use client" directive: https://nextjs.org/docs/app/api-reference/file-conventions/error`,
      start: 0,
      length: source.text.length,
    },
  ]
}

Sources: packages/next/src/server/typescript/rules/error.ts:19-31

Caution

Error and global-error components missing the "use client" directive receive diagnostic code NEXT_TS_ERRORS.INVALID_ERROR_COMPONENT, forcing developers to explicitly convert them into Client Components. Sources: packages/next/src/server/typescript/rules/error.ts:19-30

Metadata Typing and Export Restrictions

The metadata rule module handles semantic validation for metadata and generateMetadata exports across both client and server boundaries. In client entries, exporting either symbol via variable statements, function declarations, or export declarations results in NEXT_TS_ERRORS.INVALID_METADATA_EXPORT errors stating that these APIs are forbidden in Client Components. Sources: packages/next/src/server/typescript/rules/metadata.ts:6-74

In server entries, the plugin checks whether metadata or generateMetadata exports carry proper type annotations using the helper function hasType. If a server component exports generateMetadata or metadata without an explicit return type or variable type annotation, a warning diagnostic is generated recommending the appropriate Metadata or Promise<Metadata> type from "next". Sources: packages/next/src/server/typescript/rules/metadata.ts:75-242, packages/next/src/server/typescript/rules/metadata.ts:244-281

function hasType(node: tsModule.Declaration): boolean {
  const ts = getTs()
 
  if (
    !ts.isVariableDeclaration(node) &&
    !ts.isFunctionDeclaration(node) &&
    !ts.isArrowFunction(node) &&
    !ts.isFunctionExpression(node)
  ) {
    return false
  }
 
  // For function declarations, expressions, and arrow functions, check if they have return type
  if (
    ts.isFunctionDeclaration(node) ||
    ts.isFunctionExpression(node) ||
    ts.isArrowFunction(node)
  ) {
    return !!node.type
  }
 
  // For variable declarations
  if (!node.name) return false
  const name = node.name.getText()
  if (name === 'generateMetadata') {
    // If it's a function expression or arrow function, check if it has return type
    if (
      node.initializer &&
      (ts.isFunctionExpression(node.initializer) ||
        ts.isArrowFunction(node.initializer))
    ) {
      return !!node.initializer.type
    }
  }
 
  // For all other cases, check if the node has a type annotation
  return !!node.type
}

Sources: packages/next/src/server/typescript/rules/metadata.ts:244-281

Note

The hasType utility inspects function return types or variable initializers to verify explicit type annotations on metadata declarations before deciding whether to emit type warnings. Sources: packages/next/src/server/typescript/rules/metadata.ts:244-281

Build typegen and configuration verification

Next Types Plugin Artifact Generation and Route Typing

During compilation, Next.js generates TypeScript artifacts inside the .next/types directory to validate layouts, pages, and route handlers. The NextTypesPlugin creates type-guard files that import entry modules and verify their exported fields, parameters, and return types against strict schema definitions using the checkFields and Diff utility types. Sources: packages/next/src/build/webpack/plugins/next-types-plugin/index.ts:11-88

function createTypeGuardFile(
  fullPath: string,
  relativePath: string,
  options: {
    type: 'layout' | 'page' | 'route'
    slots?: string[]
  }
) {
  return `// File: ${fullPath}
import * as entry from '${relativePath}.js'
${
  options.type === 'route'
    ? `import type { NextRequest } from 'next/server.js'`
    : `import type { ResolvingMetadata, ResolvingViewport } from 'next/dist/lib/metadata/types/metadata-interface.js'`
}
 
import type { InstantConfigForTypeCheckInternal, Prefetch, EnsureStatic } from 'next/dist/build/segment-config/app/app-segment-config.js'
 
type TEntry = typeof import('${relativePath}.js')
 
type SegmentParams<T extends Object = any> = T extends Record<string, any>
  ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never }
  : T
 
// Check that the entry is a valid entry
checkFields<Diff<{
  ${
    options.type === 'route'
      ? HTTP_METHODS.map((method) => `${method}?: Function`).join('\n  ')
      : 'default: Function'
  }
  config?: {}
  generateStaticParams?: Function
  ${options.type === 'route' ? '' : 'unstable_paramMatching?: {}\n  unstable_generateParamMatching?: Function'}
  instant?: InstantConfigForTypeCheckInternal
  prefetch?: Prefetch
  ensureStatic?: EnsureStatic
  unstable_dynamicStaleTime?: number
  revalidate?: RevalidateRange<TEntry> | false
  dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
  dynamicParams?: boolean
  fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
  /** @deprecated The \`preferredRegion\` config is deprecated. Remove this export. */
  preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
  runtime?: 'nodejs' | 'experimental-edge' | 'edge'
  maxDuration?: number
  ${
    options.type === 'route'
      ? ''
      : `
  metadata?: any
  generateMetadata?: Function
  viewport?: any
  generateViewport?: Function
  `
  }
}, TEntry, ''>>()
 

Sources: packages/next/src/build/webpack/plugins/next-types-plugin/index.ts:31-88

For App Router route handlers, the type generator verifies that HTTP methods receive a Request or NextRequest as their first argument and a RouteContext containing params as their second argument, while returning a Response, void, never, or a Promise resolving to them. For pages and layouts, it checks PageProps and LayoutProps alongside generateStaticParams, generateMetadata, and generateViewport. Sources: packages/next/src/build/webpack/plugins/next-types-plugin/index.ts:89-180

    : `// Check the prop type of the entry function
checkFields<Diff<${
        options.type === 'page' ? 'PageProps' : 'LayoutProps'
      }, FirstArg<TEntry['default']>, 'default'>>()
 
// Check the arguments and return type of the generateMetadata function
if ('generateMetadata' in entry) {
  checkFields<Diff<${
    options.type === 'page' ? 'PageProps' : 'LayoutProps'
  }, FirstArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
  checkFields<Diff<ResolvingMetadata, SecondArg<MaybeField<TEntry, 'generateMetadata'>>, 'generateMetadata'>>()
}
 
// Check the arguments and return type of the generateViewport function
if ('generateViewport' in entry) {
  checkFields<Diff<${
    options.type === 'page' ? 'PageProps' : 'LayoutProps'
  }, FirstArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
  checkFields<Diff<ResolvingViewport, SecondArg<MaybeField<TEntry, 'generateViewport'>>, 'generateViewport'>>()
}
`
}
// Check the arguments and return type of the generateStaticParams function
if ('generateStaticParams' in entry) {
  checkFields<Diff<{ params: SegmentParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
  checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
}
 
export interface PageProps {
  params?: Promise<SegmentParams>
  searchParams?: Promise<any>
}
export interface LayoutProps {
  children?: React.ReactNode
${
  options.slots
    ? options.slots.map((slot) => `  ${slot}: React.ReactNode`).join('\n')
    : ''
}
  params?: Promise<SegmentParams>
}
 

Sources: packages/next/src/build/webpack/plugins/next-types-plugin/index.ts:139-180

Warning

When route or page exports violate expected type constraints, diagnostic formatter rules intercept TypeScript error code 2344 and translate raw type failures into readable developer messages identifying the exact file path and invalid export field. Sources: packages/next/src/lib/typescript/diagnosticFormatter.ts:54-190

Tsconfig Verification and Configuration Defaults

The setup verification pipeline inspects the project's tsconfig.json file, automatically writing configuration defaults and injecting required compiler options and plugins via writeConfigurationDefaults. If a user project extends an external configuration or specifies explicit paths, the setup utility adapts or warns about manual steps. Sources: packages/next/src/lib/verify-typescript-setup.ts:231-252, packages/next/src/lib/typescript/writeConfigurationDefaults.ts:205-240

export async function writeConfigurationDefaults(
  typescriptVersion: string,
  tsConfigPath: string,
  isFirstTimeSetup: boolean,
  hasAppDir: boolean,
  distDir: string,
  hasPagesDir: boolean,
  strictRouteTypes: boolean
): Promise<void> {
  if (isFirstTimeSetup) {
    writeFileSync(tsConfigPath, '{}' + os.EOL)
  }
 
  const userTsConfigContent = readFileSync(tsConfigPath, 'utf8')
  const userTsConfig = CommentJson.parse(userTsConfigContent)
 
  // Bail automatic setup when the user has extended or referenced another config
  if ('extends' in userTsConfig || 'references' in userTsConfig) {
    return
  }
 
  if (userTsConfig?.compilerOptions == null) {
    userTsConfig.compilerOptions = {}
    isFirstTimeSetup = true
  }
 
  const desiredCompilerOptions = getDesiredCompilerOptions(
    typescriptVersion,
    userTsConfig
  )
 
  const suggestedActions: string[] = []
  const requiredActions: string[] = []
  for (const optionKey in desiredCompilerOptions) {
    const check = desiredCompilerOptions[optionKey]
    if ('suggested' in check) {

Sources: packages/next/src/lib/typescript/writeConfigurationDefaults.ts:205-240

The desired compiler options shape enforces specific values for module resolution, target, JSX runtime, and incremental compilation to match Next.js SWC and webpack build semantics. The table below lists the required and suggested compiler options enforced or injected by the configuration utility:

Option KeySetting TypeTarget Value / SuggestedPurpose / Reason
targetSuggestedES2017For top-level await support
libSuggested['dom', 'dom.iterable', 'esnext']Standard browser and ECMAScript libraries
allowJsSuggestedtrueAllow JavaScript file compilation
skipLibCheckSuggestedtrueSkip type checking of declaration files
strictSuggestedfalseDefault strictness level for user projects
noEmitSuggestedtrueDo not emit outputs during type checking
incrementalSuggestedtrueEnable incremental compilation
moduleRequiredesnextRequired for dynamic import() support
esModuleInteropRequiredtrueRequirement for SWC and Babel interoperability
moduleResolutionRequiredbundler or nodeMatches modern bundler or webpack resolution
resolveJsonModuleRequiredtrueMatches webpack resolution for JSON modules
isolatedModulesRequiredtrueRequirement for SWC and Babel transpilation
jsxRequiredreact-jsxNext.js uses the React automatic runtime

Sources: packages/next/src/lib/typescript/writeConfigurationDefaults.ts:52-144

Important

If a configuration file contains an extends or references property, automatic modification of plugins and compiler options is bypassed to prevent overriding parent configurations. Sources: packages/next/src/lib/typescript/writeConfigurationDefaults.ts:221-224, packages/next/src/lib/typescript/writeConfigurationDefaults.ts:345-352

Was this page helpful?