This recma plugin changes the 'props' parameter into '_props' in the function '_createMdxContent'; and makes appropriate changes in order to be able to use the expression containing for example {props.foo} in the mdx.
npm install recma-mdx-change-propsIf you find recma-mdx-change-props useful in your projects, consider supporting my work.
Your sponsorship means a lot 💖
Be the first sponsor and get featured here and on my sponsor wall.
Thank you for supporting open source! 🙌
[![npm version][badge-npm-version]][url-npm-package]
[![npm downloads][badge-npm-download]][url-npm-package]
[![publish to npm][badge-publish-to-npm]][url-publish-github-actions]
[![code-coverage][badge-codecov]][url-codecov]
[![type-coverage][badge-type-coverage]][url-github-package]
[![typescript][badge-typescript]][url-typescript]
[![license][badge-license]][url-license]
> [!WARNING]
> recma-mdx-change-props is useful for next-mdx-remote or next-mdx-remote-client users in nextjs applications. @mdx-js/mdx and @next/mdx users does NOT need to use recma-mdx-change-props since everything is props in that packages.
This package is a [unified][unified] ([recma][recma]) plugin that enables the use of expressions like {props.foo} in MDX documents.
[unified][unified] is a project that transforms content with abstract syntax trees (ASTs) using the new parser [micromark][micromark]. [recma][recma] adds support for producing a javascript code by transforming [esast][esast] which stands for Ecma Script Abstract Syntax Tree (AST) that is used in production of compiled source for the [MDX][MDX].
Use recma-mdx-change-props to enable expressions like {props.foo} in MDX documents.
recma-mdx-change-props allows you to pass the props object in the scope variable when using next-mdx-remote or next-mdx-remote-client.
``javascript
const scope = {
props: {
foo: "foofoo",
baz: "bazbaz"
}
}
`
recma-mdx-change-props changes the props parameter into _props in the function _createMdxContent in the compiled source; and makes appropriate changes in order to do so. Without recma-mdx-change-props, there will be a confliction caused by "props" in the function _createMdxContent(props){} and the expression like {props.foo} in a MDX document, and it will not work as expected.
This package is suitable for ESM only. In Node.js (version 18+), install with npm:
`bash`
npm install recma-mdx-change-props
or
`bash`
yarn add recma-mdx-change-props
Say we have the following file, example.mdx,
`mdx`Hi {props.foo}
And our module, example.js, looks as follows:
`javascript
import { read } from "to-vfile";
import { compile } from "@mdx-js/mdx";
import recmaMdxChangeProps from "recma-mdx-change-props";
main();
async function main() {
const source = await read("example.mdx");
const compiledSource = await compile(source, {
recmaPlugins: [recmaMdxChangeProps],
});
return String(compiledSource);
}
`
Now, running node example.js produces the compiled source like below:
`js`
function _createMdxContent(_props) {
const _components = {
h1: "h1",
..._props.components
}, {Test} = _components;
// ...
return _jsxs(_Fragment, {
children: [_jsxs(_components.h1, {
children: ["Hi ", props.foo]
}), "\\n", _jsx(Test, {
name: props.baz
})]
});
}
And, this provides us to pass an object containing the props key during function construction of the compiled source.
`js`
const scope = {
title: "My Article",
props: {
foo: "foofoo",
bar: "barbar",
}
}
Without recma-mdx-change-props, the statements props.foo and props.baz will be undefined during function construction.
`js`
function _createMdxContent(props) {
const _components = {
h1: "h1",
...props.components
}, {Test} = _components;
// ...
return _jsxs(_Fragment, {
children: [_jsxs(_components.h1, {
children: ["Hi ", props.foo]
}), "\\n", _jsx(Test, {
name: props.baz
})]
});
}
All options are optional, and implemented as for being more flexible in case of need to change the names.
`typescript`
export type ChangePropsOptions = {
funcName?: string; // default is "_createMdxContent" which the plugin looks for
propName?: string; // default is "props" which the plugin looks for
propAs?: string; // default is "_props" which the plugin converts into
};
The options are self-explainotary, so that is why no need to represent more example here.
`javascript`
use(recmaMdxChangeProps, {propAs: "__props__"} as ChangePropsOptions);
This plugin only modifies the ESAST (Ecma Script Abstract Syntax Tree) as explained.
This package is fully typed with [TypeScript][url-typescript]. The plugin options is exported as ChangePropsOptions.
This plugin works with unified version 6+. It is compatible with mdx version 3+.
Use of recma-mdx-change-props does not involve user content so there are no openings for cross-site scripting (XSS) attacks.
I like to contribute the Unified / Remark / MDX ecosystem, so I recommend you to have a look my plugins.
- remark-flexible-code-titles
– Remark plugin to add titles or/and containers for the code blocks with customizable properties
- remark-flexible-containers
– Remark plugin to add custom containers with customizable properties in markdown
- remark-ins
– Remark plugin to add ins element in markdownremark-flexible-paragraphs
- remark-flexible-markers
– Remark plugin to add custom paragraphs with customizable properties in markdown
- mark
– Remark plugin to add custom element with customizable properties in markdownremark-flexible-toc
- vfile.data
– Remark plugin to expose the table of contents via or via an option referenceremark-mdx-remove-esm
-
– Remark plugin to remove import and/or export statements (mdxjsEsm)
- rehype-pre-language
– Rehype plugin to add language information as a property to pre elementrehype-highlight-code-lines
- rehype-code-meta
– Rehype plugin to add line numbers to code blocks and allow highlighting of desired code lines
- code.data.meta
– Rehype plugin to copy to code.properties.metastringrehype-image-toolkit
- ![]()
– Rehype plugin to enhance Markdown image syntax and Markdown/MDX media elements (,
- recma-mdx-escape-missing-components
– Recma plugin to set the default value () => null for the Components in MDX in case of missing or not provided so as not to throw an errorrecma-mdx-change-props
- props
– Recma plugin to change the parameter into the _props in the function _createMdxContent(props) {/ /} in the compiled source in order to be able to use {props.foo} like expressions. It is useful for the next-mdx-remote or next-mdx-remote-client users in nextjs applications.recma-mdx-change-imports
- recma-mdx-import-media
– Recma plugin to convert import declarations for assets and media with relative links into variable declarations with string URLs, enabling direct asset URL resolution in compiled MDX.
- recma-mdx-import-react
– Recma plugin to turn media relative paths into import declarations for both markdown and html syntax in MDX.
- React
– Recma plugin to ensure getting instance from the arguments and to make the runtime props {React, jsx, jsxs, jsxDev, Fragment} is available in the dynamically imported components in the compiled source of MDX.recma-mdx-html-override
- recma-mdx-interpolate
– Recma plugin to allow selected raw HTML elements to be overridden via MDX components.
- alt
– Recma plugin to enable interpolation of identifiers wrapped in curly braces within the , src, href, and title` attributes of markdown link and image syntax in MDX.
MIT License © ipikuka
[unified]: https://github.com/unifiedjs/unified
[micromark]: https://github.com/micromark/micromark
[recma]: https://mdxjs.com/docs/extending-mdx/#list-of-plugins
[esast]: https://github.com/syntax-tree/esast
[estree]: https://github.com/estree/estree
[MDX]: https://mdxjs.com/
[badge-npm-version]: https://img.shields.io/npm/v/recma-mdx-change-props
[badge-npm-download]:https://img.shields.io/npm/dt/recma-mdx-change-props
[url-npm-package]: https://www.npmjs.com/package/recma-mdx-change-props
[url-github-package]: https://github.com/ipikuka/recma-mdx-change-props
[badge-license]: https://img.shields.io/github/license/ipikuka/recma-mdx-change-props
[url-license]: https://github.com/ipikuka/recma-mdx-change-props/blob/main/LICENSE
[badge-publish-to-npm]: https://github.com/ipikuka/recma-mdx-change-props/actions/workflows/publish.yml/badge.svg
[url-publish-github-actions]: https://github.com/ipikuka/recma-mdx-change-props/actions/workflows/publish.yml
[badge-typescript]: https://img.shields.io/npm/types/recma-mdx-change-props
[url-typescript]: https://www.typescriptlang.org/
[badge-codecov]: https://codecov.io/gh/ipikuka/recma-mdx-change-props/graph/badge.svg?token=MPKUA07Z6N
[url-codecov]: https://codecov.io/gh/ipikuka/recma-mdx-change-props
[badge-type-coverage]: https://img.shields.io/badge/dynamic/json.svg?label=type-coverage&prefix=%E2%89%A5&suffix=%&query=$.typeCoverage.atLeast&uri=https%3A%2F%2Fraw.githubusercontent.com%2Fipikuka%2Frecma-mdx-change-props%2Fmaster%2Fpackage.json