The withDocsInfra function is a Next.js configuration plugin that sets up webpack loaders, Turbopack rules, and page extensions required for MUI docs infrastructure. It automatically configures code highlighting loaders for demo files and provides sensible defaults for documentation sites.
index.ts and client.ts).md, .mdx, .ts, .tsx, .js, .jsx filesgetDocsInfraMdxOptions for MDX plugin configuration// next.config.mjs
import { withDocsInfra } from '@mui/internal-docs-infra/withDocsInfra';
const nextConfig = {
// Your existing Next.js config
};
export default withDocsInfra()(nextConfig);
// next.config.mjs
import { withDocsInfra, getDocsInfraMdxOptions } from '@mui/internal-docs-infra/withDocsInfra';
import createMDX from '@next/mdx';
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
// Control index generation
extractToIndex: {
include: ['app/docs', 'app/api'],
exclude: ['app/docs/internal'],
},
}),
});
const nextConfig = {
// Your Next.js config
};
export default withDocsInfra({
// Add support for additional file extensions
additionalPageExtensions: ['vue', 'svelte'],
// Disable export output if using server features
enableExportOutput: false,
// Add custom demo patterns beyond the defaults
additionalDemoPatterns: {
index: ['./app/**/demos/*/demo-*/index.ts'],
client: ['./app/**/demos/*/demo-*/client.ts'],
},
// Add custom Turbopack rules
additionalTurbopackRules: {
'./custom/**/*.ts': {
loaders: ['custom-loader'],
},
},
})(withMDX(nextConfig));
By default, withDocsInfra enables these page extensions:
js, jsx - JavaScript filesmd, mdx - Markdown filests, tsx - TypeScript filesThe plugin automatically configures loaders for these patterns:
Turbopack Rules:
{
'./app/**/demos/*/index.ts': {
loaders: ['@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter']
},
'./app/**/demos/*/client.ts': {
loaders: ['@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighterClient']
}
}
Webpack Rules:
{
test: /[/\\]demos[/\\][^/\\]+[/\\]index\.ts$/,
use: [
defaultLoaders.babel,
'@mui/internal-docs-infra/pipeline/loadPrecomputedCodeHighlighter'
]
}
Use getDocsInfraMdxOptions to configure MDX with docs-infra plugins:
import { withDocsInfra, getDocsInfraMdxOptions } from '@mui/internal-docs-infra/withDocsInfra';
import createMDX from '@next/mdx';
// Default docs-infra MDX plugins with automatic index generation
const withMDX = createMDX({
options: getDocsInfraMdxOptions(),
});
const nextConfig = {
// Your Next.js config
};
export default withDocsInfra()(withMDX(nextConfig));
// With additional plugins
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
additionalRemarkPlugins: [['remark-emoji']],
additionalRehypePlugins: [['rehype-highlight']],
}),
});
// Custom plugin overrides (replaces all default plugins)
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
remarkPlugins: [['remark-gfm'], ['custom-plugin']],
rehypePlugins: [['custom-rehype-plugin']],
}),
});
The extractToIndex option is passed via getDocsInfraMdxOptions, not withDocsInfra:
// Disable index generation
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
extractToIndex: false,
}),
});
export default withDocsInfra()(withMDX(nextConfig));
// Custom path filters for index generation
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
extractToIndex: {
include: ['app/docs', 'app/api'],
exclude: ['app/docs/internal'],
},
}),
});
export default withDocsInfra()(withMDX(nextConfig));
remark-gfm - GitHub Flavored Markdown supporttransformMarkdownRelativePaths - Convert relative paths for docstransformMarkdownBlockquoteCallouts - Convert blockquotes to calloutstransformMarkdownCode - Process code blockstransformHtmlCode - Transform HTML code elements| Option | Type | Default | Description |
|---|---|---|---|
additionalPageExtensions | string[] | [] | Additional file extensions to treat as pages |
enableExportOutput | boolean | true | Enable Next.js export output mode |
demoPathPattern | string | './app/**/demos/*/index.ts' | Pattern for demo index files |
clientDemoPathPattern | string | './app/**/demos/*/client.ts' | Pattern for demo client files |
additionalDemoPatterns | object | {} | Additional demo patterns for custom structures |
additionalTurbopackRules | object | {} | Custom Turbopack loader rules |
| Option | Type | Default | Description |
|---|---|---|---|
remarkPlugins | Array | See Default MDX Plugins | Override default remark plugins completely |
rehypePlugins | Array | See Default MDX Plugins | Override default rehype plugins completely |
additionalRemarkPlugins | Array | [] | Add plugins to default remark plugins |
additionalRehypePlugins | Array | [] | Add plugins to default rehype plugins |
extractToIndex | boolean | { include: string[], exclude: string[] } | true (with default filter) | Control metadata extraction to parent index files (see Automatic Index Generation) |
baseDir | string | process.cwd() | Base directory for path filtering (auto-detected, rarely needs manual configuration) |
If your demos follow a different pattern (e.g., demo-variant/index.ts):
const nextConfig = withDocsInfra({
additionalDemoPatterns: {
index: ['./app/**/demos/*/demo-*/index.ts'],
client: ['./app/**/demos/*/demo-*/client.ts'],
},
})({});
This will configure loaders for paths like:
./app/components/demos/Button/demo-variant/index.ts./app/components/demos/Button/demo-basic/client.tsComplete Next.js configuration for a docs site:
// next.config.mjs
import { withDocsInfra, getDocsInfraMdxOptions } from '@mui/internal-docs-infra/withDocsInfra';
import createMDX from '@next/mdx';
const withMDX = createMDX({
options: getDocsInfraMdxOptions({
additionalRemarkPlugins: [['remark-emoji']],
}),
});
const nextConfig = {
// Your app-specific config
experimental: {
appDir: true,
},
};
export default withDocsInfra({
additionalDemoPatterns: {
index: ['./app/**/demos/*/demo-*/index.ts'],
client: ['./app/**/demos/*/demo-*/client.ts'],
},
})(withMDX(nextConfig));
By default, the plugin automatically extracts page metadata and maintains parent directory indexes. See examples in Controlling Index Generation above.
The default filter { include: ['app', 'src/app'], exclude: [] } processes all pages in both app/ and src/app/ directories (without trailing slashes - they're added automatically during matching). Index files (e.g., app/page.mdx, app/components/page.mdx) are automatically excluded to prevent them from creating parent indexes. The base directory is automatically detected from process.cwd().
For complete details, see the transformMarkdownMetadata documentation.
loadPrecomputedCodeHighlighter - Loader for demo index filesloadPrecomputedCodeHighlighterClient - Loader for demo client filesCodeHighlighter - Component that renders highlighted demos