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)** + +--- + +![datboi](https://pbs.twimg.com/media/CkjFUyTXEAEysBY.jpg) + +--- + +###### 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==}