recma-mdx-change-props
v1.1.1
Published
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.
Downloads
90
Maintainers
Readme
recma-mdx-change-props
[!WARNING]
Therecma-mdx-change-props
is useful fornext-mdx-remote
ornext-mdx-remote-client
users innextjs
applications.
This package is a unified (recma) plugin to provide using the expression like {props.foo}
in a MDX document.
unified is a project that transforms content with abstract syntax trees (ASTs) using the new parser micromark. recma adds support for producing a javascript code by transforming esast which stands for Ecma Script Abstract Syntax Tree (AST) that is used in production of compiled source for the MDX.
When should I use this?
This plugin is useful if you want to use expressions like {props.foo} in a MDX document.
Thanks to the plugin, you can pass "props" object in the scope
variable in next-mdx-remote
or next-mdx-remote-client
projects.
const scope = {
props: {
foo: "foofoo",
baz: "bazbaz"
}
}
<MDXRemote scope={scope} /* ... */ />
The 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 will not work.
Installation
This package is suitable for ESM only. In Node.js (version 16+), install with npm:
npm install recma-mdx-change-props
or
yarn add recma-mdx-change-props
Usage
Say we have the following file, example.mdx
,
# Hi {props.foo}
<Test name={props.baz} />
And our module, example.js
, looks as follows:
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:
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.
const scope = {
title: "My Article",
props: {
foo: "foofoo",
bar: "barbar",
}
}
Without the recma-mdx-change-props
, the statements props.foo
and props.baz
will be undefined
during function construction.
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
})]
});
}
Options
All options are optional, and implemented as for being more flexible in case of need to change the names.
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.
use(recmaMdxChangeProps, {propAs: "__props__"} as ChangePropsOptions);
Syntax tree
This plugin only modifies the ESAST (Ecma Script Abstract Syntax Tree) as explained.
Types
This package is fully typed with TypeScript. The plugin options is exported as ChangePropsOptions
.
Compatibility
This plugin works with unified
version 6+. It is compatible with mdx
version 3+.
Security
Use of recma-mdx-change-props
does not involve user content so there are no openings for cross-site scripting (XSS) attacks.
My Plugins
I like to contribute the Unified / Remark / MDX ecosystem, so I recommend you to have a look my plugins.
My Remark Plugins
remark-flexible-code-titles
– Remark plugin to add titles or/and containers for the code blocks with customizable propertiesremark-flexible-containers
– Remark plugin to add custom containers with customizable properties in markdownremark-ins
– Remark plugin to addins
element in markdownremark-flexible-paragraphs
– Remark plugin to add custom paragraphs with customizable properties in markdownremark-flexible-markers
– Remark plugin to add custommark
element with customizable properties in markdownremark-flexible-toc
– Remark plugin to expose the table of contents viavfile.data
or via an option referenceremark-mdx-remove-esm
– Remark plugin to remove import and/or export statements (mdxjsEsm)
My Rehype Plugins
rehype-pre-language
– Rehype plugin to add language information as a property topre
element
My Recma Plugins
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
– Recma plugin to change theprops
parameter into the_props
in thefunction _createMdxContent(props) {/* */}
in the compiled source in order to be able to use{props.foo}
like expressions. It is useful for thenext-mdx-remote
ornext-mdx-remote-client
users innextjs
applications.
License
MIT License © ipikuka