diff --git a/core/dev-test/config.yml b/core/dev-test/config.yml index 94f33736..9a387339 100644 --- a/core/dev-test/config.yml +++ b/core/dev-test/config.yml @@ -61,6 +61,8 @@ collections: label: FAQ folder: _faqs create: true + editor: + frame: false fields: - label: Question name: title diff --git a/core/dev-test/index.js b/core/dev-test/index.js index 231dc24f..965d5325 100644 --- a/core/dev-test/index.js +++ b/core/dev-test/index.js @@ -40,11 +40,7 @@ const GeneralPreview = createClass({ h('dd', {}, this.props.widgetsFor('posts').data.author || 'None'), h('dt', {}, 'Default Thumbnail'), - h( - 'dd', - {}, - thumb && h('img', { src: this.props.getAsset(thumb).toString() }), - ), + h('dd', {}, thumb && h('img', { src: this.props.getAsset(thumb).toString() })), ), ); }, @@ -92,6 +88,7 @@ const RelationKitchenSinkPostPreview = createClass({ }, }); +CMS.registerPreviewStyle('.toastui-editor-contents h1 { color: blue }', { raw: true }); CMS.registerPreviewTemplate('posts', PostPreview); CMS.registerPreviewTemplate('general', GeneralPreview); CMS.registerPreviewTemplate('authors', AuthorsPreview); diff --git a/core/package.json b/core/package.json index 6453bd27..78d9737f 100644 --- a/core/package.json +++ b/core/package.json @@ -69,7 +69,6 @@ "date-fns": "2.29.3", "deepmerge": "4.2.2", "diacritics": "1.3.0", - "dompurify": "2.4.0", "eslint-config-prettier": "8.5.0", "eslint-plugin-babel": "5.3.1", "fuzzy": "0.1.3", @@ -87,8 +86,6 @@ "jwt-decode": "3.1.2", "localforage": "1.10.0", "lodash": "4.17.21", - "mdast-util-definitions": "1.2.5", - "mdast-util-to-string": "1.1.0", "minimatch": "3.0.4", "moment": "2.29.4", "node-polyglot": "2.4.2", @@ -116,17 +113,12 @@ "react-virtualized-auto-sizer": "1.0.7", "react-waypoint": "10.3.0", "react-window": "1.8.7", - "rehype-stringify": "9.0.3", - "remark-gfm": "3.0.1", - "remark-parse": "10.0.1", - "remark-rehype": "10.1.0", "sanitize-filename": "1.6.3", "semaphore": "1.1.0", "stream-browserify": "3.0.0", "symbol-observable": "4.0.0", "tomlify-j0.4": "3.0.0", "ts-loader": "9.4.1", - "unified": "10.1.2", "uploadcare-widget": "3.19.0", "uploadcare-widget-tab-effects": "1.5.0", "url": "0.11.0", @@ -157,7 +149,6 @@ "@types/codemirror": "5.60.5", "@types/common-tags": "1.8.0", "@types/create-react-class": "15.6.3", - "@types/dompurify": "2.3.4", "@types/fs-extra": "9.0.13", "@types/history": "4.7.11", "@types/is-hotkey": "0.1.7", diff --git a/core/src/actions/config.ts b/core/src/actions/config.ts index 3776588d..2d543abe 100644 --- a/core/src/actions/config.ts +++ b/core/src/actions/config.ts @@ -174,6 +174,10 @@ export function applyDefaults(originalConfig: Config) { for (const collection of config.collections) { let collectionI18n = collection[I18N]; + if (config.editor && !collection.editor) { + collection.editor = { preview: config.editor.preview, frame: config.editor.frame }; + } + if (i18n && collectionI18n) { collectionI18n = getI18nDefaults(collectionI18n, i18n); collection[I18N] = collectionI18n; @@ -240,6 +244,10 @@ export function applyDefaults(originalConfig: Config) { if (file.fields) { file.fields = setI18nDefaultsForFields(file.fields, Boolean(fileI18n)); } + + if (collection.editor && !file.editor) { + file.editor = { preview: collection.editor.preview, frame: collection.editor.frame }; + } } } @@ -266,10 +274,6 @@ export function applyDefaults(originalConfig: Config) { id: `${group.field}__${group.pattern}`, }; }); - - if (config.editor && !collection.editor) { - collection.editor = { preview: config.editor.preview }; - } } }); } diff --git a/core/src/components/Collection/Collection.tsx b/core/src/components/Collection/Collection.tsx index c5da7cf2..2cf63464 100644 --- a/core/src/components/Collection/Collection.tsx +++ b/core/src/components/Collection/Collection.tsx @@ -293,4 +293,4 @@ const mapDispatchToProps = { const connector = connect(mapStateToProps, mapDispatchToProps); export type CollectionViewProps = ConnectedProps; -export default translate()(connector(CollectionView)) as ComponentType; +export default connector(translate()(CollectionView) as ComponentType); diff --git a/core/src/components/Editor/EditorControlPane/EditorControl.tsx b/core/src/components/Editor/EditorControlPane/EditorControl.tsx index b215de37..68cb9f59 100644 --- a/core/src/components/Editor/EditorControlPane/EditorControl.tsx +++ b/core/src/components/Editor/EditorControlPane/EditorControl.tsx @@ -146,12 +146,10 @@ const EditorControl = ({ submitted, getAsset, isDisabled, - isEditorComponent, isFetching, isFieldDuplicate, isFieldHidden, isHidden = false, - isNewEditorComponent, loadEntry, locale, mediaPaths, @@ -223,11 +221,9 @@ const EditorControl = ({ submitted, getAsset: handleGetAsset(collection, entry), isDisabled: isDisabled ?? false, - isEditorComponent: isEditorComponent ?? false, isFetching, isFieldDuplicate, isFieldHidden, - isNewEditorComponent: isNewEditorComponent ?? false, label: getFieldLabel(field, t), loadEntry, locale, @@ -270,11 +266,9 @@ interface EditorControlOwnProps { fieldsErrors: FieldsErrors; submitted: boolean; isDisabled?: boolean; - isEditorComponent?: boolean; isFieldDuplicate?: (field: Field) => boolean; isFieldHidden?: (field: Field) => boolean; isHidden?: boolean; - isNewEditorComponent?: boolean; locale?: string; parentPath: string; value: ValueOrNestedValue; diff --git a/core/src/components/Editor/EditorInterface.tsx b/core/src/components/Editor/EditorInterface.tsx index bc8d50ef..c2434ac7 100644 --- a/core/src/components/Editor/EditorInterface.tsx +++ b/core/src/components/Editor/EditorInterface.tsx @@ -122,17 +122,6 @@ const EditorContent = ({ } }; -function isPreviewEnabled(collection: Collection, entry: Entry) { - if (collection.type === FILES) { - const file = getFileFromSlug(collection, entry.slug); - const previewEnabled = file?.editor?.preview ?? false; - if (previewEnabled) { - return previewEnabled; - } - } - return collection.editor?.preview ?? true; -} - interface EditorInterfaceProps { draftKey: string; entry: Entry; @@ -228,7 +217,23 @@ const EditorInterface = ({ setSelectedLocale(locale); }, []); - const previewEnabled = isPreviewEnabled(collection, entry); + const [previewEnabled, previewInFrame] = useMemo(() => { + let preview = collection.editor?.preview ?? true; + let frame = collection.editor?.frame ?? true; + + if (collection.type === FILES) { + const file = getFileFromSlug(collection, entry.slug); + if (file?.editor?.preview !== undefined) { + preview = file.editor.preview; + } + + if (file?.editor?.frame !== undefined) { + frame = file.editor.frame; + } + } + + return [preview, frame]; + }, [collection, entry.slug]); const collectionI18nEnabled = hasI18n(collection); @@ -271,7 +276,12 @@ const EditorInterface = ({ {editor} - + diff --git a/core/src/components/Editor/EditorPreviewPane/EditorPreviewContent.tsx b/core/src/components/Editor/EditorPreviewPane/EditorPreviewContent.tsx index e73265a4..b9fc1806 100644 --- a/core/src/components/Editor/EditorPreviewPane/EditorPreviewContent.tsx +++ b/core/src/components/Editor/EditorPreviewPane/EditorPreviewContent.tsx @@ -1,34 +1,15 @@ -import { styled } from '@mui/material/styles'; import React, { useMemo } from 'react'; -import ReactDOM from 'react-dom'; -import { ScrollSyncPane } from 'react-scroll-sync'; -import type { TemplatePreviewComponent, TemplatePreviewProps } from '../../../interface'; import type { ReactNode } from 'react'; +import type { TemplatePreviewComponent, TemplatePreviewProps } from '../../../interface'; interface PreviewContentProps { previewComponent?: TemplatePreviewComponent; previewProps: TemplatePreviewProps; } -const StyledPreviewContent = styled('div')` - width: calc(100% - min(864px, 50%)); - top: 64px; - right: 0; - position: absolute; - height: calc(100vh - 64px); - overflow-y: auto; - padding: 16px; -`; - const PreviewContent = ({ previewComponent, previewProps }: PreviewContentProps) => { - const element = useMemo(() => document.getElementById('cms-root'), []); - return useMemo(() => { - if (!element) { - return null; - } - let children: ReactNode; if (!previewComponent) { children = null; @@ -38,14 +19,8 @@ const PreviewContent = ({ previewComponent, previewProps }: PreviewContentProps) children = React.createElement(previewComponent, previewProps); } - return ReactDOM.createPortal( - - {children} - , - element, - 'preview-content', - ); - }, [previewComponent, previewProps, element]); + return children; + }, [previewComponent, previewProps]); }; export default PreviewContent; diff --git a/core/src/components/Editor/EditorPreviewPane/EditorPreviewPane.tsx b/core/src/components/Editor/EditorPreviewPane/EditorPreviewPane.tsx index 7d95f71b..461950b0 100644 --- a/core/src/components/Editor/EditorPreviewPane/EditorPreviewPane.tsx +++ b/core/src/components/Editor/EditorPreviewPane/EditorPreviewPane.tsx @@ -1,11 +1,15 @@ import { styled } from '@mui/material/styles'; import React, { isValidElement, useCallback, useMemo } from 'react'; +import ReactDOM from 'react-dom'; +import Frame, { FrameContextConsumer } from 'react-frame-component'; +import { translate } from 'react-polyglot'; import { connect } from 'react-redux'; +import { ScrollSyncPane } from 'react-scroll-sync'; import { getAsset as getAssetAction } from '../../../actions/media'; import { lengths } from '../../../components/UI/styles'; import { INFERABLE_FIELDS } from '../../../constants/fieldInference'; -import { getPreviewTemplate, getRemarkPlugins, resolveWidget } from '../../../lib/registry'; +import { getPreviewStyles, getPreviewTemplate, resolveWidget } from '../../../lib/registry'; import { selectInferedField, selectTemplateName } from '../../../lib/util/collection.util'; import { selectField } from '../../../lib/util/field.util'; import { selectIsLoadingAsset } from '../../../reducers/medias'; @@ -14,21 +18,22 @@ import EditorPreview from './EditorPreview'; import EditorPreviewContent from './EditorPreviewContent'; import PreviewHOC from './PreviewHOC'; -import type { ReactFragment, ReactNode } from 'react'; +import type { ComponentType, ReactFragment, ReactNode } from 'react'; import type { ConnectedProps } from 'react-redux'; import type { InferredField } from '../../../constants/fieldInference'; import type { - Field, - TemplatePreviewProps, Collection, Entry, EntryData, + Field, GetAssetFunction, + TemplatePreviewProps, + TranslatedProps, ValueOrNestedValue, } from '../../../interface'; import type { RootState } from '../../../store'; -const PreviewPaneFrame = styled('div')` +const PreviewPaneFrame = styled(Frame)` width: 100%; height: 100%; border: none; @@ -37,6 +42,25 @@ const PreviewPaneFrame = styled('div')` overflow: auto; `; +const PreviewPaneWrapper = styled('div')` + width: 100%; + height: 100%; + border: none; + background: #fff; + border-radius: ${lengths.borderRadius}; + overflow: auto; +`; + +const StyledPreviewContent = styled('div')` + width: calc(100% - min(864px, 50%)); + top: 64px; + right: 0; + position: absolute; + height: calc(100vh - 64px); + overflow-y: auto; + padding: 16px; +`; + /** * Returns the widget component for a named field, and makes recursive calls * to retrieve components for nested and deeply nested fields, which occur in @@ -162,7 +186,6 @@ function getWidget( } entry={entry} resolveWidget={resolveWidget} - getRemarkPlugins={getRemarkPlugins} /> ); } @@ -234,8 +257,8 @@ function getNestedWidgets( ); } -const PreviewPane = (props: EditorPreviewPaneProps) => { - const { entry, collection, config, fields, getAsset } = props; +const PreviewPane = (props: TranslatedProps) => { + const { entry, collection, config, fields, previewInFrame, getAsset, t } = props; const inferedFields = useMemo(() => { const titleField = selectInferedField(collection, 'title'); @@ -307,39 +330,120 @@ const PreviewPane = (props: EditorPreviewPaneProps) => { [collection, entry, fields, handleGetAsset, inferedFields], ); - if (!entry || !entry.data) { - return null; - } - - const previewComponent = - getPreviewTemplate(selectTemplateName(collection, entry.slug)) ?? EditorPreview; - - const previewProps: TemplatePreviewProps = { - ...props, - getAsset: handleGetAsset, - widgetFor, - widgetsFor, - }; - - if (!collection) { - ; - } - - return ( - - - - - + const previewStyles = useMemo( + () => + getPreviewStyles().map((style, i) => { + if (style.raw) { + return ; + } + return ; + }), + [], ); + + const previewComponent = useMemo( + () => getPreviewTemplate(selectTemplateName(collection, entry.slug)) ?? EditorPreview, + [collection, entry.slug], + ); + + const initialFrameContent = useMemo( + () => ` + + + +
+ + `, + [], + ); + + const element = useMemo(() => document.getElementById('cms-root'), []); + + const previewProps: Omit = useMemo( + () => ({ + ...props, + getAsset: handleGetAsset, + widgetFor, + widgetsFor, + }), + [handleGetAsset, props, widgetFor, widgetsFor], + ); + + return useMemo(() => { + if (!element) { + return null; + } + + return ReactDOM.createPortal( + + + {!entry || !entry.data ? null : ( + + {previewInFrame ? ( + + {!collection ? ( + t('collection.notFound') + ) : ( + + {({ document, window }) => { + return ( + + ); + }} + + )} + + ) : ( + + {!collection ? ( + t('collection.notFound') + ) : ( + <> + {previewStyles} + + + )} + + )} + + )} + + , + element, + 'preview-content', + ); + }, [ + collection, + config, + element, + entry, + initialFrameContent, + previewComponent, + previewInFrame, + previewProps, + previewStyles, + t, + ]); }; export interface EditorPreviewPaneOwnProps { collection: Collection; fields: Field[]; entry: Entry; + previewInFrame: boolean; } function mapStateToProps(state: RootState, ownProps: EditorPreviewPaneOwnProps) { @@ -354,4 +458,4 @@ const mapDispatchToProps = { const connector = connect(mapStateToProps, mapDispatchToProps); export type EditorPreviewPaneProps = ConnectedProps; -export default connector(PreviewPane); +export default connector(translate()(PreviewPane) as ComponentType); diff --git a/core/src/editor-components/image/index.tsx b/core/src/editor-components/image/index.tsx deleted file mode 100644 index ea463911..00000000 --- a/core/src/editor-components/image/index.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react'; - -import type { EditorComponentManualOptions } from '../../interface'; - -interface ImageData { - alt: string; - image: string; - title: string; -} - -const image: EditorComponentManualOptions = { - label: 'Image', - id: 'image', - fromBlock: match => - match && { - image: match[2], - alt: match[1], - title: match[4], - }, - toBlock: ({ alt, image, title }) => - `![${alt || ''}](${image || ''}${title ? ` "${title.replace(/"/g, '\\"')}"` : ''})`, - // eslint-disable-next-line react/display-name - toPreview: ({ alt, image, title }, getAsset, fields) => { - const imageField = fields?.find(f => f.widget === 'image'); - const src = getAsset(image, imageField).toString(); - return {alt; - }, - pattern: /^!\[(.*)\]\((.*?)(\s"(.*)")?\)$/, - fields: [ - { - label: 'Image', - name: 'image', - widget: 'image', - media_library: { - allow_multiple: false, - }, - }, - { - label: 'Alt Text', - name: 'alt', - }, - { - label: 'Title', - name: 'title', - }, - ], -}; - -export const StaticCmsEditorComponentImage = image; -export default image; diff --git a/core/src/editor-components/index.tsx b/core/src/editor-components/index.tsx deleted file mode 100644 index 7d988707..00000000 --- a/core/src/editor-components/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default as imageEditorComponent } from './image'; diff --git a/core/src/extensions.ts b/core/src/extensions.ts index 2b75ca29..f2f97806 100644 --- a/core/src/extensions.ts +++ b/core/src/extensions.ts @@ -7,10 +7,8 @@ import { ProxyBackend, TestBackend, } from './backends'; -import { imageEditorComponent } from './editor-components'; import { registerBackend, - registerEditorComponent, registerLocale, registerWidget, } from './lib/registry'; @@ -59,12 +57,5 @@ export function addExtensions() { CodeWidget(), ColorStringWidget(), ]); - registerEditorComponent(imageEditorComponent); - registerEditorComponent({ - id: 'code-block', - label: 'Code Block', - widget: 'code', - type: 'code-block', - }); registerLocale('en', locales.en); } diff --git a/core/src/index.ts b/core/src/index.ts index b97e9ddc..d81d7ad4 100644 --- a/core/src/index.ts +++ b/core/src/index.ts @@ -7,7 +7,6 @@ import Registry from './lib/registry'; export * from './backends'; export * from './widgets'; export * from './media-libraries'; -export * from './editor-components'; export * from './locales'; export * from './lib'; diff --git a/core/src/interface.ts b/core/src/interface.ts index b660b80b..42a65fe0 100644 --- a/core/src/interface.ts +++ b/core/src/interface.ts @@ -1,7 +1,8 @@ +import type { EditorPlugin, EditorType, WidgetRule } from '@toast-ui/editor/types/editor'; +import type { ToolbarItemOptions } from '@toast-ui/editor/types/ui'; import type { PropertiesSchema } from 'ajv/dist/types/json-schema'; import type { ComponentType, ReactNode } from 'react'; import type { t, TranslateProps as ReactPolyglotTranslateProps } from 'react-polyglot'; -import type { Pluggable } from 'unified'; import type { MediaFile as BackendMediaFile } from './backend'; import type { EditorControlProps } from './components/Editor/EditorControlPane/EditorControl'; import type { formatExtensions } from './formats/formats'; @@ -126,6 +127,11 @@ export interface FilterRule { field: string; } +export interface EditorConfig { + preview?: boolean; + frame?: boolean; +} + export interface CollectionFile { name: string; label: string; @@ -136,9 +142,7 @@ export interface CollectionFile { media_folder?: string; public_folder?: string; i18n?: boolean | I18nInfo; - editor?: { - preview?: boolean; - }; + editor?: EditorConfig; } interface Nested { @@ -189,9 +193,7 @@ export interface Collection { nested?: Nested; i18n?: boolean | I18nInfo; hide?: boolean; - editor?: { - preview?: boolean; - }; + editor?: EditorConfig; } export type Collections = Record; @@ -236,11 +238,9 @@ export interface WidgetControlProps { forList: boolean; getAsset: GetAssetFunction; isDisabled: boolean; - isEditorComponent: boolean; isFetching: boolean; isFieldDuplicate: EditorControlProps['isFieldDuplicate']; isFieldHidden: EditorControlProps['isFieldHidden']; - isNewEditorComponent: boolean; label: string; loadEntry: EditorControlProps['loadEntry']; locale: string | undefined; @@ -262,7 +262,6 @@ export interface WidgetPreviewProps { entry: Entry; field: F; getAsset: GetAssetFunction; - getRemarkPlugins: () => Pluggable[]; resolveWidget: (name: string) => Widget; value: T | undefined | null; } @@ -276,6 +275,8 @@ export interface TemplatePreviewProps { collection: Collection; fields: Field[]; entry: Entry; + document: Document | undefined | null; + window: Window | undefined | null; getAsset: GetAssetFunction; widgetFor: (name: string) => ReactNode; widgetsFor: (name: string) => @@ -780,9 +781,7 @@ export interface Config { slug?: Slug; i18n?: I18nInfo; local_backend?: boolean | LocalBackend; - editor?: { - preview?: boolean; - }; + editor?: EditorConfig; search?: boolean; } @@ -798,34 +797,6 @@ export interface BackendInitializer { init: (config: Config, options: BackendInitializerOptions) => BackendClass; } -export interface EditorComponentWidgetOptions { - id: string; - label: string; - widget?: string; - type: string; -} - -export interface EditorComponentManualOptions { - id: string; - label: string; - fields: Field[]; - pattern: RegExp; - allow_add?: boolean; - fromBlock: (match: RegExpMatchArray) => T; - toBlock: (data: T) => string; - toPreview: (data: T, getAsset: GetAssetFunction, fields: Field[]) => ReactNode; -} - -export function isEditorComponentWidgetOptions( - options: EditorComponentOptions, -): options is EditorComponentWidgetOptions { - return 'widget' in options; -} - -export type EditorComponentOptions = - | EditorComponentManualOptions - | EditorComponentWidgetOptions; - export interface EventData { entry: Entry; author: { login: string | undefined; name: string }; @@ -918,7 +889,39 @@ export interface ProcessedCodeLanguage { codemirror_mime_type: string; } -export type FileMetadata = { +export interface FileMetadata { author: string; updatedOn: string; -}; +} + +export interface PreviewStyleOptions { + raw?: boolean; +} + +export interface PreviewStyle { + value: string; + raw: boolean; +} + +export interface WidgetRulesFactoryProps { + getAsset: GetAssetFunction; + field: MarkdownField; +} + +export type WidgetRulesFactory = (props: WidgetRulesFactoryProps) => WidgetRule[]; + +export interface ToolbarItemsFactoryProps { + imageToolbarButton: ToolbarItemOptions; +} + +export type ToolbarItemsFactory = ( + props: ToolbarItemsFactoryProps, +) => (string | ToolbarItemOptions)[][]; + +export interface MarkdownEditorOptions { + widgetRules?: WidgetRulesFactory; + initialEditType?: EditorType; + height?: string; + toolbarItems?: ToolbarItemsFactory; + plugins?: EditorPlugin[]; +} diff --git a/core/src/lib/registry.ts b/core/src/lib/registry.ts index 2bf73850..f1a0af29 100644 --- a/core/src/lib/registry.ts +++ b/core/src/lib/registry.ts @@ -1,28 +1,27 @@ import { oneLine } from 'common-tags'; -import EditorComponent from '../valueObjects/EditorComponent'; - -import type { Pluggable } from 'unified'; import type { AdditionalLink, BackendClass, BackendInitializer, BackendInitializerOptions, Config, - EventListener, - Field, CustomIcon, - LocalePhrasesRoot, - MediaLibraryExternalLibrary, - MediaLibraryOptions, - TemplatePreviewComponent, - WidgetParam, - WidgetValueSerializer, - EditorComponentOptions, Entry, EventData, + EventListener, + Field, + LocalePhrasesRoot, + MarkdownEditorOptions, + MediaLibraryExternalLibrary, + MediaLibraryOptions, + PreviewStyle, + PreviewStyleOptions, + TemplatePreviewComponent, Widget, WidgetOptions, + WidgetParam, + WidgetValueSerializer, } from '../interface'; export const allowedEvents = ['prePublish', 'postPublish', 'preSave', 'postSave'] as const; @@ -39,12 +38,14 @@ interface Registry { widgets: Record; icons: Record; additionalLinks: Record; - editorComponents: Record; - remarkPlugins: Pluggable[]; widgetValueSerializers: Record; mediaLibraries: (MediaLibraryExternalLibrary & { options: MediaLibraryOptions })[]; locales: Record; eventHandlers: typeof eventHandlers; + previewStyles: PreviewStyle[]; + + /** Markdown editor */ + markdownEditorConfig: MarkdownEditorOptions; } /** @@ -56,12 +57,12 @@ const registry: Registry = { widgets: {}, icons: {}, additionalLinks: {}, - editorComponents: {}, - remarkPlugins: [], widgetValueSerializers: {}, mediaLibraries: [], locales: {}, eventHandlers, + previewStyles: [], + markdownEditorConfig: {}, }; export default { @@ -71,10 +72,6 @@ export default { getWidget, getWidgets, resolveWidget, - registerEditorComponent, - getEditorComponents, - registerRemarkPlugin, - getRemarkPlugins, registerWidgetValueSerializer, getWidgetValueSerializer, registerBackend, @@ -91,8 +88,24 @@ export default { getIcon, registerAdditionalLink, getAdditionalLinks, + registerPreviewStyle, + getPreviewStyles, }; +/** + * Preview Styles + * + * Valid options: + * - raw {boolean} if `true`, `style` value is expected to be a CSS string + */ +export function registerPreviewStyle(style: string, { raw = false }: PreviewStyleOptions = {}) { + registry.previewStyles.push({ value: style, raw }); +} + +export function getPreviewStyles() { + return registry.previewStyles; +} + /** * Preview Templates */ @@ -196,44 +209,6 @@ export function resolveWidget(name?: strin return getWidget(name || 'string') || getWidget('unknown'); } -/** - * Markdown Editor Custom Components - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function registerEditorComponent(component: EditorComponentOptions) { - const plugin = EditorComponent(component); - if ('type' in plugin && plugin.type === 'code-block') { - const codeBlock = Object.values(registry.editorComponents).find( - c => 'type' in c && c.type === 'code-block', - ); - - if (codeBlock) { - console.warn(oneLine` - Only one editor component of type "code-block" may be registered. Previously registered code - block component(s) will be overwritten. - `); - } - } - - registry.editorComponents[plugin.id] = plugin; -} - -export function getEditorComponents(): Record { - return registry.editorComponents; -} - -/** - * Remark plugins - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function registerRemarkPlugin(plugin: Pluggable) { - registry.remarkPlugins.push(plugin); -} - -export function getRemarkPlugins(): Pluggable[] { - return registry.remarkPlugins; -} - /** * Widget Serializers */ @@ -383,3 +358,14 @@ export function getAdditionalLinks(): Record { export function getAdditionalLink(id: string): AdditionalLink | undefined { return registry.additionalLinks[id]; } + +/** + * Markdown editor options + */ +export function setMarkdownEditorOptions(options: MarkdownEditorOptions) { + registry.markdownEditorConfig = options; +} + +export function getMarkdownEditorOptions(): MarkdownEditorOptions { + return registry.markdownEditorConfig; +} diff --git a/core/src/locales/en/index.ts b/core/src/locales/en/index.ts index 11b53c73..7e6a5590 100644 --- a/core/src/locales/en/index.ts +++ b/core/src/locales/en/index.ts @@ -72,6 +72,7 @@ const en: LocalePhrasesRoot = { label: 'Updated On', }, }, + notFound: 'Collection not found', }, editor: { editorControl: { diff --git a/core/src/types/markdown.d.ts b/core/src/types/markdown.d.ts deleted file mode 100644 index 9a793475..00000000 --- a/core/src/types/markdown.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'mdast-util-definitions'; -declare module 'unist-builder'; -declare module 'rehype-stringify'; -declare module 'remark-parse'; -declare module 'remark-rehype'; diff --git a/core/src/valueObjects/EditorComponent.ts b/core/src/valueObjects/EditorComponent.ts deleted file mode 100644 index 91e8a102..00000000 --- a/core/src/valueObjects/EditorComponent.ts +++ /dev/null @@ -1,55 +0,0 @@ -import isFunction from 'lodash/isFunction'; - -import { isEditorComponentWidgetOptions } from '../interface'; - -import type { EditorComponentOptions } from '../interface'; - -const catchesNothing = /.^/; - -function bind(fn: unknown) { - return isFunction(fn) && fn.bind(null); -} - -export default function createEditorComponent( - options: EditorComponentOptions, -): EditorComponentOptions { - if (isEditorComponentWidgetOptions(options)) { - const { - id = null, - label = 'unnamed component', - type = 'shortcode', - widget = 'object', - ...remainingConfig - } = options; - - return { - id: id || label.replace(/[^A-Z0-9]+/gi, '_'), - label, - type, - widget, - ...remainingConfig, - }; - } - - const { - id = null, - label = 'unnamed component', - pattern = catchesNothing, - fields = [], - fromBlock, - toBlock, - toPreview, - ...remainingConfig - } = options; - - return { - id: id || label.replace(/[^A-Z0-9]+/gi, '_'), - label, - pattern, - fromBlock: bind(fromBlock) || (() => ({})), - toBlock: bind(toBlock) || (() => 'Plugin'), - toPreview: bind(toPreview) || bind(toBlock) || (() => 'Plugin'), - fields, - ...remainingConfig, - }; -} diff --git a/core/src/widgets/code/CodeControl.tsx b/core/src/widgets/code/CodeControl.tsx index 8912de4c..d69b5974 100644 --- a/core/src/widgets/code/CodeControl.tsx +++ b/core/src/widgets/code/CodeControl.tsx @@ -88,8 +88,6 @@ const settingsPersistKeys = { }; const CodeControl = ({ - isEditorComponent, - isNewEditorComponent, field, onChange, hasErrors, @@ -112,31 +110,20 @@ const CodeControl = ({ ); // If the value is a map, keys can be customized via config. - const getKeys = useCallback( - (field: CodeField) => { - const defaults = { - code: 'code', - lang: 'lang', - }; + const getKeys = useCallback((field: CodeField) => { + const defaults = { + code: 'code', + lang: 'lang', + }; - // Force default keys if widget is an editor component code block. - if (isEditorComponent) { - return defaults; - } - - const keys = field.keys ?? {}; - return { ...defaults, ...keys }; - }, - [isEditorComponent], - ); + const keys = field.keys ?? {}; + return { ...defaults, ...keys }; + }, []); const keys = useMemo(() => getKeys(field), [field, getKeys]); // Determine if the persisted value is a map rather than a plain string. A map value allows both the code string and the language to be persisted. - const valueIsMap = useMemo( - () => Boolean(!field.output_code_only || isEditorComponent), - [field.output_code_only, isEditorComponent], - ); + const valueIsMap = useMemo(() => Boolean(!field.output_code_only), [field.output_code_only]); // This widget is not fully controlled, it only takes a value through props upon initialization. const getInitialLang = useCallback(() => { @@ -362,9 +349,6 @@ const CodeControl = ({ detach={true} editorDidMount={cm => { setCodemirrorEditor(cm); - if (isNewEditorComponent) { - handleFocus(); - } }} value={lastKnownValue} onChange={(_editor, _data, newValue) => handleChange(newValue)} diff --git a/core/src/widgets/markdown/MarkdownControl.tsx b/core/src/widgets/markdown/MarkdownControl.tsx index 357faa64..61bedaae 100644 --- a/core/src/widgets/markdown/MarkdownControl.tsx +++ b/core/src/widgets/markdown/MarkdownControl.tsx @@ -7,18 +7,18 @@ import uuid from 'uuid'; import FieldLabel from '../../components/UI/FieldLabel'; import Outline from '../../components/UI/Outline'; import { IMAGE_EXTENSION_REGEX } from '../../constants/files'; -import useImagePlugin from '../../editor-components/editorPlugin'; import { doesUrlFileExist } from '../../lib/util/fetch.util'; import { isNotNullish } from '../../lib/util/null.util'; import { isNotEmpty } from '../../lib/util/string.util'; +import useEditorOptions from './hooks/useEditorOptions'; +import useToolbarItems from './hooks/useToolbarItems'; +import useWidgetRules from './hooks/useWidgetRules'; import type { RefObject } from 'react'; import type { MarkdownField, MediaLibrary, WidgetControlProps } from '../../interface'; import '@toast-ui/editor/dist/toastui-editor.css'; -const imageFilePattern = /(!)?\[([^\]]*)\]\(([^)]+)\)/; - const StyledEditorWrapper = styled('div')` position: relative; width: 100%; @@ -91,10 +91,6 @@ const MarkdownControl = ({ [controlID, field, mediaLibraryFieldOptions, openMediaLibrary], ); - const imageToolbarButton = useImagePlugin({ - openMediaLibrary: handleOpenMedialLibrary, - }); - const getMedia = useCallback( async (path: string) => { const { type, exists } = await doesUrlFileExist(path); @@ -155,6 +151,10 @@ const MarkdownControl = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [field, mediaPath]); + const { initialEditType, height, plugins, ...markdownEditorOptions } = useEditorOptions(); + const widgetRules = useWidgetRules(markdownEditorOptions.widgetRules, { getAsset, field }); + const toolbarItems = useToolbarItems(markdownEditorOptions.toolbarItems, handleOpenMedialLibrary); + return ( diff --git a/core/src/widgets/markdown/MarkdownPreview.tsx b/core/src/widgets/markdown/MarkdownPreview.tsx index efb83490..6fb09965 100644 --- a/core/src/widgets/markdown/MarkdownPreview.tsx +++ b/core/src/widgets/markdown/MarkdownPreview.tsx @@ -1,28 +1,28 @@ -import DOMPurify from 'dompurify'; -import React from 'react'; +import { Viewer } from '@toast-ui/react-editor'; +import React, { useEffect, useRef } from 'react'; import WidgetPreviewContainer from '../../components/UI/WidgetPreviewContainer'; -import { markdownToHtml } from './serializers'; +import useEditorOptions from './hooks/useEditorOptions'; import type { MarkdownField, WidgetPreviewProps } from '../../interface'; -const MarkdownPreview = ({ - value, - getAsset, - field, - getRemarkPlugins, -}: WidgetPreviewProps) => { +const MarkdownPreview = ({ value }: WidgetPreviewProps) => { + const { plugins } = useEditorOptions(); + const viewer = useRef(null); + + useEffect(() => { + viewer.current?.getInstance().setMarkdown(value ?? ''); + }, [value]); + if (!value) { return null; } - const html = markdownToHtml(value, { - getAsset, - remarkPlugins: getRemarkPlugins(), - }); - const toRender = field.sanitize_preview ?? false ? DOMPurify.sanitize(html) : html; - - return ; + return ( + + + + ); }; export default MarkdownPreview; diff --git a/core/src/widgets/markdown/config/widgetRules.ts b/core/src/widgets/markdown/config/widgetRules.ts new file mode 100644 index 00000000..3649ac99 --- /dev/null +++ b/core/src/widgets/markdown/config/widgetRules.ts @@ -0,0 +1,35 @@ +import type { WidgetRulesFactory } from '../../../interface'; + +const imageFilePattern = /(!)?\[([^\]]*)\]\(([^)]+)\)/; + +const defaultWidgetRules: WidgetRulesFactory = ({ getAsset, field }) => [ + { + rule: imageFilePattern, + toDOM(text) { + const rule = imageFilePattern; + const matched = text.match(rule); + + if (matched) { + if (matched?.length === 4) { + // Image + const img = document.createElement('img'); + img.setAttribute('src', getAsset(matched[3], field).url); + img.setAttribute('style', 'width: 100%;'); + img.innerHTML = 'test'; + return img; + } else { + // File + const a = document.createElement('a'); + a.setAttribute('target', '_blank'); + a.setAttribute('href', matched[2]); + a.innerHTML = matched[1]; + return a; + } + } + + return document.createElement('div'); + }, + }, +]; + +export default defaultWidgetRules; diff --git a/core/src/widgets/markdown/hooks/useEditorOptions.ts b/core/src/widgets/markdown/hooks/useEditorOptions.ts new file mode 100644 index 00000000..9683a169 --- /dev/null +++ b/core/src/widgets/markdown/hooks/useEditorOptions.ts @@ -0,0 +1,23 @@ +import { useMemo } from 'react'; + +import { getMarkdownEditorOptions } from '../../../lib/registry'; + +const useEditorOptions = () => { + return useMemo(() => { + const { + initialEditType = 'wysiwyg', + height = '600px', + plugins = [], + ...markdownEditorOptions + } = getMarkdownEditorOptions(); + + return { + initialEditType, + height, + plugins, + ...markdownEditorOptions, + }; + }, []); +}; + +export default useEditorOptions; diff --git a/core/src/widgets/markdown/hooks/useToolbarItems.ts b/core/src/widgets/markdown/hooks/useToolbarItems.ts new file mode 100644 index 00000000..5d172142 --- /dev/null +++ b/core/src/widgets/markdown/hooks/useToolbarItems.ts @@ -0,0 +1,32 @@ +import { useMemo } from 'react'; + +import useImageToolbarButton from '../toolbar/useImageToolbarButton'; + +import type { MarkdownEditorOptions } from '../../../interface'; + +const useToolbarItems = ( + toolbarItems: MarkdownEditorOptions['toolbarItems'], + openMediaLibrary: (forImage: boolean) => void, +) => { + const imageToolbarButton = useImageToolbarButton({ + openMediaLibrary, + }); + + return useMemo(() => { + let items = [ + ['heading', 'bold', 'italic', 'strike'], + ['hr', 'quote'], + ['ul', 'ol', 'task', 'indent', 'outdent'], + ['table', imageToolbarButton, 'link'], + ['code', 'codeblock'], + ]; + + if (toolbarItems) { + items = toolbarItems({ imageToolbarButton }); + } + + return items; + }, [imageToolbarButton, toolbarItems]); +}; + +export default useToolbarItems; diff --git a/core/src/widgets/markdown/hooks/useWidgetRules.ts b/core/src/widgets/markdown/hooks/useWidgetRules.ts new file mode 100644 index 00000000..93297d77 --- /dev/null +++ b/core/src/widgets/markdown/hooks/useWidgetRules.ts @@ -0,0 +1,20 @@ +import { useMemo } from 'react'; + +import defaultWidgetRules from '../config/widgetRules'; + +import type { WidgetRulesFactory, WidgetRulesFactoryProps } from '../../../interface'; + +const useWidgetRules = ( + widgetRules: WidgetRulesFactory | undefined, + { getAsset, field }: WidgetRulesFactoryProps, +) => { + return useMemo(() => { + const rules = defaultWidgetRules({ getAsset, field }); + if (widgetRules) { + rules.push(...widgetRules({ getAsset, field })); + } + return rules; + }, [field, getAsset, widgetRules]); +}; + +export default useWidgetRules; diff --git a/core/src/widgets/markdown/serializers.ts b/core/src/widgets/markdown/serializers.ts deleted file mode 100644 index d9368311..00000000 --- a/core/src/widgets/markdown/serializers.ts +++ /dev/null @@ -1,40 +0,0 @@ -import rehypeStringify from 'rehype-stringify'; -import remarkGfm from 'remark-gfm'; -import remarkParse from 'remark-parse'; -import remarkRehype from 'remark-rehype'; -import { unified } from 'unified'; - -// import { getEditorComponents } from '../../../lib/registry'; - -import type { Pluggable } from 'unified'; -import type { GetAssetFunction } from '../../interface'; - -interface MarkdownToHtmlProps { - getAsset: GetAssetFunction; - remarkPlugins?: Pluggable[]; -} - -/** - * Convert Markdown to HTML. - */ -export function markdownToHtml( - markdown: string, - { remarkPlugins = [] }: MarkdownToHtmlProps, -): string { - const html = unified() - .use(remarkParse) - .use(remarkGfm) - // .use(remarkParseShortcodes as any, { plugins: getEditorComponents() }) - .use(remarkPlugins) - // .use(remarkToRehypeShortcodes as any, { plugins: getEditorComponents(), getAsset }) - .use(remarkRehype, { allowDangerousHTML: true }) - .use(rehypeStringify, { - allowDangerousHtml: true, - allowDangerousCharacters: true, - closeSelfClosing: true, - entities: { useNamedReferences: true }, - }) - .processSync(markdown); - - return String(html); -} diff --git a/core/src/editor-components/editorPlugin.ts b/core/src/widgets/markdown/toolbar/useImageToolbarButton.ts similarity index 88% rename from core/src/editor-components/editorPlugin.ts rename to core/src/widgets/markdown/toolbar/useImageToolbarButton.ts index c9c6913f..6c3dd123 100644 --- a/core/src/editor-components/editorPlugin.ts +++ b/core/src/widgets/markdown/toolbar/useImageToolbarButton.ts @@ -7,7 +7,7 @@ export interface ImagePluginProps { const PREFIX = 'toastui-editor-'; -const useImagePlugin = ({ openMediaLibrary }: ImagePluginProps): ToolbarItemOptions => { +const useImageToolbarButton = ({ openMediaLibrary }: ImagePluginProps): ToolbarItemOptions => { const toolbarButton = useMemo(() => { const btn = document.createElement('button'); btn.type = 'button'; @@ -41,4 +41,4 @@ const useImagePlugin = ({ openMediaLibrary }: ImagePluginProps): ToolbarItemOpti return toolbarItem; }; -export default useImagePlugin; +export default useImageToolbarButton; diff --git a/core/yarn.lock b/core/yarn.lock index c78a1421..ac947d9b 100644 --- a/core/yarn.lock +++ b/core/yarn.lock @@ -2090,20 +2090,6 @@ dependencies: "@types/react" "*" -"@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/dompurify@2.3.4": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.3.4.tgz#94e997e30338ea24d4c8d08beca91ce4dd17a1b4" - integrity sha512-EXzDatIb5EspL2eb/xPGmaC8pePcTHrkDCONjeisusLFrVfl38Pjea/R0YJGu3k9ZQadSvMqW0WXPI2hEo2Ajg== - dependencies: - "@types/trusted-types" "*" - "@types/eslint-scope@^3.7.3": version "3.7.4" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" @@ -2163,13 +2149,6 @@ dependencies: "@types/node" "*" -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - "@types/history@4.7.11": version "4.7.11" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" @@ -2254,13 +2233,6 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.185.tgz#c9843f5a40703a8f5edfd53358a58ae729816908" integrity sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA== -"@types/mdast@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" - integrity sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA== - dependencies: - "@types/unist" "*" - "@types/mime@*": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" @@ -2276,11 +2248,6 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - "@types/node-fetch@2.6.2": version "2.6.2" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" @@ -2439,16 +2406,6 @@ dependencies: "@types/estree" "*" -"@types/trusted-types@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== - -"@types/unist@*", "@types/unist@^2.0.0": - 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/url-join@4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/url-join/-/url-join-4.0.1.tgz#4989c97f969464647a8586c7252d97b449cdc045" @@ -3236,11 +3193,6 @@ babylon@^6.18.0: resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== -bail@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" - integrity sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -3450,11 +3402,6 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz#5f1715e506e71860b4b07c50060ea6462217611e" integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg== -ccount@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" - integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== - chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -3496,21 +3443,6 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -character-entities-html4@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" - integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== - -character-entities-legacy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" - integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== - -character-entities@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" - integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== - chokidar@^3.4.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -3665,11 +3597,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -comma-separated-tokens@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98" - integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg== - commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3987,7 +3914,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4014,13 +3941,6 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decode-named-character-reference@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" - integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== - dependencies: - character-entities "^2.0.0" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -4088,11 +4008,6 @@ deprecation@^2.0.0, deprecation@^2.3.1: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== -dequal@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -4118,11 +4033,6 @@ diff-sequences@^29.0.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4207,7 +4117,7 @@ domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" -dompurify@2.4.0, dompurify@^2.3.3: +dompurify@^2.3.3: version "2.4.0" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.0.tgz#c9c88390f024c2823332615c9e20a453cf3825dd" integrity sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA== @@ -4400,7 +4310,7 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@5.0.0, escape-string-regexp@^5.0.0: +escape-string-regexp@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== @@ -4779,11 +4689,6 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5272,35 +5177,6 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -hast-util-is-element@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.2.tgz#fc0b0dc7cef3895e839b8d66979d57b0338c68f3" - integrity sha512-thjnlGAnwP8ef/GSO1Q8BfVk2gundnc2peGQqEg2kUt/IqesiGg/5mSwN2fE7nLzy61pg88NG6xV+UrGOrx9EA== - dependencies: - "@types/hast" "^2.0.0" - "@types/unist" "^2.0.0" - -hast-util-to-html@^8.0.0: - version "8.0.3" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.3.tgz#4e37580872e143ea9ce0dba87918b19e4ea997e3" - integrity sha512-/D/E5ymdPYhHpPkuTHOUkSatxr4w1ZKrZsG0Zv/3C2SRVT0JFJG53VS45AMrBtYk0wp5A7ksEhiC8QaOZM95+A== - dependencies: - "@types/hast" "^2.0.0" - ccount "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-is-element "^2.0.0" - hast-util-whitespace "^2.0.0" - html-void-elements "^2.0.0" - property-information "^6.0.0" - space-separated-tokens "^2.0.0" - stringify-entities "^4.0.2" - unist-util-is "^5.0.0" - -hast-util-whitespace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-2.0.0.tgz#4fc1086467cc1ef5ba20673cb6b03cec3a970f1c" - integrity sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg== - he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -5369,11 +5245,6 @@ html-tags@^3.2.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== -html-void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f" - integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A== - http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -5607,11 +5478,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-builtin-module@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" @@ -5712,11 +5578,6 @@ is-plain-obj@^3.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" - integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== - is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6348,11 +6209,6 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - known-css-properties@^0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776" @@ -6517,11 +6373,6 @@ log-symbols@^3.0.0: dependencies: chalk "^2.4.2" -longest-streak@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.0.1.tgz#c97315b7afa0e7d9525db9a5a2953651432bdc5d" - integrity sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg== - loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6578,11 +6429,6 @@ mapbox-to-css-font@^2.4.1: resolved "https://registry.yarnpkg.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.1.tgz#41bf38faed36b7dab069828aa3654e4bd91a1eda" integrity sha512-QQ/iKiM43DM9+aujTL45Iz5o7gDeSFmy4LPl3HZmNcwCE++NxGazf+yFpY+wCb+YS23sDa1ghpo3zrNFOcHlow== -markdown-table@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.2.tgz#9b59eb2c1b22fe71954a65ff512887065a7bb57c" - integrity sha512-y8j3a5/DkJCmS5x4dMCQL+OR0+2EAq3DOtio1COSHsmW2BGXnNCK3v12hJt1LrUz5iZH5g0LmuYOjDdI+czghA== - material-colors@^1.2.1: version "1.2.6" resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.6.tgz#6d1958871126992ceecc72f4bcc4d8f010865f46" @@ -6593,145 +6439,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -mdast-util-definitions@1.2.5: - 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@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" - integrity sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - -mdast-util-find-and-replace@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.1.tgz#249901ef43c5f41d6e8a8d446b3b63b17e592d7c" - integrity sha512-SobxkQXFAdd4b5WmEakmkVoh18icjQRxGy5OWTCzgsLRm1Fu/KCtwD1HIQSsmq5ZRjVH0Ehwg6/Fn3xIUk+nKw== - dependencies: - escape-string-regexp "^5.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.0.0" - -mdast-util-from-markdown@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz#84df2924ccc6c995dec1e2368b2b208ad0a76268" - integrity sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - -mdast-util-gfm-autolink-literal@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.2.tgz#4032dcbaddaef7d4f2f3768ed830475bb22d3970" - integrity sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg== - dependencies: - "@types/mdast" "^3.0.0" - ccount "^2.0.0" - mdast-util-find-and-replace "^2.0.0" - micromark-util-character "^1.0.0" - -mdast-util-gfm-footnote@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.1.tgz#11d2d40a1a673a399c459e467fa85e00223191fe" - integrity sha512-p+PrYlkw9DeCRkTVw1duWqPRHX6Ywh2BNKJQcZbCwAuP/59B0Lk9kakuAd7KbQprVO4GzdW8eS5++A9PUSqIyw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - micromark-util-normalize-identifier "^1.0.0" - -mdast-util-gfm-strikethrough@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.1.tgz#a4a74c36864ec6a6e3bbd31e1977f29beb475789" - integrity sha512-zKJbEPe+JP6EUv0mZ0tQUyLQOC+FADt0bARldONot/nefuISkaZFlmVK4tU6JgfyZGrky02m/I6PmehgAgZgqg== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-table@^1.0.0: - version "1.0.6" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.6.tgz#184e900979fe790745fc3dabf77a4114595fcd7f" - integrity sha512-uHR+fqFq3IvB3Rd4+kzXW8dmpxUhvgCQZep6KdjsLK4O6meK5dYZEayLtIxNus1XO3gfjfcIFe8a7L0HZRGgag== - dependencies: - "@types/mdast" "^3.0.0" - markdown-table "^3.0.0" - mdast-util-from-markdown "^1.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm-task-list-item@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.1.tgz#6f35f09c6e2bcbe88af62fdea02ac199cc802c5c" - integrity sha512-KZ4KLmPdABXOsfnM6JHUIjxEvcx2ulk656Z/4Balw071/5qgnhz+H1uGtf2zIGnrnvDC8xR4Fj9uKbjAFGNIeA== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-markdown "^1.3.0" - -mdast-util-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.1.tgz#16fcf70110ae689a06d77e8f4e346223b64a0ea6" - integrity sha512-42yHBbfWIFisaAfV1eixlabbsa6q7vHeSPY+cg+BBjX51M8xhgMacqH9g6TftB/9+YkcI0ooV4ncfrJslzm/RQ== - dependencies: - mdast-util-from-markdown "^1.0.0" - mdast-util-gfm-autolink-literal "^1.0.0" - mdast-util-gfm-footnote "^1.0.0" - mdast-util-gfm-strikethrough "^1.0.0" - mdast-util-gfm-table "^1.0.0" - mdast-util-gfm-task-list-item "^1.0.0" - mdast-util-to-markdown "^1.0.0" - -mdast-util-to-hast@^12.1.0: - version "12.2.4" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.2.4.tgz#34c1ef2b6cf01c27b3e3504e2c977c76f722e7e1" - integrity sha512-a21xoxSef1l8VhHxS1Dnyioz6grrJkoaCUgGzMD/7dWHvboYX3VW53esRUfB5tgTyz4Yos1n25SPcj35dJqmAg== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-builder "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - -mdast-util-to-markdown@^1.0.0, mdast-util-to-markdown@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz#38b6cdc8dc417de642a469c4fc2abdf8c931bd1e" - integrity sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - longest-streak "^3.0.0" - mdast-util-to-string "^3.0.0" - micromark-util-decode-string "^1.0.0" - unist-util-visit "^4.0.0" - zwitch "^2.0.0" - -mdast-util-to-string@1.1.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-to-string@^3.0.0, mdast-util-to-string@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" - integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== - mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -6812,281 +6519,6 @@ micro-api-client@^3.2.1: resolved "https://registry.yarnpkg.com/micro-api-client/-/micro-api-client-3.3.0.tgz#52dd567d322f10faffe63d19d4feeac4e4ffd215" integrity sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg== -micromark-core-commonmark@^1.0.0, micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - -micromark-extension-gfm-autolink-literal@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.3.tgz#dc589f9c37eaff31a175bab49f12290edcf96058" - integrity sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-footnote@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.0.4.tgz#cbfd8873b983e820c494498c6dac0105920818d5" - integrity sha512-E/fmPmDqLiMUP8mLJ8NbJWJ4bTw6tS+FEQS8CcuDtZpILuOb2kjLqPEeAePF1djXROHXChM/wPJw0iS4kHCcIg== - dependencies: - micromark-core-commonmark "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-strikethrough@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.4.tgz#162232c284ffbedd8c74e59c1525bda217295e18" - integrity sha512-/vjHU/lalmjZCT5xt7CcHVJGq8sYRm80z24qAKXzaHzem/xsDYb2yLL+NNVbYvmpLx3O7SYPuGL5pzusL9CLIQ== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-table@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.5.tgz#7b708b728f8dc4d95d486b9e7a2262f9cddbcbb4" - integrity sha512-xAZ8J1X9W9K3JTJTUL7G6wSKhp2ZYHrFk5qJgY/4B33scJzE2kpfRL6oiw/veJTbt7jiM/1rngLlOKPWr1G+vg== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm-tagfilter@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.1.tgz#fb2e303f7daf616db428bb6a26e18fda14a90a4d" - integrity sha512-Ty6psLAcAjboRa/UKUbbUcwjVAv5plxmpUTy2XC/3nJFL37eHej8jrHrRzkqcpipJliuBH30DTs7+3wqNcQUVA== - dependencies: - micromark-util-types "^1.0.0" - -micromark-extension-gfm-task-list-item@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.3.tgz#7683641df5d4a09795f353574d7f7f66e47b7fc4" - integrity sha512-PpysK2S1Q/5VXi72IIapbi/jliaiOFzv7THH4amwXeYXLq3l1uo8/2Be0Ac1rEwK20MQEsGH2ltAZLNY2KI/0Q== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-extension-gfm@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.1.tgz#40f3209216127a96297c54c67f5edc7ef2d1a2a2" - integrity sha512-p2sGjajLa0iYiGQdT0oelahRYtMWvLjy8J9LOCxzIQsllMCGLbsLW+Nc+N4vi02jcRJvedVJ68cjelKIO6bpDA== - dependencies: - micromark-extension-gfm-autolink-literal "^1.0.0" - micromark-extension-gfm-footnote "^1.0.0" - micromark-extension-gfm-strikethrough "^1.0.0" - micromark-extension-gfm-table "^1.0.0" - micromark-extension-gfm-tagfilter "^1.0.0" - micromark-extension-gfm-task-list-item "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.1.0.tgz#d97c54d5742a0d9611a68ca0cd4124331f264d86" - integrity sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz#dcc85f13b5bd93ff8d2868c3dba28039d490b946" - integrity sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-decode-string@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz#942252ab7a76dec2dbf089cc32505ee2bc3acf02" - integrity sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-encode@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz#2c1c22d3800870ad770ece5686ebca5920353383" - integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== - -micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== - -micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== - dependencies: - micromark-util-symbol "^1.0.0" - -micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== - dependencies: - micromark-util-types "^1.0.0" - -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" - integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - -micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - -micromark-util-symbol@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" - integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== - -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" - integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== - -micromark@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.0.10.tgz#1eac156f0399d42736458a14b0ca2d86190b457c" - integrity sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -7192,11 +6624,6 @@ moment@2.29.4: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -7896,11 +7323,6 @@ propagate@^2.0.0: resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45" integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag== -property-information@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.1.1.tgz#5ca85510a3019726cb9afed4197b7b8ac5926a22" - integrity sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w== - prosemirror-commands@^1.1.9: version "1.3.1" resolved "https://registry.yarnpkg.com/prosemirror-commands/-/prosemirror-commands-1.3.1.tgz#926c88801eebaa50363d4658850b41406d375a31" @@ -8481,44 +7903,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -rehype-stringify@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-9.0.3.tgz#70e3bd6d4d29e7acf36b802deed350305d2c3c17" - integrity sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw== - dependencies: - "@types/hast" "^2.0.0" - hast-util-to-html "^8.0.0" - unified "^10.0.0" - -remark-gfm@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" - integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-gfm "^2.0.0" - micromark-extension-gfm "^2.0.0" - unified "^10.0.0" - -remark-parse@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - -remark-rehype@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/remark-rehype/-/remark-rehype-10.1.0.tgz#32dc99d2034c27ecaf2e0150d22a6dcccd9a6279" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -8650,13 +8034,6 @@ rw@^1.3.3: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9001,11 +8378,6 @@ 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@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.1.tgz#43193cec4fb858a2ce934b7f98b7f2c18107098b" - integrity sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw== - spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -9191,14 +8563,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -stringify-entities@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" - integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== - dependencies: - character-entities-html4 "^2.0.0" - character-entities-legacy "^3.0.0" - strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -9588,21 +8952,11 @@ traverse@0.6.6: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw== -trim-lines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" - integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -trough@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" - integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== - truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -9747,19 +9101,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unified@10.1.2, unified@^10.0.0: - version "10.1.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - union@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" @@ -9767,73 +9108,6 @@ union@~0.5.0: dependencies: qs "^6.4.0" -unist-builder@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-3.0.0.tgz#728baca4767c0e784e1e64bb44b5a5a753021a04" - integrity sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-generated@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-2.0.0.tgz#86fafb77eb6ce9bfa6b663c3f5ad4f8e56a60113" - integrity sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw== - -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" - integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== - -unist-util-is@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-5.1.1.tgz#e8aece0b102fa9bc097b0fef8f870c496d4a6236" - integrity sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ== - -unist-util-position@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.3.tgz#5290547b014f6222dff95c48d5c3c13a88fadd07" - integrity sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-stringify-position@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz#5c6aa07c90b1deffd9153be170dce628a869a447" - integrity sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg== - dependencies: - "@types/unist" "^2.0.0" - -unist-util-visit-parents@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9" - integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g== - dependencies: - unist-util-is "^3.0.0" - -unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz#868f353e6fce6bf8fa875b251b0f4fec3be709bb" - integrity sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - -unist-util-visit@^1.0.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== - dependencies: - unist-util-visit-parents "^2.0.0" - -unist-util-visit@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.1.tgz#1c4842d70bd3df6cc545276f5164f933390a9aad" - integrity sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - universal-user-agent@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" @@ -9966,16 +9240,6 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -10013,24 +9277,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vfile-message@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d" - integrity sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - -vfile@^5.0.0: - version "5.3.5" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.3.5.tgz#ec2e206b1414f561c85b7972bb1eeda8ab47ee61" - integrity sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - w3c-keyname@^2.2.0: version "2.2.6" resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" @@ -10371,8 +9617,3 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.2.tgz#91f8d0e901ffa3d66599756dde7f57b17c95dce1" - integrity sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==