Update MDX Meta

Change last updated time.

const { parse, resolve } = require('path');
const remark = require('remark');
const mdx = require('remark-mdx');
const mdxMetadata = require('remark-mdx-metadata');
const stringify = require('remark-stringify');
const { read, write } = require('to-vfile');
const { add, getStagedFiles } = require('git-jiggy');
const getMdxFilesFromCommit = async () => {
const files = (await getStagedFiles()).map((file) => {
return resolve(__dirname, '../../', file);
});
return files.filter(
(file) =>
parse(file).ext === '.mdx' &&
(file.includes('pages/docs') || file.includes('pages/guides'))
);
};
const updateMeta = async (paths) => {
await Promise.all(
paths.map(async (path) => {
const file = await read(path);
const result = await remark()
.use(mdx)
.use(mdxMetadata, {
meta: {
lastEdited: new Date().toISOString()
}
})
.use(stringify, {
fences: true,
listItemIndent: '1'
})
.process(file);
const contents = result.toString();
await write({
path,
contents
});
})
);
};
const updateModifiedFiles = async () => {
// Get modified .mdx files
const paths = await getMdxFilesFromCommit();
if (paths.length) {
// Update the lastEdited metadata
await updateMeta(paths);
// Add these changes to the staged commit
await add(paths);
}
};
updateModifiedFiles();

Usage

1

Install the Required Packages

To read & modify MDX files, as well as transform their metadata, we need to install a few pacakges.

  • remark
  • remark-mdx
  • remark-mdx-metadata
  • remark-stringify
  • to-vfile
  • git-jiggy
2

Add MDX Metadata

For this script to work, you'll need to define your metadata inside your .mdx file.

export const meta = {
editUrl: 'pages/docs/api/endpoint.mdx',
lastEdited: '2021-01-24T12:12:12.000Z'
};

lastEdited will be changed by the Node script. You could also use frontmatter and parse with gray-matter.

3

Run the Script

You can either run this script inside your package.json like node scripts/update-mdx-meta or as part of your build process. For example, with Next.js:

module.exports = {
webpack: (config, { isServer }) => {
if (isServer) {
require('./scripts/update-mdx-meta');
}
return config;
}
};

Credit to Michael Novotny for these helpful packages!