From 89905b6bfcd48e3f2254d66f379be57831d3ff1d Mon Sep 17 00:00:00 2001 From: Jim O'Donnell Date: Sun, 17 Sep 2023 16:54:16 +0100 Subject: [PATCH] Markdownz: replace remark with rehype Replace `remark` with `markdownz`, to parse Zooniverse markdown to HTML, and `rehype`, to render the parsed HTML as a React component tree. Bump `@zooniverse/react-components` to 1.7.0. Our `markdown-it` plugins rely on Node modules. I've added fallbacks to the dev classifier and project Webpack builds, where they require them. --- package.json | 3 - packages/app-content-pages/package.json | 2 +- packages/app-project/next.config.js | 4 + packages/app-project/package.json | 2 +- packages/app-project/webpack.config.js | 3 + packages/lib-classifier/package.json | 5 +- packages/lib-classifier/webpack.dev.js | 7 +- packages/lib-react-components/CHANGELOG.md | 5 + packages/lib-react-components/package.json | 12 +- .../src/Markdownz/Markdownz.js | 95 +-- .../src/Markdownz/Markdownz.spec.js | 136 +---- .../src/Markdownz/lib/ping.js | 140 ----- .../src/Markdownz/lib/ping.spec.js | 270 --------- yarn.lock | 550 +++++++++--------- 14 files changed, 320 insertions(+), 914 deletions(-) delete mode 100644 packages/lib-react-components/src/Markdownz/lib/ping.js delete mode 100644 packages/lib-react-components/src/Markdownz/lib/ping.spec.js diff --git a/package.json b/package.json index b65d849837b..328d8f33f85 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,6 @@ "nyc": "~15.1.0", "snazzy": "~9.0.0" }, - "resolutions": { - "**/trim": "~1.0" - }, "scripts": { "bootstrap": "./bin/bootstrap.sh", "bootstrap:es6": "./bin/bootstrap:es6.sh", diff --git a/packages/app-content-pages/package.json b/packages/app-content-pages/package.json index cae7c6613cb..e2155866cf0 100644 --- a/packages/app-content-pages/package.json +++ b/packages/app-content-pages/package.json @@ -20,7 +20,7 @@ "@zooniverse/async-states": "~0.0.1", "@zooniverse/grommet-theme": "~3.1.0", "@zooniverse/panoptes-js": "~0.4.0", - "@zooniverse/react-components": "~1.6.0", + "@zooniverse/react-components": "~1.7.0", "contentful": "~10.5.0", "dotenv": "~16.3.0", "dotenv-webpack": "~8.0.0", diff --git a/packages/app-project/next.config.js b/packages/app-project/next.config.js index 4828e9de5b0..a84afbb6120 100644 --- a/packages/app-project/next.config.js +++ b/packages/app-project/next.config.js @@ -104,6 +104,10 @@ const nextConfig = { alias: { ...config.resolve.alias, ...webpackConfig.resolve.alias + }, + fallback: { + ...config.resolve.fallback, + ...webpackConfig.resolve.fallback } } return config diff --git a/packages/app-project/package.json b/packages/app-project/package.json index d032d850367..e7cc8a31c0a 100644 --- a/packages/app-project/package.json +++ b/packages/app-project/package.json @@ -29,7 +29,7 @@ "@zooniverse/classifier": "^0.0.1", "@zooniverse/grommet-theme": "~3.1.0", "@zooniverse/panoptes-js": "~0.4.0", - "@zooniverse/react-components": "~1.6.0", + "@zooniverse/react-components": "~1.7.0", "cookie": "~0.5.0", "d3": "~6.7.0", "engine.io-client": "~6.5.0", diff --git a/packages/app-project/webpack.config.js b/packages/app-project/webpack.config.js index 9a8a91a3db2..56190b4bdd3 100644 --- a/packages/app-project/webpack.config.js +++ b/packages/app-project/webpack.config.js @@ -11,6 +11,9 @@ module.exports = { '@stores': path.resolve(__dirname, 'stores'), '@test': path.resolve(__dirname, 'test'), 'sentry.edge.config.js': path.resolve(__dirname, 'sentry.edge.config.js') + }, + fallback: { + fs: false } } } diff --git a/packages/lib-classifier/package.json b/packages/lib-classifier/package.json index 04d716dbd3c..e690c593066 100644 --- a/packages/lib-classifier/package.json +++ b/packages/lib-classifier/package.json @@ -79,7 +79,7 @@ "@wojtekmaj/enzyme-adapter-react-17": "~0.8.0", "@zooniverse/grommet-theme": "~3.1.0", "@zooniverse/panoptes-js": "~0.4.0", - "@zooniverse/react-components": "~1.6.0", + "@zooniverse/react-components": "~1.7.0", "@zooniverse/standard": "~2.0.0", "babel-loader": "~9.1.0", "babel-plugin-module-resolver": "~5.0.0", @@ -104,6 +104,7 @@ "mst-middlewares": "~5.1.0", "nock": "~13.3.0", "panoptes-client": "~5.5.1", + "path-browserify": "~1.0.1", "polished": "~4.2.2", "process": "~0.11.10", "prop-types": "^15.8.1", @@ -118,6 +119,8 @@ "style-loader": "~3.3.1", "styled-components": "~5.3.3", "superagent": "~8.1.0", + "url": "~0.11.2", + "util": "~0.12.5", "webpack": "~5.88.0", "webpack-cli": "~5.1.0", "webpack-dev-server": "~4.15.0" diff --git a/packages/lib-classifier/webpack.dev.js b/packages/lib-classifier/webpack.dev.js index caab53bef2d..bfd2b5d2581 100644 --- a/packages/lib-classifier/webpack.dev.js +++ b/packages/lib-classifier/webpack.dev.js @@ -53,7 +53,12 @@ module.exports = { '@viewers': path.resolve(__dirname, 'src/components/Classifier/components/SubjectViewer') }, fallback: { - url: false, + fs: false, + // for markdown-it plugins + path: require.resolve("path-browserify"), + util: require.resolve("util"), + url: require.resolve("url"), + process: false, } }, module: { diff --git a/packages/lib-react-components/CHANGELOG.md b/packages/lib-react-components/CHANGELOG.md index 6efdc4aacfb..40639df1dcd 100644 --- a/packages/lib-react-components/CHANGELOG.md +++ b/packages/lib-react-components/CHANGELOG.md @@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [1.7.0] 2023-09-17 + +### Changed +- `Markdownz`: replace `remark` with `markdownz` and `rehype`. + ## [1.6.0] 2023-09-12 ### Changed diff --git a/packages/lib-react-components/package.json b/packages/lib-react-components/package.json index 45402ef274a..6fb0fa3f5a8 100644 --- a/packages/lib-react-components/package.json +++ b/packages/lib-react-components/package.json @@ -3,7 +3,7 @@ "description": "Zooniverse React Components", "license": "Apache-2.0", "author": "Zooniverse (https://www.zooniverse.org/)", - "version": "1.6.0", + "version": "1.7.0", "main": "dist/cjs/index.js", "exports": { ".": { @@ -44,19 +44,15 @@ "cuid": "~3.0.0", "formik": "~2.4.0", "i18next": "~23.5.0", + "markdownz": "~8.1.1", "mime": "~3.0.0", "polished": "~4.2.2", "prop-types": "~15.8.1", "react-i18next": "~13.2.0", "react-resize-detector": "~9.1.0", "react-rnd": "10.4.1", - "remark": "~12.0.1", - "remark-emoji": "~2.0.2", - "remark-external-links": "~3.1.1", - "remark-footnotes": "2.0.0", - "remark-react": "~8.0.0", - "remark-sub-super": "~1.0.16", - "remark-toc": "~5.1.1", + "rehype": "~11.0.0", + "rehype-react": "~6.2.1", "unist-util-visit": "~1.4.0" }, "peerDependencies": { diff --git a/packages/lib-react-components/src/Markdownz/Markdownz.js b/packages/lib-react-components/src/Markdownz/Markdownz.js index 26c6d280ffd..25c061c68cf 100644 --- a/packages/lib-react-components/src/Markdownz/Markdownz.js +++ b/packages/lib-react-components/src/Markdownz/Markdownz.js @@ -1,4 +1,4 @@ -import { Fragment, useCallback } from 'react' +import { createElement, Fragment, useCallback } from 'react' import PropTypes from 'prop-types' import { Anchor, @@ -13,27 +13,17 @@ import { Text } from 'grommet' -import remark from 'remark' -import remark2react from 'remark-react' -import emoji from 'remark-emoji' -import remarkSubSuper from 'remark-sub-super' -import externalLinks from 'remark-external-links' -import toc from 'remark-toc' -import ping from './lib/ping' -import footnotes from 'remark-footnotes' +import { utils } from 'markdownz' +import rehype from 'rehype' +import rehype2react from 'rehype-react' import Media from '../Media' import withThemeContext from '../helpers/withThemeContext' import theme from './theme' -const HASHTAG = '#' -const AT = '@' -const SUBJECT_SYMBOL = '^S' - -export const RESTRICTED_USERNAMES = ['admins', 'moderators', 'researchers', 'scientists', 'team', 'support'] - // Support image resizing, video, and audio using markdown's image syntax export function renderMedia(nodeProps) { - let width, height + let width = nodeProps.width + let height = nodeProps.height const imgSizeRegex = /=(\d+(%|px|em|rem|vw)?)x(\d+(%|px|em|rem|vh)?)?/ let alt = nodeProps.alt const src = nodeProps.src @@ -71,33 +61,11 @@ const componentMappings = { ul: ({ children }) => } -export function buildResourceURL(baseURI, projectSlug, resource, symbol) { - if (!resource) return '' - const baseURL = (projectSlug) ? `${baseURI}/projects/${projectSlug}` : baseURI - - if (symbol === HASHTAG) return (projectSlug) ? `${baseURL}/talk/tag/${resource}` : `${baseURL}/talk/search?query=%23${resource}` - if (symbol === AT) return `${baseURL}/users/${resource}` - if (symbol === SUBJECT_SYMBOL && projectSlug) return `${baseURL}/talk/subjects/${resource}` - - return '' -} - -export function shouldResourceBeLinkable(restrictedUserNames, projectSlug, resource, symbol) { - if (symbol === AT) return !restrictedUserNames.includes(resource) - if (symbol === SUBJECT_SYMBOL) return !!projectSlug - return true -} - -export function replaceImageString(img, altText, imageURL, imageSize) { - return `![${altText} ${imageSize}](${imageURL})` -} - function Markdownz({ baseURI = '', children, components = {}, projectSlug = '', - restrictedUserNames = RESTRICTED_USERNAMES, settings = {} }) { if (!children) return null @@ -106,42 +74,32 @@ function Markdownz({ console.warn('Overriding the rendering function for the img tag may break the syntax support for image resizing and using image markup for video and audio. Are you sure you want to do this?') } - const imageRegex = /!\[([^\]]+?)\]\((https:\/\/[^)]+?) (=\d+?(|%|px|em|rem|vw)x\d*?(|%|px|em|rem|vh))\)/g - const newChildren = children.replace(imageRegex, replaceImageString) - - const remarkReactComponents = { ...componentMappings, ...components } - const remarkSettings = { ...settings } - - const pingCallback = useCallback( - (resource, symbol) => shouldResourceBeLinkable(restrictedUserNames, projectSlug, resource, symbol), - [restrictedUserNames, projectSlug] - ) - const resourceURL = useCallback( - (resource, symbol) => buildResourceURL(baseURI, projectSlug, resource, symbol), - [baseURI, projectSlug] - ) - let markdown = null + const rehypeReactComponents = { ...componentMappings, ...components } + const rehypeSettings = { ...settings } + + const html = utils.getHtml({ + baseURI, + content: children, + project: { + slug: projectSlug + } + }) + let parsedHTML = null try { - markdown = remark() - .data('settings', remarkSettings) - .use(emoji) - .use(remarkSubSuper) - .use(externalLinks) - .use(footnotes, { inlineNotes: true }) - .use(ping, { - ping: pingCallback, - pingSymbols: [AT, HASHTAG, SUBJECT_SYMBOL], - resourceURL + parsedHTML = rehype() + .data('settings', rehypeSettings) + .use(rehype2react, { + Fragment, + createElement, + components: rehypeReactComponents }) - .use(toc) - .use(remark2react, { remarkReactComponents }) - .processSync(newChildren).result + .processSync(html).result } catch (error) { - markdown = error.message + parsedHTML = error.message } return ( - {markdown} + {parsedHTML} ); } @@ -151,7 +109,6 @@ Markdownz.propTypes = { children: PropTypes.string.isRequired, components: PropTypes.object, projectSlug: PropTypes.string, - restrictedUserNames: PropTypes.arrayOf(PropTypes.string), settings: PropTypes.object } diff --git a/packages/lib-react-components/src/Markdownz/Markdownz.spec.js b/packages/lib-react-components/src/Markdownz/Markdownz.spec.js index adf20d4fb89..6d85afa0a6f 100644 --- a/packages/lib-react-components/src/Markdownz/Markdownz.spec.js +++ b/packages/lib-react-components/src/Markdownz/Markdownz.spec.js @@ -3,11 +3,7 @@ import { render, screen } from '@testing-library/react' import Media from '../Media' import { Markdownz, - RESTRICTED_USERNAMES, - buildResourceURL, - renderMedia, - replaceImageString, - shouldResourceBeLinkable + renderMedia } from './Markdownz' import { markdown } from './helpers/testExamples' @@ -15,9 +11,9 @@ import { markdown } from './helpers/testExamples' // We have to use snapshots with styled-components because of the generated class names describe('', function () { it('parses markdown to jsx', function () { - const { container } = render({markdown}) - expect(container.querySelectorAll('a[href]')).to.have.lengthOf(12) - expect(container.querySelectorAll('p')).to.have.lengthOf(17) + const { container } = render({markdown}) + expect(container.querySelectorAll('a[href]')).to.have.lengthOf(11) + expect(container.querySelectorAll('p')).to.have.lengthOf(19) }) describe('at-mentions', function () { @@ -25,7 +21,7 @@ describe('', function () { describe(username, function () { function findMention(sentence) { render({sentence}) - const pingAnchor = screen.getByRole('link', { name: `@ ${username}` }) + const pingAnchor = screen.getByRole('link', { name: `@${username}` }) expect(pingAnchor.href).to.equal(`https://localhost/users/${username}`) } @@ -50,130 +46,10 @@ describe('', function () { it('correctly parses a subject mention in project context', function () { const sentence = `Look at this interesting subject: ^S1234.` render({sentence}) - const pingAnchor = screen.getByRole('link', { name: '^S 1234' }) + const pingAnchor = screen.getByRole('link', { name: 'Subject 1234' }) expect(pingAnchor.href).to.equal('https://localhost/projects/zooniverse/snapshot-wakanda/talk/subjects/1234') }) - describe('#buildResourceURL', function () { - - it('should return an empty string if symbol is not defined', function () { - const url = buildResourceURL() - expect(url).to.equal('') - }) - - it('should return an empty string if the resource is falsy, but the mention symbol is present', function () { - const url = buildResourceURL('', '', '', '@') - expect(url).to.equal('') - }) - - describe('when the symbol is #', function () { - it('should return the expected url with a search query param', function () { - const resource = 'tigers' - const baseURL = '' - const url = buildResourceURL(baseURL, '', resource, '#') - expect(url).to.equal(`${baseURL}/talk/search?query=%23${resource}`) - }) - - it('should return a url with the project slug if props.projectSlug is defined', function () { - const resource = 'tigers' - const projectSlug = 'zooniverse/snapshot-wakanda' - const url = buildResourceURL('', projectSlug, resource, '#') - expect(url).to.equal(`/projects/${projectSlug}/talk/tag/${resource}`) - }) - - it('should return a url with props.baseURI if defined', function () { - const resource = 'tigers' - const baseURI = 'https://classrooms.zooniverse.org' - const url = buildResourceURL(baseURI, '', resource, '#') - expect(url).to.equal(`${baseURI}/talk/search?query=%23${resource}`) - }) - }) - - describe('when the symbol is @', function () { - it('should return a url for the user profile', function () { - const resource = 'srallen' - const url = buildResourceURL('', '', resource, '@') - expect(url).to.equal(`/users/${resource}`) - }) - - it('should return a url with the project slug if props.projectSlug is defined', function () { - const resource = 'srallen' - const projectSlug = 'zooniverse/snapshot-wakanda' - const url = buildResourceURL('', projectSlug, resource, '@') - expect(url).to.equal(`/projects/${projectSlug}/users/${resource}`) - }) - - it('should return a url with props.baseURI if defined', function () { - const resource = 'srallen' - const baseURI = 'https://classrooms.zooniverse.org' - const url = buildResourceURL(baseURI, '', resource, '@') - expect(url).to.equal(`${baseURI}/users/${resource}`) - }) - }) - - describe('when the symbol is ^S', function () { - it('should return an empty string if props.projectSlug is not defined', function () { - const resource = '1245' - const url = buildResourceURL('', '', resource, '^S') - expect(url).to.equal('') - }) - - it('should return a url with the project slug if props.projectSlug is defined', function () { - const resource = '1234' - const projectSlug = 'zooniverse/snapshot-wakanda' - const url = buildResourceURL('', projectSlug, resource, '^S') - expect(url).to.equal(`/projects/${projectSlug}/talk/subjects/${resource}`) - }) - - it('should return a url with props.baseURI if defined', function () { - const resource = '1234' - const baseURI = 'https://classrooms.zooniverse.org' - const projectSlug = 'zooniverse/snapshot-wakanda' - const url = buildResourceURL(baseURI, projectSlug, resource, '^S') - expect(url).to.equal(`${baseURI}/projects/${projectSlug}/talk/subjects/${resource}`) - }) - }) - }) - - describe('#shouldResourceBeLinkable', function () { - it('should default to return true', function () { - expect(shouldResourceBeLinkable([], '', 'tigers', '#')).to.be.true() - }) - - it('should return true if the symbol is ^S and props.projectSlug is truthy', function () { - expect(shouldResourceBeLinkable([], 'zooniverse/snapshot-wakanda', '1234', '^S')).to.be.true() - }) - - it('should return true if the symbol is ^S and props.projectSlug is falsey', function () { - expect(shouldResourceBeLinkable([], '', '1234', '^S')).to.be.false() - }) - - it('should return true if the symbol is @ and the resource is not in the props.restrictedUserNames array', function () { - expect(shouldResourceBeLinkable([], '', 'srallen', '@')).to.be.true() - }) - - it('should return false if the symbol is @ and the resource is in the props.restrictedUserNames array', function () { - RESTRICTED_USERNAMES.forEach((username) => { - expect(shouldResourceBeLinkable(RESTRICTED_USERNAMES, '', username, '@')).to.be.false() - }) - }) - }) - - describe('#replaceImageString', function () { - it('should return a string', function () { - expect(replaceImageString(markdown)).to.be.a('string') - }) - - it('should remove any size parameters from markdown image src, and place them in the alt tag', function () { - const img = '![imagealttext](https://panoptes-uploads.zooniverse.org/production/subject_location/66094.jpeg =100x100)' - const altText = 'imagealttext' - const imageSize = '=100x100' - const imageURL = 'https://panoptes-uploads.zooniverse.org/production/subject_location/66094.jpeg' - const expectedReturnValue = '![imagealttext =100x100](https://panoptes-uploads.zooniverse.org/production/subject_location/66094.jpeg)' - expect(replaceImageString(img, altText, imageURL, imageSize)).to.equal(expectedReturnValue) - }) - }) - describe('#renderMedia', function () { const src = 'https://panoptes-uploads.zooniverse.org/production/subject_location/66094a64-8823-4314-8ef4-1ee228e49470.jpeg' const altText = 'A placeholder image.' diff --git a/packages/lib-react-components/src/Markdownz/lib/ping.js b/packages/lib-react-components/src/Markdownz/lib/ping.js deleted file mode 100644 index f11355a6a98..00000000000 --- a/packages/lib-react-components/src/Markdownz/lib/ping.js +++ /dev/null @@ -1,140 +0,0 @@ -// This is basically a fork of https://github.com/zestedesavoir/zmarkdown/tree/master/packages/remark-ping -// The changes made here make the plugin more flexible for supporting hashtags or other custom mentions -// remark-ping only supports at-mentions of users. Changes are noted in comments throughout the file. - -import visit from 'unist-util-visit' - -// Update help message to match the renamed parameters -const helpMsg = `remark-ping: expected configuration to be passed: { - ping: (resourceToPing, pingSymbol) => bool,\n resourceURL: (resourceToPing, pingSymbol) => string\n}` - -export default function plugin({ - ping, // Rename this from pingUsername to ping since we may be pinging more than users - pingSymbols = ['@'], // Add a parameter to specify what the ping symbols are to be able to support custom ping symbols and more than one. - resourceURL, // Rename from userURL to resourceURL - matchRegex = /\B@([\w\-.]+\b)|#([-\w\d]{3,40})|(\^S[0-9]+)/ -}) { - if (typeof ping !== 'function' || typeof resourceURL !== 'function') { - throw new Error(helpMsg) - } - - function inlineTokenizer(eat, value, silent) { - const match = matchRegex.exec(value) - if (!match || match.index > 0) return - const total = match[0] - // Add Array find function to match the symbol in the parsed markdown to the symbols specified to use - const symbol = pingSymbols.find((element) => total.indexOf(element) === 0) - - // Pull the resource out of the matched string. - // Either use what is matched in the original output from the regex (supports the default regex) - // Or split the string by the ping symbol and grab the resource (supports our supplied regex) - const resource = match.find((matchItem) => matchItem && !matchItem.includes(symbol)) || total.split(symbol)[1] - - if (ping(resource, symbol) === true) { - const url = resourceURL(resource, symbol) - - return eat(total)({ - type: 'ping', - resource: resource, - symbol: symbol, - url: url, - data: { - hName: 'a', - hProperties: { - href: url, - rel: 'nofollow', - class: 'ping ping-link', - }, - }, - children: [{ - type: 'text', - value: symbol, - }, { - type: 'emphasis', - data: { - hName: 'span', - hProperties: { - class: 'ping-resource', - }, - }, - children: [{ - type: 'text', - value: resource, - }], - }], - }) - } else { - return eat(symbol)({ - type: 'text', - value: symbol, - }) - } - } - - function locator(value, fromIndex) { - const keep = matchRegex.exec(value, fromIndex) - if (keep) { - const symbol = pingSymbols.find((element) => keep[0].indexOf(element) === 0) - - return value.indexOf(symbol, keep.index) - } - return -1 - } - - inlineTokenizer.locator = locator - - const Parser = this.Parser - - // Inject inlineTokenizer - const inlineTokenizers = Parser.prototype.inlineTokenizers - const inlineMethods = Parser.prototype.inlineMethods - inlineTokenizers.ping = inlineTokenizer - inlineMethods.splice(inlineMethods.indexOf('text'), 0, 'ping') - - const Compiler = this.Compiler - - // Stringify - if (Compiler) { - const visitors = Compiler.prototype.visitors - visitors.ping = (node) => { - if (!node.resource.includes(' ')) { - return `${node.symbol}${node.resource}` - } - return `${node.symbol}**${node.resource}**` - } - } - - return (tree, file) => { - // mark pings in blockquotes, later on we'll need that info to avoid pinging from quotes - visit(tree, 'blockquote', markInBlockquotes) - // remove ping links from pings already in links - visit(tree, 'link', (node) => { - visit(node, 'ping', (ping, index) => { - ping.data.hName = 'span' - ping.data.hProperties = { class: 'ping ping-in-link' } - }) - }) - visit(tree, 'ping', (node) => { - if (!node.__inBlockquote) { - if (!file.data[node.type]) { - file.data[node.type] = [] - } - // collect resources to ping, they will be made available on the vfile - // for some backend to act on - file.data[node.type].push(node.resource) - } - }) - } -} - -function markInBlockquotes(node) { - mark(node) - - if (node.children) { - node.children.map((n, i) => markInBlockquotes(n)) - } -} - -function mark(node) { - if (node.type === 'ping') node.__inBlockquote = true -} \ No newline at end of file diff --git a/packages/lib-react-components/src/Markdownz/lib/ping.spec.js b/packages/lib-react-components/src/Markdownz/lib/ping.spec.js deleted file mode 100644 index e0c4a0cc37e..00000000000 --- a/packages/lib-react-components/src/Markdownz/lib/ping.spec.js +++ /dev/null @@ -1,270 +0,0 @@ -import dedent from 'dedent' -import remark from 'remark' -import remark2rehype from 'remark-rehype' -import rehypeStringify from 'rehype-stringify' - -import plugin from './ping' - -const mockUsernames = [ - 'I AM CLEM', - 'qux', - 'foo', - 'bar', - 'baz baz', -] - -function pingUsername(username) { - return mockUsernames.includes(username) -} -function userURL(username) { - return `/membres/voir/${username}/` -} - - -const fixtures = [ - dedent` - ping @Clem - - ping @**FOO BAR** - - no ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd - - ping [@**I AM CLEM**](http://example.com) - - @**baz baz** - `, - dedent` - ## Test ping @**I AM CLEM** - - ping @**I AM CLEM** - - ping _@**I AM CLEM**_ - - > no metadata output @**I AM CLEM** - `, - dedent` - @foo @bar - - @baz baz - - > @**baz baz** - `, -] - -const outputs = [ - dedent` -

ping @Clem

-

ping @FOO BAR

-

no ping @quxjhdshqjkhfyhefezhjzjhdsjlfjlsqjdfjhsd

-

ping \ - @I AM CLEM

-

\ - @baz baz

- `, - dedent` -

Test ping \ - @I AM CLEM

-

ping \ - @I AM CLEM

-

ping \ - @I AM CLEM

-
-

no metadata output \ - @I AM CLEM

-
- `, - dedent` -

\ - @foo \ - \ - @bar

-

@baz baz

-
-

\ - @baz baz

-
- `, -] - -const pings = [ - ['I AM CLEM', 'baz baz'], - ['I AM CLEM', 'I AM CLEM', 'I AM CLEM'], - ['foo', 'bar'], -] - -describe('ping plugin', function () { - it('throws an error if ping is not a function', function () { - const toMarkdown = text => remark() - .use(plugin, { - ping: 12, - resourceURL: userURL, - }) - .processSync(text) - .toString() - - expect(() => toMarkdown(dedent` - # foo - @**I AM CLEM** - `)).to.throw() - }) - - it('throws an error if resourceURL is not a function', function () { - const toMarkdown = text => remark() - .use(plugin, { - ping: () => true, - resourceURL: 12, - }) - .processSync(text) - .toString() - - expect(() => toMarkdown(dedent` - # foo - @**I AM CLEM** - `)).to.throw() - }) - - it('should not create ping links in links', () => { - const toHTML = text => remark() - .use(plugin, { ping: pingUsername, resourceURL: userURL }) - .use(remark2rehype) - .use(rehypeStringify) - .process(text) - - return toHTML(dedent` - [foo @**I AM CLEM** bar](http://example.com) - `).then((vfile) => { - return expect(vfile.contents).to.equal( - dedent` -

foo @I AM CLEM bar

- ` - ) - }) - }) - - describe(`with default regex and pingSymbol`, function () { - const parser = text => remark() - .use(plugin, { ping: pingUsername, resourceURL: userURL }) - .parse(text) - - const toHTML = text => remark() - .use(plugin, { ping: pingUsername, resourceURL: userURL }) - .use(remark2rehype) - .use(rehypeStringify) - .process(text) - - const toMarkdown = text => remark() - .use(plugin, { ping: pingUsername, resourceURL: userURL }) - .processSync(text) - .toString() - - it('parses', function () { - fixtures.forEach((fixture) => { - expect(parser(fixture)).to.be.an.instanceof(Object) - }) - }) - - it('sets ping data on vfile', function () { - fixtures.forEach((fixture, fixtureIndex) => { - toHTML(fixture) - .then((vfile) => { - return vfile.data.ping.forEach((resourceToPingFromParser, resourceIndex) => { - const usernameToPing = pings[fixtureIndex][resourceIndex] - return expect(resourceToPingFromParser).to.equal(usernameToPing) - }) - }) - }) - }) - - it('compiles to HTML', function () { - fixtures.forEach((fixture, fixtureIndex) => { - return toHTML(fixture) - .then((vfile) => { - return expect(vfile.contents).to.equal(outputs[fixtureIndex]) - }) - }) - }) - - it('compiles to Markdown', function () { - fixtures.forEach((fixture, fixtureIndex) => { - const dedentedOutput = dedent(toMarkdown(fixture)) - expect(dedentedOutput).to.equal(fixture) - }) - }) - }) - - describe('with custom regex and pingSymbols', function () { - const parser = text => remark() - .use(plugin, { - ping: () => true, - pingSymbols: ['@', '#', '^S'], - resourceURL: userURL, - matchRegex: /(@[A-Za-z0-9]+)|(#[A-Za-z0-9]+)|(\^S[0-9]+)/ - }) - .parse(text) - - const toHTML = text => remark() - .use(plugin, { - ping: () => true, - pingSymbols: ['@', '#', '^S'], - resourceURL: userURL, - matchRegex: /(@[A-Za-z0-9]+)|(#[A-Za-z0-9]+)|(\^S[0-9]+)/ - }) - .use(remark2rehype) - .use(rehypeStringify) - .process(text) - - const toMarkdown = text => remark() - .use(plugin, { - ping: () => true, - pingSymbols: ['@', '#', '^S'], - resourceURL: userURL, - matchRegex: /(@[A-Za-z0-9]+)|(#[A-Za-z0-9]+)|(\^S[0-9]+)/ - }) - .processSync(text) - .toString() - - const fixture = dedent` - @srallen - - #tigers - - ^S1234 - ` - - const output = dedent` -

@srallen

-

#tigers

-

^S1234

- ` - it('parses', function () { - expect(parser(fixture)).to.be.an.instanceof(Object) - }) - - it('sets ping data on vfile', function () { - const pings = [ - 'srallen', - 'tigers', - '1234' - ] - return toHTML(fixture) - .then((vfile) => { - vfile.data.ping.forEach((resourceToPingFromParser, resourceIndex) => { - const resourceToPing = pings[resourceIndex] - return expect(resourceToPingFromParser).to.equal(resourceToPing) - }) - }) - }) - - it('compiles to HTML', function () { - return toHTML(fixture) - .then((vfile) => { - return expect(vfile.contents).to.equal(output) - }) - }) - - // Getting an extra /n. Not sure why. - xit('compiles to Markdown', function () { - expect(toMarkdown(fixture)).to.equal(fixture) - }) - }) -}) diff --git a/yarn.lock b/yarn.lock index 46c3ee959ae..dc4b3e9338e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2246,12 +2246,12 @@ yargs "16.2.0" yargs-parser "20.2.4" -"@mapbox/hast-util-table-cell-style@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz#5b7166ae01297d72216932b245e4b2f0b642dca6" - integrity sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA== +"@mapbox/hast-util-table-cell-style@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.2.0.tgz#1003f59d54fae6f638cb5646f52110fb3da95b4d" + integrity sha512-gqaTIGC8My3LVSnU38IwjHVKJC94HSonjvFHDk8/aSrApL8v4uWgm8zJkK7MJIIbHuNOr/+Mv2KkQKcxs6LEZA== dependencies: - unist-util-visit "^1.3.0" + unist-util-visit "^1.4.1" "@mdx-js/react@^2.1.5": version "2.3.0" @@ -4684,6 +4684,16 @@ "@tufjs/canonical-json" "1.0.0" minimatch "^9.0.0" +"@twemoji/api@~14.1.0": + version "14.1.2" + resolved "https://registry.yarnpkg.com/@twemoji/api/-/api-14.1.2.tgz#9e75a59cc2ff64c6c9106902823c9b6bc5bb4a9f" + integrity sha512-JLuszRq7t+NWJTaNwBD+Hbhf67gzn6jAqhNIDTPndEGT55kHiZTJAYRGCHZB/eA58OGVSp7mIvsJs+F/ZDJanA== + dependencies: + fs-extra "^8.0.1" + jsonfile "^5.0.0" + twemoji-parser "14.0.0" + universalify "^0.1.2" + "@types/aria-query@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" @@ -4926,6 +4936,13 @@ dependencies: "@types/node" "*" +"@types/hast@^2.0.0": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.6.tgz#bb8b05602112a26d22868acb70c4b20984ec7086" + integrity sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg== + dependencies: + "@types/unist" "^2" + "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -5060,6 +5077,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/parse5@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" + integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== + "@types/pretty-hrtime@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.1.tgz#72a26101dc567b0d68fd956cf42314556e42d601" @@ -5141,11 +5163,16 @@ dependencies: "@types/node" "*" -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.3": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== +"@types/unist@^2", "@types/unist@^2.0.2": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.8.tgz#bb197b9639aa1a04cf464a617fe800cccd92ad5c" + integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== + "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" @@ -6845,16 +6872,6 @@ character-entities-legacy@^1.0.0: resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -7047,11 +7064,6 @@ cmd-shim@6.0.1: resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -8559,6 +8571,16 @@ entities@^4.3.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +entities@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" @@ -9798,7 +9820,7 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^8.1.0: +fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -10061,7 +10083,7 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -github-slugger@^1.0.0, github-slugger@^1.2.1: +github-slugger@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.4.0.tgz#206eb96cdb22ee56fdc53a28d5a302338463444e" integrity sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ== @@ -10385,17 +10407,27 @@ hast-to-hyperscript@^9.0.0: unist-util-is "^4.0.0" web-namespaces "^1.0.0" +hast-util-from-parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" + integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== + dependencies: + "@types/parse5" "^5.0.0" + hastscript "^6.0.0" + property-information "^5.0.0" + vfile "^4.0.0" + vfile-location "^3.2.0" + web-namespaces "^1.0.0" + hast-util-is-element@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz#3b3ed5159a2707c6137b48637fbfe068e175a425" integrity sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ== -hast-util-sanitize@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hast-util-sanitize/-/hast-util-sanitize-3.0.2.tgz#b0b783220af528ba8fe6999f092d138908678520" - integrity sha512-+2I0x2ZCAyiZOO/sb4yNLFmdwPBnyJ4PBkVTUMKMqBwYNA+lXSgOmoRXlJFazoyid9QPogRRKgKhVEodv181sA== - dependencies: - xtend "^4.0.0" +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== hast-util-to-html@^7.1.1: version "7.1.3" @@ -10418,6 +10450,17 @@ hast-util-whitespace@^1.0.0: resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz#e4fe77c4a9ae1cb2e6c25e02df0043d0164f6e41" integrity sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A== +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -10837,7 +10880,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -10956,34 +10999,11 @@ ipaddr.js@^2.0.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== -is-absolute-url@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg== - is-absolute-url@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumeric@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" - integrity sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -11094,11 +11114,6 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: dependencies: has-tostringtag "^1.0.0" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - is-deflate@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-deflate/-/is-deflate-1.0.0.tgz#c862901c3c161fb09dac7cdc7e784f80e98f2f14" @@ -11162,11 +11177,6 @@ is-gzip@^1.0.0: resolved "https://registry.yarnpkg.com/is-gzip/-/is-gzip-1.0.0.tgz#6ca8b07b99c77998025900e555ced8ed80879a83" integrity sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ== -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" @@ -11389,21 +11399,11 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -11777,6 +11777,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-5.0.0.tgz#e6b718f73da420d612823996fdf14a03f6ff6922" + integrity sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w== + dependencies: + universalify "^0.1.2" + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -12001,6 +12010,20 @@ lines-and-columns@~2.0.3: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + +linkify-it@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== + dependencies: + uc.micro "^1.0.1" + load-json-file@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" @@ -12235,11 +12258,6 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== -longest-streak@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -12420,23 +12438,104 @@ map-or-similar@^1.5.0: resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== +markdown-it-anchor@~8.6.5: + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== +markdown-it-container@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b" + integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw== + +markdown-it-emoji@~2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz#cd42421c2fda1537d9cc12b9923f5c8aeb9029c8" + integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== + +markdown-it-footnote@~3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz#e0e4c0d67390a4c5f0c75f73be605c7c190ca4d8" + integrity sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w== + +markdown-it-html5-embed@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-html5-embed/-/markdown-it-html5-embed-1.0.0.tgz#f36bedca1eb12ce4df2d53b5ec72f62ba5e094b3" + integrity sha512-SPgugO/1+/9sZcgxoxijoTHSUpCUgFCNe1MSuTmDxDkV6NQrVzMclhRMFgE/rcHO+2rhIg3U7Oy80XA/E8ytpg== + dependencies: + markdown-it "^8.4.0" + mimoza "~1.0.0" + +markdown-it-imsize@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz#cca0427905d05338a247cb9ca9d968c5cddd5170" + integrity sha512-5SH90ademqcR8ifQCBXRCfIR4HGfZZOh5pO0j2TglulfSQH+SBXM4Iw/QlTUbSoUwVZArCYgECoMvktDS2kP3w== + +markdown-it-sub@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz#375fd6026eae7ddcb012497f6411195ea1e3afe8" + integrity sha512-z2Rm/LzEE1wzwTSDrI+FlPEveAAbgdAdPhdWarq/ZGJrGW/uCQbKAnhoCsE4hAbc3SEym26+W2z/VQB0cQiA9Q== + +markdown-it-sup@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz#cb9c9ff91a5255ac08f3fd3d63286e15df0a1fc3" + integrity sha512-E32m0nV9iyhRR7CrhnzL5msqic7rL1juWre6TQNxsnApg7Uf+F97JOKxUijg5YwXz86lZ0mqfOnutoryyNdntQ== + +markdown-it-table-of-contents@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.6.0.tgz#7c9e8d619fb12f88c9fb05a7b32b2fe932b9c541" + integrity sha512-jHvEjZVEibyW97zEYg19mZCIXO16lHbvRaPDkEuOfMPBmzlI7cYczMZLMfUvwkhdOVQpIxu3gx6mgaw46KsNsQ== + +markdown-it-video@~0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/markdown-it-video/-/markdown-it-video-0.6.3.tgz#ee96a8fce4a262872f8aaf9706c31540d40104c2" + integrity sha512-T4th1kwy0OcvyWSN4u3rqPGxvbDclpucnVSSaH3ZacbGsAts964dxokx9s/I3GYsrDCJs4ogtEeEeVP18DQj0Q== + +markdown-it@^8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== dependencies: - repeat-string "^1.0.0" + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +markdown-it@~13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== + dependencies: + argparse "^2.0.1" + entities "~3.0.1" + linkify-it "^4.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" markdown-to-jsx@^7.1.8, markdown-to-jsx@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.2.0.tgz#e7b46b65955f6a04d48a753acd55874a14bdda4b" integrity sha512-3l4/Bigjm4bEqjCR6Xr+d4DtM1X6vvtGsMGSjJYyep8RjjIvcWtrXBS8Wbfe1/P+atKNMccpsraESIaWVplzVg== +markdownz@~8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/markdownz/-/markdownz-8.1.1.tgz#3156e425d7c8f67071020d8acfdeba9e7e294efc" + integrity sha512-eeeqAn/kB51GlqHYpa4PJbSzrNFmdPdds6nqMdVGuEKfHjXDn7xZu/RCFQcT9ycRUI+GQXH3/T6p/BHAqjNcPQ== + dependencies: + "@twemoji/api" "~14.1.0" + markdown-it "~13.0.1" + markdown-it-anchor "~8.6.5" + markdown-it-container "~3.0.0" + markdown-it-emoji "~2.0.0" + markdown-it-footnote "~3.0.3" + markdown-it-html5-embed "~1.0.0" + markdown-it-imsize "~2.0.1" + markdown-it-sub "~1.0.0" + markdown-it-sup "~1.0.0" + markdown-it-table-of-contents "~0.6.0" + markdown-it-video "~0.6.3" + math-expression-evaluator@^1.2.14: version "1.4.0" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz#3d66031117fbb7b9715ea6c9c68c2cd2eebd37e2" @@ -12451,20 +12550,6 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -mdast-util-compact@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" - integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-definitions@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz#3fe622a4171c774ebd06f11e9f8af7ec53ea5c74" - integrity sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA== - dependencies: - unist-util-visit "^1.0.0" - mdast-util-definitions@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" @@ -12472,7 +12557,7 @@ mdast-util-definitions@^4.0.0: dependencies: unist-util-visit "^2.0.0" -mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: +mdast-util-to-hast@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== @@ -12486,22 +12571,12 @@ mdast-util-to-hast@^10.0.0, mdast-util-to-hast@^10.2.0: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.5: +mdast-util-to-string@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz#27055500103f51637bd07d01da01eb1967a43527" integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== -mdast-util-toc@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz#395eeb877f067f9d2165d990d77c7eea6f740934" - integrity sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w== - dependencies: - github-slugger "^1.2.1" - mdast-util-to-string "^1.0.5" - unist-util-is "^2.1.2" - unist-util-visit "^1.1.0" - -mdurl@^1.0.0: +mdurl@^1.0.0, mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== @@ -12597,7 +12672,7 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.6.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== @@ -12629,6 +12704,13 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimoza@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mimoza/-/mimoza-1.0.0.tgz#d74aa4fe08932f005e430bdc7bfcfa95fcab4e62" + integrity sha512-+j7SSye/hablu66K/jjeyPmk6WL8RoXfeZ+MMn37vSNDGuaWY/5wm10LpSpxAHX4kNoEwkTWYHba8ePVip+Hqg== + dependencies: + mime-db "^1.6.0" + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -13159,13 +13241,6 @@ node-dir@^0.1.10, node-dir@^0.1.17: dependencies: minimatch "^3.0.2" -node-emoji@^1.8.1: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - node-fetch-native@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.1.0.tgz#a530f5c4cadb49b382dcf81d8f5f19ed0f457fbe" @@ -13916,18 +13991,6 @@ parse-cache-control@^1.0.1: resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -13993,6 +14056,11 @@ parse5-htmlparser2-tree-adapter@^7.0.0: domhandler "^5.0.2" parse5 "^7.0.0" +parse5@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + parse5@^7.0.0, parse5@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -14013,7 +14081,7 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-browserify@^1.0.1: +path-browserify@^1.0.1, path-browserify@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== @@ -14523,6 +14591,11 @@ punycode@1.3.2: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -14556,7 +14629,7 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" -qs@^6.10.0, qs@^6.11.0, qs@^6.4.0, qs@^6.9.4: +qs@^6.10.0, qs@^6.11.0, qs@^6.11.2, qs@^6.4.0, qs@^6.9.4: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== @@ -15141,13 +15214,38 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -rehype-stringify@~8.0.0: +rehype-parse@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-7.0.1.tgz#58900f6702b56767814afc2a9efa2d42b1c90c57" + integrity sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw== + dependencies: + hast-util-from-parse5 "^6.0.0" + parse5 "^6.0.0" + +rehype-react@~6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/rehype-react/-/rehype-react-6.2.1.tgz#9b9bf188451ad6f63796b784fe1f51165c67b73a" + integrity sha512-f9KIrjktvLvmbGc7si25HepocOg4z0MuNOtweigKzBcDjiGSTGhyz6VSgaV5K421Cq1O+z4/oxRJ5G9owo0KVg== + dependencies: + "@mapbox/hast-util-table-cell-style" "^0.2.0" + hast-to-hyperscript "^9.0.0" + +rehype-stringify@^8.0.0, rehype-stringify@~8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-8.0.0.tgz#9b6afb599bcf3165f10f93fc8548f9a03d2ec2ba" integrity sha512-VkIs18G0pj2xklyllrPSvdShAV36Ff3yE5PUO9u36f6+2qJFnn22Z5gKwBOwgXviux4UC7K+/j13AnZfPICi/g== dependencies: hast-util-to-html "^7.1.1" +rehype@~11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/rehype/-/rehype-11.0.0.tgz#d81729e65f4ac2b26f5de0b6bafc257eb0780e1f" + integrity sha512-qXqRqiCFJD5CJ61CSJuNImTFrm3zVkOU9XywHDwrUuvWN74MWt72KJ67c5CM5x8g0vGcOkRVCrYj85vqkmHulQ== + dependencies: + rehype-parse "^7.0.0" + rehype-stringify "^8.0.0" + unified "^9.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -15160,14 +15258,6 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -remark-emoji@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.0.2.tgz#49c134021132c192ee4cceed1988ec9b8ced7eb8" - integrity sha512-E8ZOa7Sx1YS9ivWJ8U9xpA8ldzZ4VPAfyUaKqhr1/Pr5Q8ZdQHrpDg6S+rPzMw8t89KNViB/oG9ZdJSFDrUXpA== - dependencies: - node-emoji "^1.8.1" - unist-util-visit "^1.4.0" - remark-external-links@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-8.0.0.tgz#308de69482958b5d1cd3692bc9b725ce0240f345" @@ -15179,53 +15269,6 @@ remark-external-links@^8.0.0: space-separated-tokens "^1.0.0" unist-util-visit "^2.0.0" -remark-external-links@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/remark-external-links/-/remark-external-links-3.1.1.tgz#a8d2aead51639daffae5e2255469fce4a86c09bb" - integrity sha512-QeqEeThumJ6GJzzgP45XY7+C6IGdvRxy8WkJNL/jRaeiGLDxmBUx0ggFIm5N5tHU3O8KbUrxM4tZgAHb53hddg== - dependencies: - is-absolute-url "^2.1.0" - mdast-util-definitions "^1.2.3" - space-separated-tokens "^1.1.2" - unist-util-visit "^1.4.0" - -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-parse@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-react@~8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/remark-react/-/remark-react-8.0.0.tgz#dc861df69c95e1084059effae699dac68a57191e" - integrity sha512-Dlafr0cejDMMMelH0MxkY3NYVelbMdqaoXuwIgWtWn5KGE0Jpko47NhkBzptxvzMqCdJxD6aoJTOFyJ1Re5Iyg== - dependencies: - "@mapbox/hast-util-table-cell-style" "^0.1.3" - hast-to-hyperscript "^9.0.0" - hast-util-sanitize "^3.0.0" - mdast-util-to-hast "^10.0.0" - remark-rehype@~8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-8.1.0.tgz#610509a043484c1e697437fa5eb3fd992617c945" @@ -15233,15 +15276,6 @@ remark-rehype@~8.1.0: dependencies: mdast-util-to-hast "^10.2.0" -remark-slug@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-5.1.2.tgz#715ecdef8df1226786204b1887d31ab16aa24609" - integrity sha512-DWX+Kd9iKycqyD+/B+gEFO3jjnt7Yg1O05lygYSNTe5i5PIxxxPjp5qPBDxPIzp5wreF7+1ROCwRgjEcqmzr3A== - dependencies: - github-slugger "^1.0.0" - mdast-util-to-string "^1.0.0" - unist-util-visit "^1.0.0" - remark-slug@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-6.1.0.tgz#0503268d5f0c4ecb1f33315c00465ccdd97923ce" @@ -15251,48 +15285,6 @@ remark-slug@^6.0.0: mdast-util-to-string "^1.0.0" unist-util-visit "^2.0.0" -remark-stringify@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.1.1.tgz#e2a9dc7a7bf44e46a155ec78996db896780d8ce5" - integrity sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A== - dependencies: - ccount "^1.0.0" - is-alphanumeric "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - longest-streak "^2.0.1" - markdown-escapes "^1.0.0" - markdown-table "^2.0.0" - mdast-util-compact "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - stringify-entities "^3.0.0" - unherit "^1.0.4" - xtend "^4.0.1" - -remark-sub-super@~1.0.16: - version "1.0.20" - resolved "https://registry.yarnpkg.com/remark-sub-super/-/remark-sub-super-1.0.20.tgz#1e198c2e9e335ce414f23429f7b8eae8fef8e469" - integrity sha512-ohnGWuB8FSvod8Qp+gEo/7QRDlI2RA8d+YyY4eLuMQPD3WGwqGMCuyWdNOSW0mzDMqse82PJqeke/GGXaj795A== - -remark-toc@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/remark-toc/-/remark-toc-5.1.1.tgz#8c229d6f834cdb43fde6685e2d43248d3fc82d78" - integrity sha512-vCPW4YOsm2CfyuScdktM9KDnJXVHJsd/ZeRtst+dnBU3B3KKvt8bc+bs5syJjyptAHfqo7H+5Uhz+2blWBfwow== - dependencies: - mdast-util-toc "^3.0.0" - remark-slug "^5.0.0" - -remark@~12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.1.tgz#f1ddf68db7be71ca2bad0a33cd3678b86b9c709f" - integrity sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw== - dependencies: - remark-parse "^8.0.0" - remark-stringify "^8.0.0" - unified "^9.0.0" - renderkid@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" @@ -15304,11 +15296,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-string@^1.0.0, repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - request-ip@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-3.3.0.tgz#863451e8fec03847d44f223e30a5d63e369fa611" @@ -15966,7 +15953,7 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -space-separated-tokens@^1.0.0, space-separated-tokens@^1.1.2: +space-separated-tokens@^1.0.0: version "1.1.5" resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== @@ -16129,11 +16116,6 @@ standard@~17.1.0: standard-engine "^15.0.0" version-guard "^1.1.1" -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -16297,7 +16279,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-entities@^3.0.0, stringify-entities@^3.0.1: +stringify-entities@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.1.0.tgz#b8d3feac256d9ffcc9fa1fefdcf3ca70576ee903" integrity sha512-3FP+jGMmMV/ffZs86MoghGqAoqXAdxLrJP4GUdrDN1aIScYih5tuIO3eF4To5AJZ79KDZ8Fpdy7QJnK8SsL1Vg== @@ -16762,16 +16744,6 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1, trim@~1.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim/-/trim-1.0.1.tgz#68e78f6178ccab9687a610752f4f5e5a7022ee8c" - integrity sha512-3JVP2YVqITUisXblCDq/Bi4P9457G/sdEamInkyvCsjbTcXLXIiG7XCb4kGMFWh6JGXesS3TKxOPtrncN/xe8w== - triple-beam@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" @@ -16872,6 +16844,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +twemoji-parser@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/twemoji-parser/-/twemoji-parser-14.0.0.tgz#13dabcb6d3a261d9efbf58a1666b182033bf2b62" + integrity sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -17003,6 +16980,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + uglify-js@^3.1.4: version "3.17.0" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85" @@ -17032,14 +17014,6 @@ unescape@^1.0.1: dependencies: extend-shallow "^2.0.1" -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -17125,11 +17099,6 @@ unist-util-generated@^1.0.0: resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== -unist-util-is@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.3.tgz#459182db31f4742fceaea88d429693cbf0043d20" - integrity sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA== - unist-util-is@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" @@ -17145,13 +17114,6 @@ unist-util-position@^3.0.0: resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - unist-util-stringify-position@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" @@ -17174,7 +17136,7 @@ unist-util-visit-parents@^3.0.0: "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.3.0, unist-util-visit@^1.4.0, unist-util-visit@~1.4.0: +unist-util-visit@^1.4.1, unist-util-visit@~1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw== @@ -17195,7 +17157,7 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -17266,6 +17228,14 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +url@~0.11.2: + version "0.11.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad" + integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw== + dependencies: + punycode "^1.4.1" + qs "^6.11.2" + use-callback-ref@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5" @@ -17298,7 +17268,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.0, util@^0.12.4: +util@^0.12.0, util@^0.12.4, util@~0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -17399,7 +17369,7 @@ version-guard@^1.1.1: resolved "https://registry.yarnpkg.com/version-guard/-/version-guard-1.1.1.tgz#7a6e87a1babff1b43d6a7b0fd239731e278262fa" integrity sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ== -vfile-location@^3.0.0: +vfile-location@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== @@ -17906,7 +17876,7 @@ xmlhttprequest-ssl@~2.0.0: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== -xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==