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 filesconst paths = await getMdxFilesFromCommit();if (paths.length) {// Update the lastEdited metadataawait updateMeta(paths);// Add these changes to the staged commitawait 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!