Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/01-app/02-guides/mdx.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,22 @@ const nextConfig = {
}

const withMDX = createMDX({
extension: process.env.TURBOPACK ? ['mdx', 'md'] : /\.mdx?$/,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't realize this is the docs themselves. In my opinion we should not tell people about process.env.TURBOPACK, it's an implementation detail.

// Add markdown plugins here, as desired
})

// Merge MDX config with Next.js config
export default withMDX(nextConfig)
```

> **Good to know**:
>
> The `extension` option specifies the file extensions to be processed by the MDX loader.
> For Next.js with webpack, this is a webpack rule test, such as a regular expression.
> For Turbopack, this is either a single file extension string, or an array of file extensions.
>
> For compatibility reasons, webpack with Next.js does not understand the list format as extensions.

This allows `.md` and `.mdx` files to act as pages, routes, or imports in your application.

## Add an `mdx-components.tsx` file
Expand Down
37 changes: 30 additions & 7 deletions packages/next-mdx/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
module.exports =
(pluginOptions = {}) =>
(inputConfig = {}) => {
const extension = pluginOptions.extension || /\.mdx$/
const extension =
pluginOptions.extension || (process.env.TURBOPACK ? 'mdx' : /\.mdx$/)
const userProvidedMdxOptions = pluginOptions.options

const mdxRsOptions = inputConfig?.experimental?.mdxRs
Expand Down Expand Up @@ -47,13 +48,35 @@ module.exports =
})

if (process.env.TURBOPACK) {
if (
!(
Array.isArray(extension) &&
extension.every((e) => typeof e === 'string')
) &&
typeof extension !== 'string'
) {
throw new Error(
'@next/mdx: Turbopack only supports a single extension string or list of extensions. `extension` was',
extension
)
}

const extensions = (
typeof extension === 'string' ? [extension] : extension
)
// Remove any leading dot from the extension as this is a common mistake.
.map((ext) => ext.replace(/^\./, ''))

const rules = nextConfig?.turbopack?.rules || {}
for (const ext of extensions) {
rules['*.' + ext] = {
loaders: [loader],
as: '*.tsx',
}
}

nextConfig.turbopack = Object.assign({}, nextConfig?.turbopack, {
rules: Object.assign({}, nextConfig?.turbopack?.rules, {
'*.mdx': {
loaders: [loader],
as: '*.tsx',
},
}),
rules,
resolveAlias: Object.assign({}, nextConfig?.turbopack?.resolveAlias, {
'next-mdx-import-source-file':
'@vercel/turbopack-next/mdx-import-source',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,9 +335,7 @@ describe('ReactRefreshRegression app', () => {
files.set(
'next.config.js',
outdent`
const withMDX = require("@next/mdx")({
extension: /\\.mdx?$/,
});
const withMDX = require("@next/mdx")();
module.exports = withMDX({
pageExtensions: ["js", "mdx"],
});
Expand Down
10 changes: 4 additions & 6 deletions test/development/acceptance/ReactRefreshRegression.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,18 @@ describe('ReactRefreshRegression', () => {
outdent`
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

export default class MyDocument extends Document {
static async getInitialProps(ctx) {
const sheet = new ServerStyleSheet()
const originalRenderPage = ctx.renderPage

try {
ctx.renderPage = () =>
originalRenderPage({
enhanceApp: App => props => sheet.collectStyles(<App {...props} />),
})

const initialProps = await Document.getInitialProps(ctx)
return {
...initialProps,
Expand Down Expand Up @@ -321,9 +321,7 @@ describe('ReactRefreshRegression', () => {
[
'next.config.js',
outdent`
const withMDX = require("@next/mdx")({
extension: /\\.mdx?$/,
});
const withMDX = require("@next/mdx")();
module.exports = withMDX({
pageExtensions: ["js", "mdx"],
});
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/app-dir/mdx/next.config.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import nextMDX from '@next/mdx'
const withMDX = nextMDX({
extension: /\.mdx?$/,
extension: process.env.TURBOPACK ? ['md', 'mdx'] : /\.mdx?$/,
options: {
remarkPlugins: [],
rehypePlugins: [['rehype-katex', { strict: true, throwOnError: true }]],
Expand Down
5 changes: 3 additions & 2 deletions test/e2e/app-dir/mdx/pages/pages/import/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import MDXContent from './mdx-file.mdx'
import MDContent from './md-file.md'

export default function Page() {
return (
<>
<MDXContent />
<MDContent />
</>
)
}
6 changes: 6 additions & 0 deletions test/e2e/app-dir/mdx/types/mdx.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@ declare module '*.mdx' {
let MDXComponent: (props) => JSX.Element
export default MDXComponent
}

declare module '*.md' {
import type { JSX } from 'react'
let MDXComponent: (props) => JSX.Element
export default MDXComponent
}
5 changes: 2 additions & 3 deletions test/integration/plugin-mdx-rs/next.config.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
const withMDX = require('@next/mdx')({
extension: /\.mdx?$/,
})
const withMDX = require('@next/mdx')()

module.exports = withMDX({
pageExtensions: ['js', 'jsx', 'mdx'],
experimental: {
Expand Down
5 changes: 2 additions & 3 deletions test/integration/plugin-mdx-rs/test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,8 @@ describe('MDX-rs Configuration', () => {
nextConfig = new File(join(appDir, 'next.config.js'))

nextConfig.write(`
const withMDX = require('@next/mdx')({
extension: /\\.mdx?$/,
})
const withMDX = require('@next/mdx')()

module.exports = withMDX({
pageExtensions: ['js', 'jsx', 'mdx'],
experimental: {
Expand Down
Loading