This blog runs on Gatsby with the Gatsby Starter: Minimal Blog by LekoArts.

I recently upgraded some dependencies and ran into some issues.

The repo switched from @mdx-js/tag to @mdx-js/react. During development, everything worked fine. But you couldn’t build static HTML files.

I got errors with mdx-utils: className.match is not a function.

mdx-utils is part of gatsby-mdx.

I found a workaround in this issue: Named capture groups not supported (latest Firefox and < Node 10) #366.
Although it doesn’t exactly match my error, the culprit became clear: The file gatsby-mdx/packages/mdx-utils/index.js.

It should look like this:

exports.preToCodeBlock = preProps => {
  if (
    // children is code element
    preProps.children &&
    // code props
    preProps.children.props &&
    // if children is actually a <code>
    preProps.children.props.mdxType === "code"
  ) {
    // we have a <pre><code> situation
    const {
      children: codeString,
      className = "",
    } = preProps.children.props;

    const match = className.match(/language-([\0-\uFFFF]*)/);

    return {
      codeString: codeString.trim(),
      language: match != null ? match[1] : "",
  return undefined;

I still had an old version in my node-modules from an earlier version of gatsby-mdx. You can see the commit here.

It seems like line 17 did cause the issue:

-  const [, match] = className.match(/language-([\0-\uFFFF]*)/);
+  const match = className.match(/language-([\0-\uFFFF]*)/);

Please note: I can’t get this working with Netlify as mdx-utils hasn’t released the fix as a new version yet. Netlify will install node modules for you and will still use the old mdx-utils and gatsby-mdx npm packages.

Update 2019-05-31:
I got it working on Netlify.

First, make sure to install mdx-utils version 0.1.0. The current version 0.1.1 doesn’t work for me.

Then, upgrade the node version on Netlify. You can read more about Netlify builds here.
I set the NODE_VERSION as a variable in the “Build environment” section of the Netlify settings to 11.15.0. Apparently the default node version (Node 8) has problems with parsing the regular expression used in mdx-utils.