Recma plugin to set the default value `() => null` for the Components in MDX in case of missing or not provided.
npm install recma-mdx-escape-missing-componentsIf you find recma-mdx-escape-missing-components 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]
This package is a [unified][unified] ([recma][recma]) plugin which allows you to escape MDX components that are either missing or not provided in an MDX document.
[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 EcmaScript Abstract Syntax Tree (AST) that is used in production of compiled source for the [MDX][MDX].
recma-mdx-escape-missing-components is useful for escaping MDX components that are missing or not explicitly provided in your MDX document.
You wonβt encounter errors for missing or undefined MDX components because recma-mdx-escape-missing-components assigns a default value of () => null for them.
This package is suitable for ESM only. In Node.js (version 18+), install with npm:
``bash`
npm install recma-mdx-escape-missing-components
or
`bash`
yarn add recma-mdx-escape-missing-components
Say we have the following file, example.mdx, which consists some mdx components.
`mdxHi
`
And our module, example.js, looks as follows:
`javascript
import { read } from "to-vfile";
import { compile } from "@mdx-js/mdx";
import recmaMdxEscapeMissingComponents from "recma-mdx-escape-missing-components";
main();
async function main() {
const source = await read("example.mdx");
const compiledSource = await compile(source, {
recmaPlugins: [recmaMdxEscapeMissingComponents],
});
return String(compiledSource);
}
`
Now, running node example.js produces the compiled source which contains the statement below:
`js`
// ...
const _EmptyComponent = () => null;
function _createMdxContent(props) {
// ...
const {Component1 = _EmptyComponent, Component2 = _EmptyComponent} = _components;
// ...
}
Without recma-mdx-escape-missing-components, youβd not get any Empty Component definition and default value for the components:
`js`
// ...
function _createMdxContent(props) {
// ...
const {Component1, Component2} = _components;
// ...
}
Basically, recma-mdx-escape-missing-components;
π© inserts an Empty Component definition into the code above the function _createMdxContent(props){}
const _EmptyComponent = () => null;
π© looks for a declaration statement in an object pattern initiated by the _components
const {Component1, Component2} = _components;
π© converts it as the destructed components have a default value _EmptyComponent
const {Component1 = _EmptyComponent, Component2 = _EmptyComponent} = _components;
`typescript
type TestFunction = (componentName: string) => boolean | undefined | null;
function recmaMdxEscapeMissingComponents(test?: string | string[] | TestFunction)
`
#### test() => null
+ if "undefined", all components pass the check.
+ if "string", check the component name matches with the string.
+ if "string[]", check the component name is included in the string array.
+ if "TestFunction", check the test function returns true.
+ if check is true/pass, set the default value for that component.
`markdownHi
Wellcome
`
#### Without the test option
`javascript`
use(recmaMdxEscapeMissingComponents);
is going to produce the compiled source has the statement for all components have the default value:
const {Component1 = _EmptyComponent, Component2 = _EmptyComponent} = _components;
#### With the test option (string)
`javascript`
use(recmaMdxEscapeMissingComponents, "Component1");
is going to produce the compiled source has the statement for only the Component1 has the default value:
const {Component1 = _EmptyComponent, Component2} = _components;
#### With the test option (string array)
`javascript`
use(recmaMdxEscapeMissingComponents, ["Component1"]);Component1
is going to produce the compiled source has the statement for only the has the default value:
const {Component1 = _EmptyComponent, Component2} = _components;
#### With the test option (function)
`javascript`
use(recmaMdxEscapeMissingComponents, ((name) => name.endsWith("2")) as TestFunction);Component2
is going to produce the compiled source has the statement for only the has the default value:
const {Component1, Component2 = _EmptyComponent} = _components;
This plugin only modifies the ESAST (Ecma Script Abstract Syntax Tree) as explained.
This package is fully typed with [TypeScript][url-typescript]. Test function in the option is exported as type TestFunction.
This plugin works with unified version 6+. It is compatible with mdx version 3+.
Use of recma-mdx-escape-missing-components doesn't 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-escape-missing-components
[badge-npm-download]:https://img.shields.io/npm/dt/recma-mdx-escape-missing-components
[url-npm-package]: https://www.npmjs.com/package/recma-mdx-escape-missing-components
[url-github-package]: https://github.com/ipikuka/recma-mdx-escape-missing-components
[badge-license]: https://img.shields.io/github/license/ipikuka/recma-mdx-escape-missing-components
[url-license]: https://github.com/ipikuka/recma-mdx-escape-missing-components/blob/main/LICENSE
[badge-publish-to-npm]: https://github.com/ipikuka/recma-mdx-escape-missing-components/actions/workflows/publish.yml/badge.svg
[url-publish-github-actions]: https://github.com/ipikuka/recma-mdx-escape-missing-components/actions/workflows/publish.yml
[badge-typescript]: https://img.shields.io/npm/types/recma-mdx-escape-missing-components
[url-typescript]: https://www.typescriptlang.org/
[badge-codecov]: https://codecov.io/gh/ipikuka/recma-mdx-escape-missing-components/graph/badge.svg?token=F89TVSB5MU
[url-codecov]: https://codecov.io/gh/ipikuka/recma-mdx-escape-missing-components
[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-escape-missing-components%2Fmaster%2Fpackage.json