diff --git a/client/components/document/index.tsx b/client/components/document/index.tsx
index 8f2f1423..c3e30170 100644
--- a/client/components/document/index.tsx
+++ b/client/components/document/index.tsx
@@ -1,8 +1,9 @@
-import { Button, Card, Input, Tabs, Textarea } from "@geist-ui/core"
+import { Button, ButtonGroup, Card, Input, Tabs, Textarea } from "@geist-ui/core"
import { ChangeEvent, FormEvent, memo, useEffect, useRef, useState } from "react"
import styles from './document.module.css'
import MarkdownPreview from '../preview'
import { Trash } from '@geist-ui/icons'
+import FormattingIcons from "../formatting-icons"
type Props = {
editable: boolean
remove?: () => void
@@ -46,12 +47,13 @@ const Document = ({ remove, editable, title, content, setTitle, setContent, init
{remove && editable && } auto height={'36px'} width={'36px'} onClick={() => removeFile(remove)} />}
-
+
+
{/* */}
-
-
+
+
+
)
}
diff --git a/client/components/formatting-icons/index.tsx b/client/components/formatting-icons/index.tsx
new file mode 100644
index 00000000..67e2f9b7
--- /dev/null
+++ b/client/components/formatting-icons/index.tsx
@@ -0,0 +1,113 @@
+import { ButtonGroup, Button } from "@geist-ui/core"
+import { Bold, Italic, Underline, Link } from '@geist-ui/icons'
+import { RefObject, useCallback, useMemo } from "react"
+
+// TODO: clean up
+
+const FormattingIcons = ({ textareaRef, setText }: { textareaRef?: RefObject, setText?: (text: string) => void }) => {
+ // const { textBefore, textAfter, selectedText } = useMemo(() => {
+ // if (textareaRef && textareaRef.current) {
+ // const textarea = textareaRef.current
+ // const text = textareaRef.current.value
+ // const selectionStart = textarea.selectionStart
+ // const selectionEnd = textarea.selectionEnd
+ // const textBefore = text.substring(0, selectionStart)
+ // const textAfter = text.substring(selectionEnd)
+ // const selectedText = text.substring(selectionStart, selectionEnd)
+ // return { textBefore, textAfter, selectedText }
+ // }
+ // return { textBefore: '', textAfter: '' }
+ // }, [textareaRef,])
+
+ const handleBoldClick = useCallback((e) => {
+ if (textareaRef?.current && setText) {
+ const selectionStart = textareaRef.current.selectionStart
+ const selectionEnd = textareaRef.current.selectionEnd
+ const text = textareaRef.current.value
+ const before = text.substring(0, selectionStart)
+ const after = text.substring(selectionEnd)
+ const selectedText = text.substring(selectionStart, selectionEnd)
+
+ const newText = `${before}**${selectedText}**${after}`
+ setText(newText)
+
+ // TODO; fails because settext async
+ textareaRef.current.setSelectionRange(before.length + 2, before.length + 2 + selectedText.length)
+ }
+ }, [setText, textareaRef])
+
+ const handleItalicClick = useCallback((e) => {
+ if (textareaRef?.current && setText) {
+ const selectionStart = textareaRef.current.selectionStart
+ const selectionEnd = textareaRef.current.selectionEnd
+ const text = textareaRef.current.value
+ const before = text.substring(0, selectionStart)
+ const after = text.substring(selectionEnd)
+ const selectedText = text.substring(selectionStart, selectionEnd)
+ const newText = `${before}*${selectedText}*${after}`
+ setText(newText)
+ textareaRef.current.focus()
+ textareaRef.current.setSelectionRange(before.length + 1, before.length + 1 + selectedText.length)
+ }
+ }, [setText, textareaRef])
+
+ const handleLinkClick = useCallback((e) => {
+ if (textareaRef?.current && setText) {
+ const selectionStart = textareaRef.current.selectionStart
+ const selectionEnd = textareaRef.current.selectionEnd
+ const text = textareaRef.current.value
+ const before = text.substring(0, selectionStart)
+ const after = text.substring(selectionEnd)
+ const selectedText = text.substring(selectionStart, selectionEnd)
+ let formattedText = '';
+ if (selectedText.includes('http')) {
+ formattedText = `[](${selectedText})`
+ } else {
+ formattedText = `[${selectedText}](https://)`
+ }
+ const newText = `${before}${formattedText}${after}`
+ setText(newText)
+ textareaRef.current.focus()
+ textareaRef.current.setSelectionRange(before.length + 1, before.length + 1 + selectedText.length)
+ }
+ }, [setText, textareaRef])
+
+ const formattingActions = useMemo(() => [
+ {
+ icon: ,
+ name: 'bold',
+ action: handleBoldClick
+ },
+ {
+ icon: ,
+ name: 'italic',
+ action: handleItalicClick
+ },
+ // {
+ // icon: ,
+ // name: 'underline',
+ // action: handleUnderlineClick
+ // },
+ {
+ icon: ,
+ name: 'hyperlink',
+ action: handleLinkClick
+ }
+ ], [handleBoldClick, handleItalicClick, handleLinkClick])
+
+ return (
+
+
+ {formattingActions.map(({ icon, name, action }) => (
+
+
+ )
+
+}
+
+export default FormattingIcons
\ No newline at end of file
diff --git a/client/package.json b/client/package.json
index 0ac88573..83742a16 100644
--- a/client/package.json
+++ b/client/package.json
@@ -19,7 +19,9 @@
"react-debounce-render": "^8.0.2",
"react-dom": "17.0.2",
"react-markdown": "^8.0.0",
+ "rehype-katex": "^6.0.2",
"remark-gfm": "^3.0.1",
+ "remark-math": "^5.1.1",
"swr": "^1.2.2"
},
"devDependencies": {
diff --git a/client/pages/index.tsx b/client/pages/index.tsx
index a4b6218c..97ce2d9b 100644
--- a/client/pages/index.tsx
+++ b/client/pages/index.tsx
@@ -24,7 +24,7 @@ const Home = ({ theme, changeTheme }: ThemeProps) => {
### Drift is a self-hostable clone of GitHub Gist.
#### It is a simple way to share code and text snippets with your friends, with support for the following:
-- Render GitHub Extended Markdown and LaTeX (including images)
+- Render GitHub Extended Markdown (including images)
- User authentication
- Private, public, and secret posts
@@ -56,7 +56,9 @@ Drift was inspired by [this tweet](https://twitter.com/emilyst/status/1499858264
- [ ] Meta tags
- [ ] User settings
- [ ] Search
-- [ ] "Forking"`}
+- [ ] "Forking
+- [ ] LaTeX
+- [ ] Syntax highlighting based on filename ending"`}
title={`TODO.md`}
initialTab={`preview`}
/>
diff --git a/client/yarn.lock b/client/yarn.lock
index dce2862d..ec589ea8 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -170,6 +170,11 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+"@types/katex@^0.11.0":
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.11.1.tgz#34de04477dcf79e2ef6c8d23b41a3d81f9ebeaf5"
+ integrity sha512-DUlIj2nk0YnJdlWgsFuVKcX27MLW0KbKmGVoUHmFr+74FYYNUDAaj9ZqTADvsbE8rfxuVmSFc7KczYn5Y09ozg==
+
"@types/mdast@^3.0.0":
version "3.0.10"
resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
@@ -192,6 +197,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+"@types/parse5@^6.0.0":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb"
+ integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
+
"@types/prop-types@*":
version "15.7.4"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11"
@@ -437,6 +447,11 @@ comma-separated-tokens@^2.0.0:
resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.2.tgz#d4c25abb679b7751c880be623c1179780fe1dd98"
integrity sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==
+commander@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+ integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@@ -985,11 +1000,60 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
+hast-util-from-parse5@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-7.1.0.tgz#c129dd3a24dd8a867ab8a029ca47e27aa54864b7"
+ integrity sha512-m8yhANIAccpU4K6+121KpPP55sSl9/samzQSQGpb0mTExcNh2WlvjtMwSWFhg6uqD4Rr6Nfa8N6TMypQM51rzQ==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/parse5" "^6.0.0"
+ "@types/unist" "^2.0.0"
+ hastscript "^7.0.0"
+ property-information "^6.0.0"
+ vfile "^5.0.0"
+ vfile-location "^4.0.0"
+ web-namespaces "^2.0.0"
+
+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-parse-selector@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.0.tgz#a519e27e8b61bd5a98fad494ed06131ce68d9c3f"
+ integrity sha512-AyjlI2pTAZEOeu7GeBPZhROx0RHBnydkQIXlhnFzDi0qfXTmGUWoCYZtomHbrdrheV4VFUlPcfJ6LMF5T6sQzg==
+ dependencies:
+ "@types/hast" "^2.0.0"
+
+hast-util-to-text@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/hast-util-to-text/-/hast-util-to-text-3.1.1.tgz#b7699a75f7a61af6e0befb67660cd78460d96dc6"
+ integrity sha512-7S3mOBxACy8syL45hCn3J7rHqYaXkxRfsX6LXEU5Shz4nt4GxdjtMUtG+T6G/ZLUHd7kslFAf14kAN71bz30xA==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ hast-util-is-element "^2.0.0"
+ unist-util-find-after "^4.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==
+hastscript@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-7.0.2.tgz#d811fc040817d91923448a28156463b2e40d590a"
+ integrity sha512-uA8ooUY4ipaBvKcMuPehTAB/YfFLSSzCwFSwT6ltJbocFUKH/GDHLN+tflq7lSRf9H86uOuxOFkh1KgIy3Gg2g==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ comma-separated-tokens "^2.0.0"
+ hast-util-parse-selector "^3.0.0"
+ property-information "^6.0.0"
+ space-separated-tokens "^2.0.0"
+
hoist-non-react-statics@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
@@ -1196,6 +1260,20 @@ json5@^1.0.1:
array-includes "^3.1.3"
object.assign "^4.1.2"
+katex@^0.13.0:
+ version "0.13.24"
+ resolved "https://registry.yarnpkg.com/katex/-/katex-0.13.24.tgz#fe55455eb455698cb24b911a353d16a3c855d905"
+ integrity sha512-jZxYuKCma3VS5UuxOx/rFV1QyGSl3Uy/i0kTJF3HgQ5xMinCQVF8Zd4bMY/9aI9b9A2pjIBOsjSSm68ykTAr8w==
+ dependencies:
+ commander "^8.0.0"
+
+katex@^0.15.0:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/katex/-/katex-0.15.2.tgz#c05ece41ab497597b17abca2cecde3e4c0127f9d"
+ integrity sha512-FfZ/f6f8bQdLmJ3McXDNTkKenQkoXkItpW0I9bsG2wgb+8JAY5bwpXFtI8ZVrg5hc1wo1X/UIhdkVMpok46tEQ==
+ dependencies:
+ commander "^8.0.0"
+
kleur@^4.0.3:
version "4.1.4"
resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.4.tgz#8c202987d7e577766d039a8cd461934c01cda04d"
@@ -1353,6 +1431,15 @@ mdast-util-gfm@^2.0.0:
mdast-util-gfm-table "^1.0.0"
mdast-util-gfm-task-list-item "^1.0.0"
+mdast-util-math@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/mdast-util-math/-/mdast-util-math-2.0.1.tgz#141b8e7e43731d2a7423c5eb8c0335c05d257ad2"
+ integrity sha512-ZZtjyRwobsiVg4bY0Q5CzAZztpbjRIA7ZlMMb0PNkwTXOnJTUoHvzBhVG95LIuek5Mlj1l2P+jBvWviqW7G+0A==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ longest-streak "^3.0.0"
+ mdast-util-to-markdown "^1.3.0"
+
mdast-util-to-hast@^12.1.0:
version "12.1.1"
resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-12.1.1.tgz#89a2bb405eaf3b05eb8bf45157678f35eef5dbca"
@@ -1498,6 +1585,19 @@ micromark-extension-gfm@^2.0.0:
micromark-util-combine-extensions "^1.0.0"
micromark-util-types "^1.0.0"
+micromark-extension-math@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-2.0.2.tgz#bb7d28b907b17f1813dd3d0df2a6df6bb1a4d0e1"
+ integrity sha512-cFv2B/E4pFPBBFuGgLHkkNiFAIQv08iDgPH2HCuR2z3AUgMLecES5Cq7AVtwOtZeRrbA80QgMUk8VVW0Z+D2FA==
+ dependencies:
+ "@types/katex" "^0.11.0"
+ katex "^0.13.0"
+ 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-destination@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e"
@@ -1849,6 +1949,11 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.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==
+
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -2000,6 +2105,30 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+rehype-katex@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/rehype-katex/-/rehype-katex-6.0.2.tgz#20197bbc10bdf79f6b999bffa6689d7f17226c35"
+ integrity sha512-C4gDAlS1+l0hJqctyiU64f9CvT00S03qV1T6HiMzbSuLBgWUtcqydWHY9OpKrm0SpkK16FNd62CDKyWLwV2ppg==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ "@types/katex" "^0.11.0"
+ hast-util-to-text "^3.1.0"
+ katex "^0.15.0"
+ rehype-parse "^8.0.0"
+ unified "^10.0.0"
+ unist-util-remove-position "^4.0.0"
+ unist-util-visit "^4.0.0"
+
+rehype-parse@^8.0.0:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-8.0.4.tgz#3d17c9ff16ddfef6bbcc8e6a25a99467b482d688"
+ integrity sha512-MJJKONunHjoTh4kc3dsM1v3C9kGrrxvA3U8PxZlP2SjH8RNUSrb+lF7Y0KVaUDnGH2QZ5vAn7ulkiajM9ifuqg==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ hast-util-from-parse5 "^7.0.0"
+ parse5 "^6.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"
@@ -2010,6 +2139,16 @@ remark-gfm@^3.0.1:
micromark-extension-gfm "^2.0.0"
unified "^10.0.0"
+remark-math@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/remark-math/-/remark-math-5.1.1.tgz#459e798d978d4ca032e745af0bac81ddcdf94964"
+ integrity sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==
+ dependencies:
+ "@types/mdast" "^3.0.0"
+ mdast-util-math "^2.0.0"
+ micromark-extension-math "^2.0.0"
+ unified "^10.0.0"
+
remark-parse@^10.0.0:
version "10.0.1"
resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775"
@@ -2295,6 +2434,14 @@ unist-builder@^3.0.0:
dependencies:
"@types/unist" "^2.0.0"
+unist-util-find-after@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/unist-util-find-after/-/unist-util-find-after-4.0.0.tgz#1101cebf5fed88ae3c6f3fa676e86fd5772a4f32"
+ integrity sha512-gfpsxKQde7atVF30n5Gff2fQhAc4/HTOV4CvkXpTg9wRfQhZWdXitpyXHWB6YcYgnsxLx+4gGHeVjCTAAp9sjw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-is "^5.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"
@@ -2310,6 +2457,14 @@ unist-util-position@^4.0.0:
resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.1.tgz#f8484b2da19a897a0180556d160c28633070dbb9"
integrity sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA==
+unist-util-remove-position@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-4.0.1.tgz#d5b46a7304ac114c8d91990ece085ca7c2c135c8"
+ integrity sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ unist-util-visit "^4.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"
@@ -2380,6 +2535,14 @@ v8-compile-cache@^2.0.3:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+vfile-location@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-4.0.1.tgz#06f2b9244a3565bef91f099359486a08b10d3a95"
+ integrity sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==
+ dependencies:
+ "@types/unist" "^2.0.0"
+ vfile "^5.0.0"
+
vfile-message@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.1.2.tgz#a2908f64d9e557315ec9d7ea3a910f658ac05f7d"
@@ -2398,6 +2561,11 @@ vfile@^5.0.0:
unist-util-stringify-position "^3.0.0"
vfile-message "^3.0.0"
+web-namespaces@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692"
+ integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==
+
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"