diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6dbe567d8..adc5e2745 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,7 +32,7 @@ We follow the convention of `start:NAME` to run an in-memory dev server for a sp
- [`examples/typescript`](https://github.com/FormidableLabs/spectacle/tree/main/examples/typescript)
- [`examples/one-page`](https://github.com/FormidableLabs/spectacle/tree/main/examples/one-page)
- `spectacle-mdx-loader`
- - [`examples/mdx`](https://github.com/FormidableLabs/spectacle-mdx-loader/tree/main/examples/mdx)
+ - [`examples/mdx`](https://github.com/FormidableLabs/spectacle/tree/main/examples/mdx)
Here's how you can run the various examples:
@@ -49,6 +49,10 @@ $ open http://localhost:3100/
$ pnpm start:md
$ open http://localhost:3200/
+# MDX demo app (in two different terminals)
+$ pnpm start:mdx
+$ open http://localhost:3300/
+
# One-page (no build, HTML page only) demo app (in two different terminals)
$ pnpm start:one-page
$ open examples/one-page/index.html
diff --git a/examples/mdx/.babelrc b/examples/mdx/.babelrc
new file mode 100644
index 000000000..18d203321
--- /dev/null
+++ b/examples/mdx/.babelrc
@@ -0,0 +1,3 @@
+{
+ "extends": "../../.babelrc.js"
+}
diff --git a/examples/mdx/index.html b/examples/mdx/index.html
new file mode 100644
index 000000000..878c1b3c8
--- /dev/null
+++ b/examples/mdx/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+ <%= htmlWebpackPlugin.options.title %>
+
+
+
+
+
+
diff --git a/examples/mdx/index.js b/examples/mdx/index.js
new file mode 100644
index 000000000..d9a0b5aca
--- /dev/null
+++ b/examples/mdx/index.js
@@ -0,0 +1,60 @@
+import React from 'react';
+import { render } from 'react-dom';
+
+import { MDXProvider } from '@mdx-js/react';
+
+import {
+ Deck,
+ FlexBox,
+ Slide,
+ Box,
+ Progress,
+ FullScreen,
+ Notes,
+ mdxComponentMap
+} from 'spectacle';
+
+// SPECTACLE_CLI_MDX_START
+import slides, { notes } from './slides.mdx';
+// SPECTACLE_CLI_MDX_END
+
+// SPECTACLE_CLI_THEME_START
+const theme = {};
+// SPECTACLE_CLI_THEME_END
+
+// SPECTACLE_CLI_TEMPLATE_START
+const template = () => (
+
+
+
+
+
+
+
+
+);
+// SPECTACLE_CLI_TEMPLATE_END
+
+const Presentation = () => (
+
+
+ {slides
+ .map((MDXSlide, i) => [MDXSlide, notes[i]])
+ .map(([MDXSlide, MDXNote], i) => (
+
+
+
+
+
+
+ ))}
+
+
+);
+
+render(, document.getElementById('root'));
diff --git a/examples/mdx/package.json b/examples/mdx/package.json
new file mode 100644
index 000000000..f4f94a560
--- /dev/null
+++ b/examples/mdx/package.json
@@ -0,0 +1,87 @@
+{
+ "name": "spectacle-example-mdx",
+ "private": true,
+ "dependencies": {
+ "@mdx-js/react": "^1.5.3",
+ "prop-types": "^15.7.2",
+ "spectacle": "*",
+ "react": "^18.1.0",
+ "react-dom": "^18.1.0"
+ },
+ "devDependencies": {
+ "spectacle-mdx-loader": "*"
+ },
+ "scripts": {
+ "start": "webpack-dev-server --port=3300 --hot --config ./webpack.config.js",
+ "build": "wireit",
+ "lint": "wireit",
+ "lint:fix": "wireit",
+ "prettier": "wireit",
+ "prettier:fix": "wireit"
+ },
+ "wireit": {
+ "build": {
+ "command": "nps webpack",
+ "files": [
+ "*.{js,jsx,ts,tsx,html}"
+ ],
+ "output": [
+ "dist/*"
+ ],
+ "dependencies": [
+ "../../packages/spectacle:build:lib:esm"
+ ],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "lint": {
+ "command": "nps \"lint:base *.js\"",
+ "files": [
+ "../../.eslintignore",
+ "../../.eslintrc",
+ "*.{js,jsx,ts,tsx}"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "lint:fix": {
+ "command": "pnpm run lint || nps \"lint:base --fix *.js\"",
+ "files": [
+ "../../.eslintignore",
+ "../../.eslintrc",
+ "*.{js,jsx,ts,tsx}"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "prettier": {
+ "command": "nps prettier:pkg -- -- \"*\"",
+ "files": [
+ "../../.prettierignore",
+ "../../.prettierrc",
+ "*.{js,html}"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "prettier:fix": {
+ "command": "pnpm run prettier || nps prettier:pkg:fix -- -- \"*\"",
+ "files": [
+ "../../.prettierignore",
+ "../../.prettierrc",
+ "*.{js,html}"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ }
+ }
+ }
diff --git a/examples/mdx/slides.mdx b/examples/mdx/slides.mdx
new file mode 100644
index 000000000..605ac5bae
--- /dev/null
+++ b/examples/mdx/slides.mdx
@@ -0,0 +1,68 @@
+import Test from './test-component';
+export const testProp = 50;
+
+# Spectacle Presentation (MDX) 👋
+
+This example uses:
+
+- `mdx`
+- `@babel/preset-react` for the React components we import
+
+Notes: These are presenter notes. This text will be automatically exported as `notes` from your MDX file (e.g. `import {notes} from './my-file.mdx'`).
+
+---
+
+## Yellow div from a JSX component
+
+
+
+Notes: here are some more notes.
+
+---
+
+# Write your Spectacle Presentations in Markdown
+
+## And seamlessly use React Components
+
+**How sweet is that**
+**(super sweet)**
+
+---
+
+
+
+---
+
+###### Typography
+
+# Heading 1
+
+## Heading 2
+
+### Heading 3
+
+#### Heading 4
+
+##### Heading 5
+
+###### Heading 6
+
+Standard Text
+
+---
+
+> Example Quote
+
+---
+
+```jsx
+import { createClient, Provider } from 'urql';
+
+const client = createClient({ url: 'https://0ufyz.sse.codesandbox.io' });
+
+const App = () => (
+
+
+
+);
+```
diff --git a/examples/mdx/test-component.js b/examples/mdx/test-component.js
new file mode 100644
index 000000000..0b7101a18
--- /dev/null
+++ b/examples/mdx/test-component.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+const Test = ({ height }) => {
+ return ;
+};
+
+Test.propTypes = {
+ height: PropTypes.number.isRequired
+};
+
+export default Test;
diff --git a/examples/mdx/webpack.config.js b/examples/mdx/webpack.config.js
new file mode 100644
index 000000000..d84e21bf0
--- /dev/null
+++ b/examples/mdx/webpack.config.js
@@ -0,0 +1,39 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+const base = require('../../webpack.config.base');
+
+/**
+ * Base configuration for the CLI, core, and examples.
+ */
+module.exports = {
+ ...base,
+ mode: 'development',
+ context: __dirname,
+ entry: './index.js',
+ output: {
+ path: path.join(__dirname, 'dist'),
+ filename: 'example.js'
+ },
+ externals: {},
+ devtool: 'source-map',
+ module: {
+ ...base.module,
+ rules: [
+ ...base.module.rules,
+ {
+ test: /\.mdx$/,
+ use: [
+ require.resolve('babel-loader'),
+ require.resolve('spectacle-mdx-loader')
+ ]
+ }
+ ]
+ },
+ plugins: [
+ ...base.plugins,
+ new HtmlWebpackPlugin({
+ title: 'Spectacle MDX Development Example',
+ template: `./index.html`
+ })
+ ]
+};
diff --git a/package.json b/package.json
index 93bd05a04..a90e090fc 100644
--- a/package.json
+++ b/package.json
@@ -54,6 +54,7 @@
"changeset": "changeset",
"start:js": "concurrently --raw pnpm:build:spectacle:esm:watch pnpm:build:spectacle:types:watch \"pnpm run --filter ./examples/js start\"",
"start:md": "concurrently --raw pnpm:build:spectacle:esm:watch pnpm:build:spectacle:types:watch \"pnpm run --filter ./examples/md start\"",
+ "start:mdx": "concurrently --raw pnpm:build:spectacle:esm:watch pnpm:build:spectacle:types:watch \"pnpm run --filter ./examples/mdx start\"",
"start:ts": "concurrently --raw pnpm:build:spectacle:esm:watch pnpm:build:spectacle:types:watch \"pnpm run --filter ./examples/typescript start\"",
"start:one-page": "concurrently --raw pnpm:build:spectacle:dev:watch pnpm:build:spectacle:types:watch",
"start:examples": "concurrently --raw pnpm:build:spectacle:esm:watch pnpm:build:spectacle:dev:watch pnpm:build:spectacle:types:watch \"pnpm run --parallel --filter \\\"./examples/*\\\" start\"",
@@ -113,6 +114,7 @@
"./packages/spectacle:build",
"./examples/js:build",
"./examples/md:build",
+ "./examples/mdx:build",
"./examples/one-page:build",
"./examples/typescript:build"
]
@@ -167,9 +169,11 @@
"dependencies": [
"./packages/spectacle:lint",
"./packages/create-spectacle:lint",
+ "./packages/spectacle-mdx-loader:lint",
"./website:lint",
"./examples/js:lint",
"./examples/md:lint",
+ "./examples/mdx:lint",
"./examples/one-page:lint",
"./examples/typescript:lint"
]
@@ -178,9 +182,11 @@
"dependencies": [
"./packages/spectacle:lint:fix",
"./packages/create-spectacle:lint:fix",
+ "./packages/spectacle-mdx-loader:lint:fix",
"./website:lint:fix",
"./examples/js:lint:fix",
"./examples/md:lint:fix",
+ "./examples/mdx:lint:fix",
"./examples/one-page:lint:fix",
"./examples/typescript:lint:fix"
]
@@ -227,9 +233,11 @@
"dependencies": [
"./packages/spectacle:prettier",
"./packages/create-spectacle:prettier",
+ "./packages/spectacle-mdx-loader:prettier",
"./website:prettier",
"./examples/js:prettier",
"./examples/md:prettier",
+ "./examples/mdx:prettier",
"./examples/one-page:prettier",
"./examples/typescript:prettier"
]
@@ -238,9 +246,11 @@
"dependencies": [
"./packages/spectacle:prettier:fix",
"./packages/create-spectacle:prettier:fix",
+ "./packages/spectacle-mdx-loader:prettier:fix",
"./website:prettier:fix",
"./examples/js:prettier:fix",
"./examples/md:prettier:fix",
+ "./examples/mdx:prettier:fix",
"./examples/one-page:prettier:fix",
"./examples/typescript:prettier:fix"
]
diff --git a/packages/spectacle-mdx-loader/CHANGELOG.md b/packages/spectacle-mdx-loader/CHANGELOG.md
new file mode 100644
index 000000000..3fc665a90
--- /dev/null
+++ b/packages/spectacle-mdx-loader/CHANGELOG.md
@@ -0,0 +1,13 @@
+# spectacle-mdx-loader
+
+## 0.1.1
+
+- Update to `spectacle@6`.
+
+## 0.1.0
+
+- Move `examples/loader-mdx` to `examples/mdx` and publish for consumption by `spectacle-cli`.
+
+## 0.0.1
+
+- Initial release.
diff --git a/packages/spectacle-mdx-loader/LICENSE.txt b/packages/spectacle-mdx-loader/LICENSE.txt
new file mode 100644
index 000000000..15dcddcba
--- /dev/null
+++ b/packages/spectacle-mdx-loader/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2019 Formidable Labs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/packages/spectacle-mdx-loader/README.md b/packages/spectacle-mdx-loader/README.md
new file mode 100644
index 000000000..f41da7da5
--- /dev/null
+++ b/packages/spectacle-mdx-loader/README.md
@@ -0,0 +1,77 @@
+# spectacle-mdx-loader
+
+[![npm version][npm_img]][npm_site]
+[![Maintenance Status][maintenance-image]](#maintenance-status)
+
+An [MDX][] [webpack][] loader for [Spectacle][] presentation decks.
+
+## Install
+
+```sh
+$ npm add --save-dev spectacle-mdx-loader
+$ yarn add --dev spectacle-mdx-loader
+```
+
+## Usage
+
+To use this loader in a Spectacle presentation you need to configure webpack and then add the surrounding MDX Spectacle helper code. See a [full example](../../examples/mdx) for more details.
+
+First, integrate into your `webpack.config.js` file:
+
+```js
+module.exports = {
+ // ...
+ module: {
+ rules: [
+ // ...
+ // `.mdx` files go through babel and mdx transforming loader.
+ {
+ test: /\.mdx$/,
+ use: ['babel-loader', 'spectacle-mdx-loader']
+ }
+ ]
+ }
+};
+```
+
+Then, write up your MDX file (e.g., `slides.mdx`) and wrap up a full Spectacle deck:
+
+```js
+import React from 'react';
+import { render } from 'react-dom';
+import { MDXProvider } from '@mdx-js/react';
+import { Deck, Slide, Notes, mdxComponentMap } from 'spectacle';
+
+import slides, { notes } from './slides.mdx';
+
+const Deck = () => (
+
+
+ {slides
+ .map((MDXSlide, i) => [MDXSlide, notes[i]])
+ .map(([MDXSlide, MDXNote], i) => (
+
+
+
+
+
+
+ ))}
+
+
+);
+
+render(, document.getElementById('root'));
+```
+
+[npm_img]: https://badge.fury.io/js/spectacle-mdx-loader.svg
+[npm_site]: http://badge.fury.io/js/spectacle-mdx-loader
+[mdx]: https://mdxjs.com/
+[webpack]: https://webpack.js.org/
+[spectacle]: https://formidable.com/open-source/spectacle/
+[npx]: https://www.npmjs.com/package/npx
+[maintenance-image]: https://img.shields.io/badge/maintenance-active-green.svg?color=brightgreen&style=flat
+
+## Maintenance Status
+
+**Active:** Formidable is actively working on this project, and we expect to continue for work for the foreseeable future. Bug reports, feature requests and pull requests are welcome.
diff --git a/packages/spectacle-mdx-loader/package.json b/packages/spectacle-mdx-loader/package.json
new file mode 100644
index 000000000..fb2e19c1a
--- /dev/null
+++ b/packages/spectacle-mdx-loader/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "spectacle-mdx-loader",
+ "version": "0.1.1",
+ "description": "Webpack MDX loader for Spectacle presentations",
+ "main": "src/index.js",
+ "engines": {
+ "node": ">=10"
+ },
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/FormidableLabs/spectacle.git"
+ },
+ "dependencies": {
+ "@mdx-js/mdx": "^1.5.3",
+ "gray-matter": "^4.0.2",
+ "loader-utils": "^1.2.3",
+ "normalize-newline": "^3.0.0"
+ },
+ "scripts": {
+ "lint": "wireit",
+ "lint:fix": "wireit",
+ "prettier": "wireit",
+ "prettier:fix": "wireit"
+ },
+ "wireit": {
+ "lint": {
+ "command": "nps lint:pkg -- -- src",
+ "files": [
+ "../../.eslintignore",
+ "../../.eslintrc",
+ "*.js",
+ "src/**"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "lint:fix": {
+ "command": "pnpm run lint || nps lint:pkg:fix -- -- src",
+ "files": [
+ "../../.eslintignore",
+ "../../.eslintrc",
+ "*.js",
+ "src/**"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "prettier": {
+ "command": "nps prettier:pkg -- -- src",
+ "files": [
+ "../../.prettierignore",
+ "../../.prettierrc",
+ "*.js",
+ "src/**"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ },
+ "prettier:fix": {
+ "command": "pnpm run prettier || nps prettier:pkg:fix -- -- src",
+ "files": [
+ "../../.prettierignore",
+ "../../.prettierrc",
+ "*.js",
+ "src/**"
+ ],
+ "output": [],
+ "packageLocks": [
+ "pnpm-lock.yaml"
+ ]
+ }
+ }
+}
diff --git a/packages/spectacle-mdx-loader/src/helpers.js b/packages/spectacle-mdx-loader/src/helpers.js
new file mode 100644
index 000000000..eb9790459
--- /dev/null
+++ b/packages/spectacle-mdx-loader/src/helpers.js
@@ -0,0 +1,112 @@
+'use strict';
+
+const mdx = require('@mdx-js/mdx');
+
+const EX_REG = /export\sdefault\s/g;
+/*
+ * See this link for an explanation of the regex solution:
+ * https://stackoverflow.com/questions/6462578/regex-to-match-all-instances-not-inside-quotes/23667311#23667311
+ * Note that the regex isn't concerned about code blocks (```).
+ * Tracking pairs of ` should be sufficient to capture code blocks, too.
+ */
+const MOD_REG = /\\`|`(?:\\`|[^`])*`|(^(?:import|export).*$)/gm;
+
+const NOTES_MARKER = 'Notes: ';
+const NOTES_REG = new RegExp(`^${NOTES_MARKER}`, 'm');
+
+const nameForComponent = (index, type) => `MDXContentWrapper${type}${index}`;
+
+/*
+ * We want to pull the notes out of each slide. This RegEx looks for "Notes: "
+ * that starts on a new line. Anything after the notes marker will be considered notes.
+ */
+const isolateNotes = (content) => {
+ const indexOfNotes = content.search(NOTES_REG);
+ if (indexOfNotes >= 0) {
+ // found the notes marker!
+ return content.substring(indexOfNotes + NOTES_MARKER.length);
+ }
+ return '';
+};
+
+/*
+ * When generating the slide components, we only want the slide content to be
+ * compiled by mdx.sync. Remove all the notes content.
+ */
+const removeNotes = (content) => {
+ const indexOfNotes = content.search(NOTES_REG);
+ if (indexOfNotes >= 0) {
+ // found the notes marker!
+ return content.substring(0, indexOfNotes);
+ }
+ return content;
+};
+
+/*
+ * As referenced before, we need to add the imports and exports to
+ * every slide/note mdx string again. That way mdx.sync can find
+ * the component definitions for any custom components used in the
+ * MDX file.
+ */
+const addInlineModules = (content, inlineMods) => `
+${inlineMods.join('\n')}\n
+${content}`;
+
+/*
+ * Use mdx.sync to compile a separate JSX component for each slide
+ * written in MDX.
+ */
+const sync = (content, options) => mdx.sync(content, options);
+
+/*
+ * mdx.sync will attempt to default export the component generated for each
+ * slide. However, we have multiple slides and thus multiple generated components.
+ * We can't export multiple defaults, so we must remove all existing occurences of
+ * `export default`.
+ */
+const removeDefaultExport = (content) => content.replace(EX_REG, '');
+
+/*
+ * Remove the inline exports/imports. We don't want to duplicate inline import/export
+ * statements littered throughout the file output.
+ */
+const removeInlineModules = (content) =>
+ content.replace(MOD_REG, (value, group1) => {
+ if (!group1) {
+ // group1 is empty, so this is not the import/export case we're looking for
+ return value;
+ }
+ return '';
+ });
+
+const trim = (content) => content.trim();
+
+/*
+ * The generated component from mdx.sync assumes it's the only component that
+ * will inhabit a file. It has const definitions outside of the auto-named MDXContent
+ * component. This would be fine if we weren't generating a component for each
+ * slide/note. However, in our case we would generate a lot of duplicate variable names.
+ * Thus, the easiest solution is to wrap each mdx.sync-generated component+const
+ * definitions in another component that is uniquely named.
+ */
+const wrapComponent = (content, index, type) => {
+ const wrapperName = nameForComponent(index, type);
+ return `function ${wrapperName}(props) {
+ ${content}
+ return ();
+};
+${wrapperName}.isMDXComponent = true;`;
+};
+
+module.exports = {
+ isolateNotes,
+ removeNotes,
+ wrapComponent,
+ trim,
+ removeInlineModules,
+ removeDefaultExport,
+ sync,
+ addInlineModules,
+ nameForComponent,
+ MOD_REG
+};
diff --git a/packages/spectacle-mdx-loader/src/index.js b/packages/spectacle-mdx-loader/src/index.js
new file mode 100644
index 000000000..6a1d6cfe0
--- /dev/null
+++ b/packages/spectacle-mdx-loader/src/index.js
@@ -0,0 +1,126 @@
+'use strict';
+
+const { getOptions } = require('loader-utils');
+const matter = require('gray-matter');
+const normalizeNewline = require('normalize-newline');
+
+const {
+ wrapComponent,
+ trim,
+ removeInlineModules,
+ removeDefaultExport,
+ sync,
+ addInlineModules,
+ nameForComponent,
+ isolateNotes,
+ removeNotes,
+ MOD_REG
+} = require('./helpers');
+
+const SLIDE_REG = /\n---\n/;
+
+const SLIDE_TYPE = 'Slide';
+const NOTES_TYPE = 'Notes';
+
+// eslint-disable-next-line max-statements
+module.exports = async function (src) {
+ const { data, content } = matter(src);
+
+ const inlineModules = [];
+
+ const callback = this.async();
+ const options = Object.assign({}, getOptions(this), {
+ filepath: this.resourcePath
+ });
+
+ const separatedContent = normalizeNewline(content)
+ /*
+ * Set aside all inline JSX import and export statements from the MDX file.
+ * When mdx.sync() compiles MDX into JSX, it will stub any component that doesn't
+ * have a corresponding import. Therefore, we will re-add all of the imports/exports
+ * to each slide before compiling the MDX via mdx.sync().
+ */
+ .replace(MOD_REG, (value, group1) => {
+ if (!group1) {
+ // group1 is empty, so this is not the import/export case we're looking for
+ return value;
+ }
+ // found an inline export or import statement
+ inlineModules.push(value);
+ return '';
+ })
+ /*
+ * Split the MDX file by occurences of `---`. This is a reserved symbol
+ * to denote slide boundaries.
+ */
+ .split(SLIDE_REG);
+
+ /*
+ * Process the content and generate an array of slide components
+ */
+ const slides = separatedContent
+ .map(removeNotes)
+ .map((mdxContent) => addInlineModules(mdxContent, inlineModules))
+ .map((mdxContent) => sync(mdxContent, options))
+ .map(removeDefaultExport)
+ .map(removeInlineModules)
+ .map(trim)
+ .map((mdxContent, index) => wrapComponent(mdxContent, index, SLIDE_TYPE));
+
+ /*
+ * Process the content and generate an array of notes components
+ */
+ const notes = separatedContent
+ .map(isolateNotes)
+ .map((mdxContent) => addInlineModules(mdxContent, inlineModules))
+ .map((mdxContent) => sync(mdxContent, options))
+ .map(removeDefaultExport)
+ .map(removeInlineModules)
+ .map(trim)
+ .map((mdxContent, index) => wrapComponent(mdxContent, index, NOTES_TYPE));
+
+ const { modules = [] } = data;
+ const slideWrapperNames = [];
+ const noteWrapperNames = [];
+
+ /*
+ * Begin composing the final output. Include React, mdx, modules, and the inline
+ * export/import statements that we removed in Step 6.
+ */
+ let allCode = `/* @jsx mdx */
+import React from 'react'
+import { mdx } from '@mdx-js/react'
+${modules.join('\n')}
+${inlineModules
+ .filter((el, i, arr) => {
+ return arr.indexOf(el) === i;
+ })
+ .join('\n')}\n\n`;
+
+ /*
+ * Add in the slide component definitions. Keep track of the component names.
+ */
+ slides.forEach((s, i) => {
+ allCode += `${s}\n\n`;
+ slideWrapperNames.push(nameForComponent(i, SLIDE_TYPE));
+ });
+
+ /*
+ * Add in the notes component definitions. Keep track of the component names.
+ */
+ notes.forEach((n, i) => {
+ allCode += `${n}\n\n`;
+ noteWrapperNames.push(nameForComponent(i, NOTES_TYPE));
+ });
+
+ /*
+ * Finally, declare the default export as an array of the slide components.
+ * See /examples/mdx/for how to import and use the generated slide components.
+ */
+ const footer = `
+export const notes = [${noteWrapperNames}];\n\n
+export default [${slideWrapperNames}]`;
+ allCode += footer;
+
+ return callback(null, allCode);
+};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 8aa0da5f5..4b9219d84 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -113,6 +113,23 @@ importers:
react-dom: 18.2.0_react@18.2.0
spectacle: link:../../packages/spectacle
+ examples/mdx:
+ specifiers:
+ '@mdx-js/react': ^1.5.3
+ prop-types: ^15.7.2
+ react: ^18.1.0
+ react-dom: ^18.1.0
+ spectacle: '*'
+ spectacle-mdx-loader: '*'
+ dependencies:
+ '@mdx-js/react': 1.6.22_react@18.2.0
+ prop-types: 15.8.1
+ react: 18.2.0
+ react-dom: 18.2.0_react@18.2.0
+ spectacle: link:../../packages/spectacle
+ devDependencies:
+ spectacle-mdx-loader: link:../../packages/spectacle-mdx-loader
+
examples/one-page:
specifiers:
pretty: ^2.0.0
@@ -234,6 +251,18 @@ importers:
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
+ packages/spectacle-mdx-loader:
+ specifiers:
+ '@mdx-js/mdx': ^1.5.3
+ gray-matter: ^4.0.2
+ loader-utils: ^1.2.3
+ normalize-newline: ^3.0.0
+ dependencies:
+ '@mdx-js/mdx': 1.6.22
+ gray-matter: 4.0.3
+ loader-utils: 1.4.0
+ normalize-newline: 3.0.0
+
website:
specifiers:
'@docusaurus/core': ^2.0.1
@@ -470,7 +499,6 @@ packages:
source-map: 0.5.7
transitivePeerDependencies:
- supports-color
- dev: true
/@babel/core/7.18.10:
resolution: {integrity: sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==}
@@ -782,7 +810,6 @@ packages:
/@babel/helper-plugin-utils/7.10.4:
resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==}
- dev: true
/@babel/helper-plugin-utils/7.18.9:
resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==}
@@ -1226,7 +1253,6 @@ packages:
'@babel/helper-plugin-utils': 7.18.9
'@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9
'@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9
- dev: true
/@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.18.10:
resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==}
@@ -1535,7 +1561,6 @@ packages:
dependencies:
'@babel/core': 7.12.9
'@babel/helper-plugin-utils': 7.18.9
- dev: true
/@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.10:
resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
@@ -1618,7 +1643,6 @@ packages:
dependencies:
'@babel/core': 7.12.9
'@babel/helper-plugin-utils': 7.18.9
- dev: true
/@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.10:
resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
@@ -2241,7 +2265,6 @@ packages:
dependencies:
'@babel/core': 7.12.9
'@babel/helper-plugin-utils': 7.18.9
- dev: true
/@babel/plugin-transform-parameters/7.18.8_@babel+core@7.18.10:
resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==}
@@ -2914,7 +2937,6 @@ packages:
globals: 11.12.0
transitivePeerDependencies:
- supports-color
- dev: true
/@babel/traverse/7.18.11_supports-color@5.5.0:
resolution: {integrity: sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==}
@@ -4406,7 +4428,6 @@ packages:
unist-util-visit: 2.0.3
transitivePeerDependencies:
- supports-color
- dev: true
/@mdx-js/react/1.6.22_react@17.0.2:
resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==}
@@ -4416,9 +4437,16 @@ packages:
react: 17.0.2
dev: true
+ /@mdx-js/react/1.6.22_react@18.2.0:
+ resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==}
+ peerDependencies:
+ react: ^16.13.1 || ^17.0.0
+ dependencies:
+ react: 18.2.0
+ dev: false
+
/@mdx-js/util/1.6.22:
resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==}
- dev: true
/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3:
resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==}
@@ -6044,7 +6072,6 @@ packages:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
dependencies:
sprintf-js: 1.0.3
- dev: true
/argparse/2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -6215,7 +6242,7 @@ packages:
loader-utils: 2.0.2
make-dir: 3.1.0
schema-utils: 2.7.1
- webpack: 5.74.0
+ webpack: 5.74.0_webpack-cli@4.10.0
dev: true
/babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9:
@@ -6226,7 +6253,6 @@ packages:
'@babel/core': 7.12.9
'@babel/helper-plugin-utils': 7.10.4
'@mdx-js/util': 1.6.22
- dev: true
/babel-plugin-dynamic-import-node/2.3.3:
resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
@@ -6238,7 +6264,6 @@ packages:
resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==}
dependencies:
'@babel/helper-plugin-utils': 7.10.4
- dev: true
/babel-plugin-istanbul/6.1.1:
resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
@@ -6441,7 +6466,6 @@ packages:
/big.js/5.2.2:
resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
- dev: true
/binary-extensions/2.2.0:
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
@@ -6693,7 +6717,6 @@ packages:
/camelcase-css/2.0.1:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
- dev: true
/camelcase-keys/6.2.2:
resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
@@ -7196,7 +7219,6 @@ packages:
resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
dependencies:
safe-buffer: 5.1.2
- dev: true
/cookie-signature/1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
@@ -7630,7 +7652,6 @@ packages:
optional: true
dependencies:
ms: 2.1.2
- dev: true
/debug/4.3.4_supports-color@5.5.0:
resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
@@ -7763,7 +7784,6 @@ packages:
resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==}
dependencies:
repeat-string: 1.6.1
- dev: true
/detect-indent/6.1.0:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
@@ -8009,7 +8029,6 @@ packages:
/emojis-list/3.0.0:
resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
engines: {node: '>= 4'}
- dev: true
/emoticon/3.2.0:
resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==}
@@ -8311,7 +8330,6 @@ packages:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
hasBin: true
- dev: true
/esquery/1.4.0:
resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
@@ -8494,7 +8512,6 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
is-extendable: 0.1.1
- dev: true
/extend/3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
@@ -9021,7 +9038,6 @@ packages:
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
- dev: true
/function.prototype.name/1.1.5:
resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
@@ -9040,7 +9056,6 @@ packages:
/gensync/1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
- dev: true
/get-caller-file/2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
@@ -9249,7 +9264,6 @@ packages:
kind-of: 6.0.3
section-matter: 1.0.0
strip-bom-string: 1.0.0
- dev: true
/gzip-size/6.0.0:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
@@ -9321,7 +9335,6 @@ packages:
engines: {node: '>= 0.4.0'}
dependencies:
function-bind: 1.1.1
- dev: true
/hast-to-hyperscript/9.0.1:
resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==}
@@ -9360,7 +9373,6 @@ packages:
web-namespaces: 1.1.4
xtend: 4.0.2
zwitch: 1.0.5
- dev: true
/hast-util-raw/6.1.0:
resolution: {integrity: sha512-5FoZLDHBpka20OlZZ4I/+RBw5piVQ8iI1doEvffQhx5CbCyTtP8UCq8Tw6NmTAMtXgsQxmhW7Ly8OdFre5/YMQ==}
@@ -9875,7 +9887,6 @@ packages:
resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
dependencies:
has: 1.0.3
- dev: true
/is-date-object/1.0.5:
resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
@@ -9900,7 +9911,6 @@ packages:
/is-extendable/0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
- dev: true
/is-extglob/2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
@@ -10785,7 +10795,6 @@ packages:
dependencies:
argparse: 1.0.10
esprima: 4.0.1
- dev: true
/js-yaml/4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
@@ -10878,11 +10887,17 @@ packages:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
dev: true
+ /json5/1.0.1:
+ resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.6
+ dev: false
+
/json5/2.2.1:
resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
engines: {node: '>=6'}
hasBin: true
- dev: true
/jsonc-parser/3.2.0:
resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
@@ -10958,7 +10973,6 @@ packages:
/kind-of/6.0.3:
resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
engines: {node: '>=0.10.0'}
- dev: true
/kleur/3.0.3:
resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
@@ -11036,6 +11050,15 @@ packages:
engines: {node: '>=6.11.5'}
dev: true
+ /loader-utils/1.4.0:
+ resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==}
+ engines: {node: '>=4.0.0'}
+ dependencies:
+ big.js: 5.2.2
+ emojis-list: 3.0.0
+ json5: 1.0.1
+ dev: false
+
/loader-utils/2.0.2:
resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==}
engines: {node: '>=8.9.0'}
@@ -11106,7 +11129,6 @@ packages:
/lodash.uniq/4.5.0:
resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
- dev: true
/lodash/4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@@ -11246,7 +11268,6 @@ packages:
resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==}
dependencies:
unist-util-remove: 2.1.0
- dev: true
/mdast-util-definitions/3.0.1:
resolution: {integrity: sha512-BAv2iUm/e6IK/b2/t+Fx69EL/AGcq/IG2S+HxHjDJGfLJtd6i9SZUS76aC9cig+IEucsqxKTR0ot3m933R3iuA==}
@@ -11258,7 +11279,6 @@ packages:
resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==}
dependencies:
unist-util-visit: 2.0.3
- dev: true
/mdast-util-to-hast/10.0.1:
resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==}
@@ -11271,7 +11291,6 @@ packages:
unist-util-generated: 1.1.6
unist-util-position: 3.1.0
unist-util-visit: 2.0.3
- dev: true
/mdast-util-to-hast/9.1.2:
resolution: {integrity: sha512-OpkFLBC2VnNAb2FNKcKWu9FMbJhQKog+FCT8nuKmQNIKXyT1n3SIskE7uWDep6x+cA20QXlK5AETHQtYmQmxtQ==}
@@ -11483,7 +11502,6 @@ packages:
/minimist/1.2.6:
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
- dev: true
/mixin-object/2.0.1:
resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==}
@@ -11628,6 +11646,11 @@ packages:
abbrev: 1.1.1
dev: true
+ /normalize-newline/3.0.0:
+ resolution: {integrity: sha512-uLZbfjzZfHTlaGXMJkwc5TUEhY7/+LHvP1X/OcDt6SLkubrshIOg7hbT6rkmAhyvGpi6kJ+XcMfwM7D3/Zieqg==}
+ engines: {node: '>=4'}
+ dev: false
+
/normalize-package-data/2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
@@ -12089,7 +12112,6 @@ packages:
/path-parse/1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- dev: true
/path-to-regexp/0.1.7:
resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
@@ -13463,7 +13485,6 @@ packages:
/remark-footnotes/2.0.0:
resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==}
- dev: true
/remark-mdx/1.6.22:
resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==}
@@ -13478,7 +13499,6 @@ packages:
unified: 9.2.0
transitivePeerDependencies:
- supports-color
- dev: true
/remark-parse/8.0.3:
resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==}
@@ -13510,7 +13530,6 @@ packages:
resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==}
dependencies:
mdast-squeeze-paragraphs: 4.0.0
- dev: true
/renderkid/3.0.0:
resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
@@ -13615,7 +13634,6 @@ packages:
is-core-module: 2.10.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- dev: true
/resolve/2.0.0-next.4:
resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
@@ -13722,7 +13740,6 @@ packages:
/safe-buffer/5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
- dev: true
/safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
@@ -13864,7 +13881,6 @@ packages:
dependencies:
extend-shallow: 2.0.1
kind-of: 6.0.3
- dev: true
/select-hose/2.0.0:
resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
@@ -13894,7 +13910,6 @@ packages:
/semver/5.7.1:
resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
hasBin: true
- dev: true
/semver/6.3.0:
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
@@ -14185,7 +14200,6 @@ packages:
/source-map/0.5.7:
resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
engines: {node: '>=0.10.0'}
- dev: true
/source-map/0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
@@ -14292,7 +14306,6 @@ packages:
/sprintf-js/1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
- dev: true
/sshpk/1.17.0:
resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
@@ -14482,7 +14495,6 @@ packages:
/strip-bom-string/1.0.0:
resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
engines: {node: '>=0.10.0'}
- dev: true
/strip-bom/3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
@@ -14632,7 +14644,6 @@ packages:
/supports-preserve-symlinks-flag/1.0.0:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- dev: true
/surge-fstream-ignore/1.0.6:
resolution: {integrity: sha512-hNN52cz2fYCAzhlHmWPn4aE3bFbpBt01AkWFLljrtSzFvxlipLAeLuLtQ3t4f0RKoUkjzXWCAFK13WoET2iM1A==}
@@ -15113,7 +15124,6 @@ packages:
is-plain-obj: 2.1.0
trough: 1.0.5
vfile: 4.2.1
- dev: true
/unified/9.2.2:
resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==}
@@ -15157,7 +15167,6 @@ packages:
resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==}
dependencies:
unist-util-is: 4.1.0
- dev: true
/unist-util-stringify-position/2.0.3:
resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}