diff options
-rw-r--r-- | README.md | 4 | ||||
-rw-r--r-- | components/config.ts | 6 | ||||
-rw-r--r-- | components/tweaks.tsx | 193 | ||||
-rw-r--r-- | next.config.js | 3 | ||||
-rw-r--r-- | org-roam-ui.el | 2 | ||||
-rw-r--r-- | package.json | 16 | ||||
-rw-r--r-- | pages/index.tsx | 260 | ||||
-rw-r--r-- | util/persistant-state.ts | 11 | ||||
-rw-r--r-- | yarn.lock | 599 |
9 files changed, 873 insertions, 221 deletions
@@ -208,6 +208,10 @@ and we'll try to help you ASAP! While we try to optimize the display of the graph, there is only so much we can do. For largish networks (>2k nodes) dragging the graph around a lot can cause some performance issues, but there are a few things you can do to speed it up. +#### Close the tweaks panel + +At the time of writing (Aug 8) it is very much not optimized, and shifting between global and local mode or 2d or 3d is noticeably slower with the tweaks panel open than without. This will be fixed in a future release. + #### Use a Chromium based browser As much as it saddens us to say, Firefox's rendering engine is quite a bit slower than its Chromium cousins. Compare the performance of the two and see if that's the main issue first. diff --git a/components/config.ts b/components/config.ts index 2636b73..b48cbe4 100644 --- a/components/config.ts +++ b/components/config.ts @@ -20,15 +20,16 @@ export const initialPhysics = { collision: true, collisionStrength: 20, centering: true, - centeringStrength: 0.05, + centeringStrength: 0.2, linkStrength: 0.3, linkIts: 1, - alphaDecay: 0.1, + alphaDecay: 0.05, alphaTarget: 0, alphaMin: 0, velocityDecay: 0.25, gravity: 0.3, gravityOn: true, + gravityLocal: false, } export const initialFilter = { @@ -117,6 +118,7 @@ export const initialMouse = { highlight: 'hover', local: 'click', follow: 'double', + context: 'right', } export const colorList = [ diff --git a/components/tweaks.tsx b/components/tweaks.tsx index cc8b81e..26f1b60 100644 --- a/components/tweaks.tsx +++ b/components/tweaks.tsx @@ -45,7 +45,7 @@ import { } from '@chakra-ui/react' import { CUIAutoComplete } from 'chakra-ui-autocomplete' -import React, { useState, useContext, useEffect } from 'react' +import React, { useState, useContext, useEffect, useCallback } from 'react' import Scrollbars from 'react-custom-scrollbars-2' import { initialPhysics, @@ -58,6 +58,7 @@ import { } from './config' import { ThemeContext } from '../util/themecontext' +import { usePersistantState } from '../util/persistant-state' export interface TweakProps { physics: typeof initialPhysics @@ -95,9 +96,16 @@ export const Tweaks = (props: TweakProps) => { tagColors, setTagColors, } = props - const [showTweaks, setShowTweaks] = useState(true) + const [showTweaks, setShowTweaks] = usePersistantState('showTweaks', false) const { highlightColor, setHighlightColor } = useContext(ThemeContext) + const setVisualsCallback = useCallback((val) => setVisuals(val), []) + const setPhysicsCallback = useCallback((val: number, phys: string, scale: number) => { + setPhysics((curr: typeof initialPhysics) => { + return { ...curr, [phys]: val / scale } + }) + }, []) + return !showTweaks ? ( <Box position="absolute" @@ -125,6 +133,7 @@ export const Tweaks = (props: TweakProps) => { position="relative" boxShadow="xl" maxH={0.92 * globalThis.innerHeight} + marginBottom={10} > <Box display="flex" @@ -197,7 +206,9 @@ export const Tweaks = (props: TweakProps) => { <Text>Orphans</Text> <Switch onChange={() => { - setFilter({ ...filter, orphans: !filter.orphans }) + setFilter((curr: typeof initialFilter) => { + return { ...curr, orphans: !curr.orphans } + }) }} isChecked={filter.orphans} ></Switch> @@ -298,15 +309,26 @@ export const Tweaks = (props: TweakProps) => { value={physics.gravityOn} onChange={() => setPhysics({ ...physics, gravityOn: !physics.gravityOn })} > + <Flex justifyContent="space-between"> + <Text>Also in local</Text> + <Switch + onChange={() => { + setPhysics((curr: typeof initialPhysics) => { + return { ...curr, gravityLocal: !curr.gravityLocal } + }) + }} + isChecked={physics.gravityLocal} + ></Switch> + </Flex> <SliderWithInfo label="Strength" value={physics.gravity * 10} - onChange={(v) => setPhysics({ ...physics, gravity: v / 10 })} + onChange={(v: number) => setPhysicsCallback(v, 'gravity', 10)} /> </EnableSection> <SliderWithInfo value={-physics.charge / 100} - onChange={(value) => setPhysics({ ...physics, charge: -100 * value })} + onChange={(v) => setPhysicsCallback(v, 'gravity', -1 / 100)} label="Repulsive Force" /> <EnableSection @@ -317,20 +339,20 @@ export const Tweaks = (props: TweakProps) => { > <SliderWithInfo value={physics.collisionStrength / 5} - onChange={(value) => setPhysics({ ...physics, collisionStrength: value * 5 })} + onChange={(v) => setPhysicsCallback(v, 'collisionStrength', 1 / 5)} label="Collision Radius" infoText="Easy with this one, high values can lead to a real jiggly mess" /> </EnableSection> <SliderWithInfo value={physics.linkStrength * 5} - onChange={(value) => setPhysics({ ...physics, linkStrength: value / 5 })} + onChange={(v) => setPhysicsCallback(v, 'linkStrength', 5)} label="Link Force" /> <SliderWithInfo label="Link Iterations" value={physics.linkIts} - onChange={(value) => setPhysics({ ...physics, linkIts: value })} + onChange={(v) => setPhysicsCallback(v, 'linkIts', 1)} min={0} max={6} step={1} @@ -339,7 +361,7 @@ export const Tweaks = (props: TweakProps) => { <SliderWithInfo label="Viscosity" value={physics.velocityDecay * 10} - onChange={(value) => setPhysics({ ...physics, velocityDecay: value / 10 })} + onChange={(v) => setPhysicsCallback(v, 'velocityDecay', 10)} /> </VStack> <Box> @@ -361,7 +383,7 @@ export const Tweaks = (props: TweakProps) => { <SliderWithInfo label="Stabilization rate" value={physics.alphaDecay * 50} - onChange={(value) => setPhysics({ ...physics, alphaDecay: value / 50 })} + onChange={(v) => setPhysicsCallback(v, 'alphaDecay', 50)} /> <EnableSection label="Center nodes" @@ -374,7 +396,7 @@ export const Tweaks = (props: TweakProps) => { value={physics.centeringStrength} max={2} step={0.01} - onChange={(v) => setPhysics({ ...physics, centeringStrength: v })} + onChange={(v) => setPhysicsCallback(v, 'centeringStrength', 1)} /> </EnableSection> </VStack> @@ -445,7 +467,7 @@ export const Tweaks = (props: TweakProps) => { }} /> </Tooltip> - <Menu placement="right" closeOnSelect={false} matchWidth> + <Menu isLazy placement="right" closeOnSelect={false} matchWidth> <MenuButton width={20} as={Button} @@ -509,7 +531,7 @@ export const Tweaks = (props: TweakProps) => { </Flex> <Flex alignItems="center" justifyContent="space-between"> <Text>Links</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} colorScheme="" @@ -595,7 +617,7 @@ export const Tweaks = (props: TweakProps) => { </Flex> <Flex alignItems="center" justifyContent="space-between"> <Text>Accent</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} colorScheme="" @@ -637,32 +659,28 @@ export const Tweaks = (props: TweakProps) => { <ColorMenu colorList={colorList} label="Link highlight" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="linkHighlight" visValue={visuals.linkHighlight} /> <ColorMenu colorList={colorList} label="Node highlight" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="nodeHighlight" visValue={visuals.nodeHighlight} /> <ColorMenu colorList={colorList} label="Background" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="backgroundColor" visValue={visuals.backgroundColor} /> <ColorMenu colorList={colorList} label="Emacs node" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="emacsNodeColor" visValue={visuals.emacsNodeColor} /> @@ -744,24 +762,21 @@ export const Tweaks = (props: TweakProps) => { <ColorMenu colorList={colorList} label="Citation node color" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'citeNodeColor'} visValue={visuals.citeNodeColor} /> <ColorMenu colorList={colorList} label="Citation link color" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'citeLinkColor'} visValue={visuals.citeLinkColor} /> <ColorMenu colorList={colorList} label="Reference link highlight" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'citeLinkHighlightColor'} visValue={visuals.citeLinkHighlightColor} /> @@ -785,31 +800,28 @@ export const Tweaks = (props: TweakProps) => { <ColorMenu colorList={colorList} label="Reference node color" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'refNodeColor'} visValue={visuals.refNodeColor} /> <ColorMenu colorList={colorList} label="Reference link color" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'refLinkColor'} visValue={visuals.refLinkColor} /> <ColorMenu colorList={colorList} label="Reference link highlight" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value={'refLinkHighlightColor'} visValue={visuals.refLinkHighlightColor} /> <Box> <Flex alignItems="center" justifyContent="space-between"> <Text>Labels</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} colorScheme="" @@ -819,8 +831,8 @@ export const Tweaks = (props: TweakProps) => { {!visuals.labels ? 'Never' : visuals.labels < 2 - ? 'On Highlight' - : 'Always'} + ? 'On Highlight' + : 'Always'} </MenuButton> <Portal> {' '} @@ -869,16 +881,14 @@ export const Tweaks = (props: TweakProps) => { <ColorMenu colorList={colorList} label="Text" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="labelTextColor" visValue={visuals.labelTextColor} /> <ColorMenu colorList={colorList} label="Background" - visuals={visuals} - setVisuals={setVisuals} + setVisuals={setVisualsCallback} value="labelBackgroundColor" visValue={visuals.labelBackgroundColor} /> @@ -932,8 +942,8 @@ export const Tweaks = (props: TweakProps) => { <ColorMenu colorList={colorList} label="Arrow Color" - visuals={visuals} - setVisuals={setVisuals} + key="arrow" + setVisuals={setVisualsCallback} value="arrowsColor" visValue={visuals.arrowsColor} /> @@ -1045,7 +1055,7 @@ export const Tweaks = (props: TweakProps) => { <Text>Expand Node</Text> <InfoTooltip infoText="View only the node and its direct neighbors" /> </Flex> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} rightIcon={<ChevronDownIcon />} @@ -1077,7 +1087,7 @@ export const Tweaks = (props: TweakProps) => { </Flex> <Flex alignItems="center" justifyContent="space-between"> <Text>Open in Emacs</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} rightIcon={<ChevronDownIcon />} @@ -1111,7 +1121,7 @@ export const Tweaks = (props: TweakProps) => { </Flex> <Flex alignItems="center" justifyContent="space-between"> <Text>Follow Emacs by...</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} rightIcon={<ChevronDownIcon />} @@ -1136,37 +1146,35 @@ export const Tweaks = (props: TweakProps) => { </Portal> </Menu> </Flex> - {/* <Flex alignItems="center" justifyContent="space-between"> - <Flex> - <Text>Follow local graph</Text> - <InfoTooltip infoText="When in local mode and opening a node that already exists in Emacs, should I add that local graph or open the new one?" /> - </Flex> - <Menu placement="right"> - <MenuButton - as={Button} - rightIcon={<ChevronDownIcon />} - colorScheme="" - color="black" + <Flex alignItems="center" justifyContent="space-between"> + <Flex> + <Text>Local graph</Text> + <InfoTooltip infoText="When in local mode and clicking a new node, should I add that node's local graph or open the new one?" /> + </Flex> + <Menu isLazy placement="right"> + <MenuButton + as={Button} + rightIcon={<ChevronDownIcon />} + colorScheme="" + color="black" + > + <Text>{behavior.localSame === 'add' ? 'Add' : 'Replace'}</Text> + </MenuButton> + <Portal> + {' '} + <MenuList bgColor="gray.200" zIndex="popover"> + <MenuItem + onClick={() => setBehavior({ ...behavior, localSame: 'replace' })} > - <Text>{behavior.localSame === 'add' ? 'Add' : 'New'}</Text> - </MenuButton> - <Portal> - {' '} - <MenuList bgColor="gray.200" zIndex="popover"> - <MenuItem - onClick={() => setBehavior({ ...behavior, localSame: 'new' })} - > - Open that nodes graph - </MenuItem> - <MenuItem - onClick={() => setBehavior({ ...behavior, localSame: 'add' })} - > - Add node to local graph - </MenuItem> - </MenuList> - </Portal> - </Menu> - </Flex> */} + Open that nodes graph + </MenuItem> + <MenuItem onClick={() => setBehavior({ ...behavior, localSame: 'add' })}> + Add node to local graph + </MenuItem> + </MenuList> + </Portal> + </Menu> + </Flex> <SliderWithInfo label="Zoom speed" value={behavior.zoomSpeed} @@ -1225,7 +1233,7 @@ export const SliderWithInfo = ({ const { onChange, label, infoText } = rest const { highlightColor } = useContext(ThemeContext) return ( - <Box> + <Box key={label}> <Box display="flex" alignItems="flex-end"> <Text>{label}</Text> {infoText && <InfoTooltip infoText={infoText} />} @@ -1253,7 +1261,7 @@ export interface EnableSectionProps { export const EnableSection = (props: EnableSectionProps) => { const { value, onChange, label, infoText, children } = props return ( - <Box paddingTop={2}> + <Box paddingTop={2} key={label}> <Box display="flex" justifyContent="space-between" paddingBottom={2}> <Box display="flex" alignItems="center"> <Text>{label}</Text> @@ -1279,7 +1287,7 @@ export interface DropDownMenuProps { export const DropDownMenu = (props: DropDownMenuProps) => { const { textArray, onClickArray, displayValue } = props return ( - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} rightIcon={<ChevronDownIcon />}> {displayValue} </MenuButton> @@ -1287,7 +1295,7 @@ export const DropDownMenu = (props: DropDownMenuProps) => { {' '} <MenuList zIndex="popover"> {textArray.map((option, i) => { - ; <MenuItem onClick={onClickArray[i]}> {option} </MenuItem> + ;<MenuItem onClick={onClickArray[i]}> {option} </MenuItem> })} </MenuList> </Portal> @@ -1299,17 +1307,27 @@ export interface ColorMenuProps { label: string colorList: string[] value: string - visuals: typeof initialVisuals visValue: string setVisuals?: any } export const ColorMenu = (props: ColorMenuProps) => { - const { label, colorList, value, visuals, visValue, setVisuals } = props + const { label, colorList, value, visValue, setVisuals } = props + + const clickCallback = useCallback( + (color) => + setVisuals((curr: typeof initialVisuals) => { + return { + ...curr, + [value]: color, + } + }), + [], + ) return ( <Flex alignItems="center" justifyContent="space-between"> <Text>{label}</Text> - <Menu placement="right"> + <Menu isLazy placement="right"> <MenuButton as={Button} colorScheme="" color="black" rightIcon={<ChevronDownIcon />}> {<Box bgColor={visValue} borderRadius="sm" height={6} width={6}></Box>} </MenuButton> @@ -1317,7 +1335,7 @@ export const ColorMenu = (props: ColorMenuProps) => { {' '} <MenuList minW={10} zIndex="popover" bgColor="gray.200"> <MenuItem - onClick={() => setVisuals({ ...visuals, [value]: '' })} + onClick={() => clickCallback('')} justifyContent="space-between" alignItems="center" display="flex" @@ -1327,12 +1345,7 @@ export const ColorMenu = (props: ColorMenuProps) => { {colorList.map((color: string) => ( <MenuItem key={color} - onClick={() => - setVisuals({ - ...visuals, - [value]: color, - }) - } + onClick={() => clickCallback(color)} justifyContent="space-between" alignItems="center" display="flex" diff --git a/next.config.js b/next.config.js index 9f9dc66..49e3293 100644 --- a/next.config.js +++ b/next.config.js @@ -2,11 +2,12 @@ const fs = require('fs') const withPlugins = require('next-compose-plugins') const withPWA = require('next-pwa') +const withOrga = require('@orgajs/next') const d3packages = fs.readdirSync('node_modules').filter((name) => name.startsWith('d3-')) const withTM = require('next-transpile-modules')(d3packages) -module.exports = withPlugins([withTM, withPWA], { +module.exports = withPlugins([withTM, withPWA, withOrga], { distDir: 'build', pwa: { dest: 'build', diff --git a/org-roam-ui.el b/org-roam-ui.el index 3e722a4..e5497fb 100644 --- a/org-roam-ui.el +++ b/org-roam-ui.el @@ -241,7 +241,7 @@ loaded. Returns `ref' if an entry could not be found." (append head (list el) tail))) (defun org-roam-ui--citekey-to-ref (citekey) - "Convert a citekey property (most likely with a `cite:' prefix) to just a key + "Convert a CITEKY property (most likely with a `cite:' prefix) to just a key. This method is mostly taken from `org-roam-bibtex' see https://github.com/org-roam/org-roam-bibtex/blob/919ec8d837a7a3bd25232bdba17a0208efaefb2a/orb-utils.el#L289 but is has been adapted to operate on a sting instead of a node. Requires diff --git a/package.json b/package.json index 2a0e477..959dc14 100644 --- a/package.json +++ b/package.json @@ -15,22 +15,38 @@ "@emotion/react": "^11", "@emotion/styled": "^11", "@lilib/hooks": "^0.1.1", + "@orgajs/loader": "^2.4.9", + "@orgajs/next": "^2.4.9", + "@orgajs/react": "^2.4.9", + "@orgajs/reorg": "^2.4.9", + "@orgajs/reorg-rehype": "^2.4.9", "@react-hook/window-size": "^3.0.7", "@types/color": "^3.0.2", "chakra-ui-autocomplete": "^1.4.2", "d3-force-3d": "^3.0.2", "d3-interpolate": "^3.0.1", + "date-fns-tz": "^1.1.6", "es6-tween": "^5.5.11", "framer-motion": "^4", "next": "11.0.1", "next-pwa": "^5.2.24", + "orgast-util-to-string": "^0.3.0", + "orgast-util-visit-ids": "^0.3.0", "react": "17.0.2", "react-custom-scrollbars-2": "^4.4.0", "react-dom": "17.0.2", "react-force-graph": "^1.41.7", "react-spring": "^9.2.4", "reconnecting-websocket": "^4.4.0", + "rehype-stringify": "^9.0.1", "three-spritetext": "^1.6.2", + "unified": "^10.1.0", + "unified-stream": "^2.0.0", + "uniorg": "^0.3.0", + "uniorg-extract-keywords": "^0.3.0", + "uniorg-parse": "^0.3.0", + "uniorg-rehype": "^0.3.0", + "uniorg-slug": "^0.3.0", "use-constant": "^1.1.0" }, "devDependencies": { diff --git a/pages/index.tsx b/pages/index.tsx index d3d6a44..12c42a1 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -84,6 +84,10 @@ function normalizeLinkEnds(link: OrgRoamLink | LinkObject): [string, string] { } export function GraphPage() { + const [threeDim, setThreeDim] = usePersistantState('3d', false) + const [tagColors, setTagColors] = usePersistantState<TagColors>('tagCols', {}) + const [scope, setScope] = useState<Scope>({ nodeIds: [] }) + const [physics, setPhysics] = usePersistantState('physics', initialPhysics) const [filter, setFilter] = usePersistantState('filter', initialFilter) const [visuals, setVisuals] = usePersistantState('visuals', initialVisuals) @@ -102,7 +106,6 @@ export function GraphPage() { const updateGraphData = (orgRoamGraphData: OrgRoamGraphReponse) => { const currentGraphData = currentGraphDataRef.current const oldNodeById = nodeByIdRef.current - const oldLinksByNodeId = linksByNodeIdRef.current tagsRef.current = orgRoamGraphData.tags ?? [] const nodesByFile = orgRoamGraphData.nodes.reduce<NodesByFile>((acc, node) => { return { @@ -186,7 +189,6 @@ export function GraphPage() { const orgRoamGraphDataClone = JSON.parse( JSON.stringify(orgRoamGraphDataWithFileLinksAndBadNdes), ) - console.log(orgRoamGraphDataClone) currentGraphDataRef.current = orgRoamGraphDataClone setGraphData(orgRoamGraphDataClone) return @@ -203,7 +205,6 @@ export function GraphPage() { ...Object.keys(nodeByIdRef.current) .filter((id) => !oldNodeById[id]) .map((id) => { - console.log(id) return nodeByIdRef.current[id] as NodeObject }), ] @@ -215,49 +216,7 @@ export function GraphPage() { [id]: index, } }, {}) - console.log(newNodes) - console.log(nodeIndex) - /* const currentGraphIndexByLink = currentGraphData.links.reduce<{[key: string]: number}>((acc, link, index) => { -* const [source, target] = normalizeLinkEnds(link) -* const sourceTarget=source+target -* return { -* ...acc, -* [sourceTarget]: index -* } -},{}) */ - /* const newLinks = [ - * ...currentGraphData!.links.filter((link) => { - * const [source, target] = normalizeLinkEnds(link) - * if (!nodeByIdRef.current[source] || !nodeByIdRef.current[target]) { - * return false - * } - * if ( - * !linksByNodeIdRef.current[source]!.some( - * (link) => link.target === target || link.source === target, - * ) && - * !linksByNodeIdRef.current[target]!.some( - * (link) => link.target === source || link.source === source, - * ) - * ) { - * return false - * } - * return true - * }), - * ...Object.keys(linksByNodeIdRef.current).flatMap((id) => { - * if (!oldLinksByNodeId[id]!) { - * return linksByNodeIdRef.current![id!]! - * } - * return ( - * linksByNodeIdRef.current![id]!.filter((link) => { - * const [source, target] = normalizeLinkEnds(link) - * return !oldLinksByNodeId[id]!.some( - * (oldLink) => oldLink.source === source && oldLink.target === target, - * )! - * }) ?? [] - * ) - * }), - * ] - */ + const newerLinks = links.map((link) => { const [source, target] = normalizeLinkEnds(link) return { @@ -278,9 +237,6 @@ export function GraphPage() { const { setEmacsTheme } = useContext(ThemeContext) - const [threeDim, setThreeDim] = usePersistantState('3d', false) - const [tagColors, setTagColors] = usePersistantState<TagColors>('tagCols', {}) - const [scope, setScope] = useState<Scope>({ nodeIds: [] }) const scopeRef = useRef<Scope>({ nodeIds: [] }) const behaviorRef = useRef(initialBehavior) behaviorRef.current = behavior @@ -306,28 +262,28 @@ export function GraphPage() { ), ) if (command === 'zoom') { - console.log(sr) if (sr.nodeIds.length) { - console.log('emptying') - console.log('scope ' + sr.nodeIds) setScope({ nodeIds: [] }) } - setTimeout(() => fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]), 50) + setTimeout( + () => fg.zoomToFit(speed, padding, (node: NodeObject) => nodes[node.id as string]), + 50, + ) return } if (!sr.nodeIds.length) { setScope({ nodeIds: [emacsNode] }) setTimeout(() => { - /* fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]) */ - fg.centerAt(0, 0, speed) + fg.centerAt(0, 0, 10) + fg.zoomToFit(1, padding) }, 50) return } if (bh.localSame !== 'add') { setScope({ nodeIds: [emacsNode] }) setTimeout(() => { - /* fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]) */ - fg.centerAt(0, 0, speed) + fg.centerAt(0, 0, 10) + fg.zoomToFit(1, padding) }, 50) return } @@ -341,8 +297,8 @@ export function GraphPage() { ) { setScope({ nodeIds: [emacsNode] }) setTimeout(() => { - /* fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]) */ - fg.centerAt(0, 0, speed) + fg.centerAt(0, 0, 10) + fg.zoomToFit(1, padding) }, 50) return } @@ -350,10 +306,14 @@ export function GraphPage() { ...currentScope, nodeIds: [...currentScope.nodeIds, emacsNode as string], })) - setTimeout(() => fg.zoomToFit(speed, padding, (node: OrgRoamNode) => nodes[node.id!]), 50) + setTimeout(() => { + fg.centerAt(0, 0, 10) + fg.zoomToFit(1, padding) + }, 50) } useEffect(() => { + // initialize websocket WebSocketRef.current = new ReconnectingWebSocket('ws://localhost:35903') WebSocketRef.current.addEventListener('open', (event: any) => { console.log('Connection with Emacs established') @@ -394,6 +354,19 @@ export function GraphPage() { }) }, []) + useEffect(() => { + const fg = graphRef.current + if (!fg || scope.nodeIds.length > 1) { + return + } + if (!scope.nodeIds.length) { + return + } + setTimeout(() => { + fg.zoomToFit(5, 200) + }, 50) + }, [scope.nodeIds]) + if (!graphData) { return null } @@ -486,18 +459,21 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { const [hoverNode, setHoverNode] = useState<NodeObject | null>(null) + const [rightClickedNode, setRightClickedNode] = useState<OrgRoamNode | null>(null) + const [contextPos, setContextPos] = useState([0, 0]) + const theme = useTheme() const { emacsTheme } = useContext<ThemeContextProps>(ThemeContext) const handleLocal = (node: OrgRoamNode, add: string) => { - if (scope.nodeIds.includes(node.id as string)) { - return - } if (add === 'replace') { setScope({ nodeIds: [node.id] }) return } + if (scope.nodeIds.includes(node.id as string)) { + return + } setScope((currentScope: Scope) => ({ ...currentScope, nodeIds: [...currentScope.nodeIds, node.id as string], @@ -523,7 +499,13 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { sendMessageToEmacs('create', { id: node.id, title: node.title, ref: node.properties.ROAM_REFS }) } - const handleClick = (click: string, node: OrgRoamNode) => { + const openContextMenu = (node: OrgRoamNode, event: any) => { + setContextPos([event.pageX, event.pageY]) + setRightClickedNode(node) + onOpen() + } + + const handleClick = (click: string, node: OrgRoamNode, event: any) => { switch (click) { //mouse.highlight: case mouse.local: { @@ -534,18 +516,38 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { openNodeInEmacs(node) break } + case mouse.context: { + openContextMenu(node, event) + } default: break } } - const getNeighborNodes = (id: string) => { - const links = linksByNodeId[id]! ?? [] - return Object.fromEntries( - [id as string, ...links.flatMap((link) => [link.source, link.target])].map((nodeId) => [ - nodeId, - {}, - ]), - ) + const findNthNeighbors = (ids: string[], n: number) => { + let queue = [ids[0]] + let todo: string[] = [] + const completed = [ids[0]] + Array.from({ length: n }, () => { + queue.forEach((node) => { + const links = linksByNodeId[node as string] ?? [] + links.forEach((link) => { + const [sourceId, targetId] = normalizeLinkEnds(link) + if (!completed.includes(sourceId)) { + todo.push(sourceId) + return + } + if (!completed.includes(targetId)) { + todo.push(targetId) + return + } + return + }) + }) + queue = todo + todo.forEach((neighbor) => neighbor && completed.push(neighbor)) + todo = [] + }) + return completed } const centralHighlightedNode = useRef<NodeObject | null>(null) @@ -577,7 +579,6 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { }, [centralHighlightedNode.current, linksByNodeId]) const hiddenNodeIdsRef = useRef<NodeById>({}) - const filteredLinksByNodeId = useRef<LinksByNodeId>({}) const filteredGraphData = useMemo(() => { hiddenNodeIdsRef.current = {} const filteredNodes = graphData?.nodes @@ -638,57 +639,79 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { const filteredLinks = graphData.links.filter((link) => { const [sourceId, targetId] = normalizeLinkEnds(link) if ( - filter.bad || - filter.tagsBlacklist.length || - filter.tagsWhitelist.length || - filter.filelessCites + !filteredNodeIds.includes(sourceId as string) || + !filteredNodeIds.includes(targetId as string) ) { - return ( - filteredNodeIds.includes(sourceId as string) && - filteredNodeIds.includes(targetId as string) - ) + return false } const linkRoam = link as OrgRoamLink return filter.parents || linkRoam.type !== 'parent' }) - return { filteredNodes, filteredLinks } + return { nodes: filteredNodes, links: filteredLinks } }, [filter, graphData]) - const scopedGraphData = useMemo(() => { - const scopedNodes = filteredGraphData.filteredNodes.filter((node) => { - const links = linksByNodeId[node.id as string] ?? [] - return ( - scope.nodeIds.includes(node.id as string) || - links.some((link) => { - return scope.nodeIds.includes(link.source) || scope.nodeIds.includes(link.target) - }) - ) - }) + const [scopedGraphData, setScopedGraphData] = useState<GraphData>({ nodes: [], links: [] }) + useEffect(() => { + if (!scope.nodeIds.length) { + return + } + const oldScopedNodes = scope.nodeIds.length > 1 ? scopedGraphData.nodes : [] + const oldScopedNodeIds = oldScopedNodes.map((node) => node.id as string) + const neighbs = findNthNeighbors(scope.nodeIds, 1) + const newScopedNodes = filteredGraphData.nodes + .filter((node) => { + if (oldScopedNodes.length) { + if (oldScopedNodeIds.includes(node.id as string)) { + return false + } + const links = linksByNodeId[node.id as string] ?? [] + return links.some((link) => { + return scope.nodeIds.includes(link.source) || scope.nodeIds.includes(link.target) + }) + } + return neighbs.includes(node.id as string) + // this creates new nodes, to separate them from the nodes in the global graph + // and positions them in the center, so that the camera is not so jumpy + }) + .map((node) => { + return { ...node, x: 0, y: 0, vy: 0, vx: 0 } + }) + const scopedNodes = [...oldScopedNodes, ...newScopedNodes] const scopedNodeIds = scopedNodes.map((node) => node.id as string) - const scopedLinks = filteredGraphData.filteredLinks.filter((link) => { - // we need to cover both because force-graph modifies the original data - // but if we supply the original data on each render, the graph will re-render sporadically - const [sourceId, targetId] = normalizeLinkEnds(link) - return ( - scopedNodeIds.includes(sourceId as string) && scopedNodeIds.includes(targetId as string) - ) - }) - - return scope.nodeIds.length === 0 - ? { nodes: filteredGraphData.filteredNodes, links: filteredGraphData.filteredLinks } - : { - nodes: scopedNodes, - links: scopedLinks, + const oldScopedLinks = scope.nodeIds.length > 1 ? scopedGraphData.links : [] + const newScopedLinks = filteredGraphData.links + .filter((link) => { + // we need to cover both because force-graph modifies the original data + // but if we supply the original data on each render, the graph will re-render sporadically + const [sourceId, targetId] = normalizeLinkEnds(link) + if ( + oldScopedLinks.length && + oldScopedNodeIds.includes(targetId) && + oldScopedNodeIds.includes(sourceId) + ) { + return false } + return ( + scopedNodeIds.includes(sourceId as string) && scopedNodeIds.includes(targetId as string) + ) + }) + .map((link) => { + const [sourceId, targetId] = normalizeLinkEnds(link) + return { source: sourceId, target: targetId } + }) + + const scopedLinks = [...oldScopedLinks, ...newScopedLinks] + + setScopedGraphData({ nodes: scopedNodes, links: scopedLinks }) }, [filter, scope, graphData]) useEffect(() => { ;(async () => { const fg = graphRef.current const d3 = await d3promise - if (physics.gravityOn) { + if (physics.gravityOn && !(scope.nodeIds.length && !physics.gravityLocal)) { fg.d3Force('x', d3.forceX().strength(physics.gravity)) fg.d3Force('y', d3.forceY().strength(physics.gravity)) threeDim && fg.d3Force('z', d3.forceZ().strength(physics.gravity)) @@ -708,18 +731,18 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { physics.collision ? d3.forceCollide().radius(physics.collisionStrength) : null, ) })() - }, [physics]) + }, [physics, threeDim, scope]) // Normally the graph doesn't update when you just change the physics parameters // This forces the graph to make a small update when you do useEffect(() => { graphRef.current?.d3ReheatSimulation() - }, [physics]) + }, [physics, scope.nodeIds.length]) //shitty handler to check for doubleClicks const lastNodeClickRef = useRef(0) - const [opacity, setOpacity] = useState<number>(1) + const [opacity, setOpacity] = useState(1) const [fadeIn, cancel] = useAnimation((x) => setOpacity(x), { duration: visuals.animationSpeed, algorithm: algos[visuals.algorithmName], @@ -907,19 +930,13 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { const [dragging, setDragging] = useState(false) const { isOpen, onOpen, onClose } = useDisclosure() - const [rightClickedNode, setRightClickedNode] = useState<OrgRoamNode | null>(null) - const [contextPos, setContextPos] = useState([0, 0]) - const openContextMenu = (node: OrgRoamNode, event: any) => { - setContextPos([event.pageX, event.pageY]) - setRightClickedNode(node) - onOpen() - } const graphCommonProps: ComponentPropsWithoutRef<typeof TForceGraph2D> = { - graphData: scopedGraphData, + graphData: scope.nodeIds.length ? scopedGraphData : filteredGraphData, width: windowWidth, height: windowHeight, backgroundColor: theme.colors.gray[visuals.backgroundColor], + warmupTicks: scope.nodeIds.length === 1 ? 100 : 0, nodeLabel: (node) => (node as OrgRoamNode).title, nodeColor: (node) => { return getNodeColor(node as OrgRoamNode) @@ -1057,9 +1074,9 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { const isDoubleClick = event.timeStamp - lastNodeClickRef.current < 400 lastNodeClickRef.current = event.timeStamp if (isDoubleClick) { - return handleClick('double', node) + return handleClick('double', node, event) } - return handleClick('click', node) + return handleClick('click', node, event) }, onBackgroundClick: () => { onClose() @@ -1085,9 +1102,8 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { }, onNodeRightClick: (nodeArg, event) => { const node = nodeArg as OrgRoamNode - openContextMenu(node, event) - //handleClick('right', node) + handleClick('right', node, event) }, onNodeDrag: (node) => { onClose() diff --git a/util/persistant-state.ts b/util/persistant-state.ts index 5e7e35e..707c029 100644 --- a/util/persistant-state.ts +++ b/util/persistant-state.ts @@ -14,13 +14,16 @@ export function usePersistantState<V>( if (calculatedDefaultValue !== storageValue) { storage.update(calculatedDefaultValue) } - - const [value, setValue] = useState<V>(calculatedDefaultValue) + const calculatedDefaultValueObject = + typeof storageValue === 'object' + ? { ...storageValue, ...calculatedDefaultValue } + : calculatedDefaultValue + const [value, setValue] = useState<V>(calculatedDefaultValueObject) // change state gracefully when changing the storageKey useEffect(() => { - if (value !== calculatedDefaultValue) { - setValue(calculatedDefaultValue) + if (value !== calculatedDefaultValueObject) { + setValue(calculatedDefaultValueObject) } }, [storageKey]) const set = (newValueOrFn: V | ((v: V) => V)) => { @@ -1747,6 +1747,70 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@orgajs/estree-jsx@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/estree-jsx/-/estree-jsx-2.4.9.tgz#39b432dd8382fc4b1e4545ee2011390954325da7" + integrity sha512-CI8A94zg39awPPkuXGYKxIenDHN6fVz/Lw7ZiIAmU4s9qvFgsrhOfC05NHz0MPNaCbFOECz1kn1s46VYMEnlVg== + dependencies: + astring "^1.7.5" + +"@orgajs/loader@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/loader/-/loader-2.4.9.tgz#8515683e0c7f9a5230eb4b8aa74b7ccb03778d89" + integrity sha512-x7gSVXLdo5mSsAuCJpnekkzFW6BDOD2BP7A+2KRNyiM/l9soM/keR7eiQHNNplJ0bQD+5P0QrWI9pN7Pxfp1Pw== + dependencies: + "@orgajs/reorg" "^2.4.9" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + vfile-reporter "^6.0.2" + +"@orgajs/next@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/next/-/next-2.4.9.tgz#2fdf033d94e1d262721c6607b622b8463e7f6864" + integrity sha512-MJT/4M7WA24MChPlqCjIILixahixFkQBnwPuXQ3OQHRLgC9g1jYrUwpkeWxTcWuwSMlk1YiGhyFPKD2RyEpyaA== + dependencies: + "@orgajs/estree-jsx" "^2.4.9" + "@orgajs/rehype-estree" "^2.4.9" + "@orgajs/reorg-rehype" "^2.4.9" + +"@orgajs/react@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/react/-/react-2.4.9.tgz#9964480456236ce3bc2db5a1df8ee4452534562e" + integrity sha512-Kb7Ixt7QHLPaX3xSdWvOahg8AgIOlRLLLIOe4SWTVLDjUauRczSEfyaap40jhJ3SBCrd9HqX+q7P0jc3a3XXcA== + +"@orgajs/rehype-estree@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/rehype-estree/-/rehype-estree-2.4.9.tgz#60fc47ff0b95aacb4452032a573a62bf33aa1871" + integrity sha512-ihwF0zrMYLCJ8Yr7xmMA+LuasgIjvC/LlumnkTZegVwiVYbHncwUX/fOQ/0WPtXhMoqEFvvfLA/tW9hV5Ynu6w== + dependencies: + acorn "^8.4.1" + acorn-jsx "^5.3.1" + estree-walker "3.0.0" + hast-util-to-estree "^2.0.0" + periscopic "2.0.3" + +"@orgajs/reorg-parse@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/reorg-parse/-/reorg-parse-2.4.9.tgz#a586e49a87bae0ca9437427069f19f5c92ab8f54" + integrity sha512-txD1KtUCGh1GdpLbSBi33PV3C4BYdzIugDK8NHWV36WK8OpMRrbN4WaW1mmZmlp2MnkXML1vnDYA1x5u/UykEQ== + dependencies: + orga "^2.4.9" + +"@orgajs/reorg-rehype@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/reorg-rehype/-/reorg-rehype-2.4.9.tgz#72e6e297a3ae431a5b68da563d62218548b42228" + integrity sha512-76GzN+Wn1uAaqbqD9tFv6UTuRx/c3MeX4kfjXOY9mJpXxDi+5RFGoK7pWcVGkiec/pekCIFE/br8Dprz3aAqnA== + dependencies: + oast-to-hast "^2.4.9" + +"@orgajs/reorg@^2.4.9": + version "2.4.9" + resolved "https://registry.yarnpkg.com/@orgajs/reorg/-/reorg-2.4.9.tgz#eb33687562d099f679503cd03752967d239657b8" + integrity sha512-/g/H8dXmOGIfHq/02cc37PpwjbKUICfPKk6ZGzu/ZytmTyv66dwH1zzFNedFxLzFXhJeelT/KL/NroYYHi96Fw== + dependencies: + "@orgajs/reorg-parse" "^2.4.9" + unified "^9.1.0" + "@popperjs/[email protected]": version "2.4.4" resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.4.4.tgz" @@ -1990,11 +2054,28 @@ dependencies: "@types/d3-color" "*" +"@types/estree-jsx@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@types/estree-jsx/-/estree-jsx-0.0.1.tgz#c36d7a1afeb47a95a8ee0b7bc8bc705db38f919d" + integrity sha512-gcLAYiMfQklDCPjQegGn0TBAn9it05ISEsEhlKQUddIk7o2XDokOcTN7HBO8tznM0D9dGezvHEfRZBfZf6me0A== + dependencies: + "@types/estree" "*" + +"@types/estree@*": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + "@types/[email protected]": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== +"@types/estree@^0.0.46": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + "@types/glob@^7.1.1": version "7.1.4" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672" @@ -2003,6 +2084,13 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/hast@^2.0.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.2.tgz#236201acca9e2695e42f713d7dd4f151dc2982e4" + integrity sha512-Op5W7jYgZI7AWKY5wQ0/QNMzQM7dGQPyW1rXKNiymVCy5iTfdPuGu4HhYNOM2sIv8gUfIuIdcYlXmAepwaowow== + dependencies: + "@types/unist" "*" + "@types/[email protected]": version "2.2.6" resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" @@ -2100,6 +2188,11 @@ dependencies: source-map "^0.6.1" +"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": + 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/warning@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz" @@ -2190,6 +2283,11 @@ acorn@^7.4.0: resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.4.1: + version "8.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" + integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== + version "1.0.0" resolved "https://registry.npmjs.org/add-px-to-style/-/add-px-to-style-1.0.0.tgz" @@ -2417,6 +2515,11 @@ astral-regex@^2.0.0: resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +astring@^1.7.5: + version "1.7.5" + resolved "https://registry.yarnpkg.com/astring/-/astring-1.7.5.tgz#a7d47fceaf32b052d33a3d07c511efeec67447ca" + integrity sha512-lobf6RWXb8c4uZ7Mdq0U12efYmpD1UFnyOWVJPTa3ukqZrMopav+2hdNu0hgBF0JIBFK9QgrBDfwYvh3DFJDAA== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -2492,6 +2595,16 @@ [email protected]: resolved "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +bail@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" + integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== + +bail@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.1.tgz#d676736373a374058a935aec81b94c12ba815771" + integrity sha512-d5FoTAr2S5DSUPKl85WNm2yUwsINN8eidIdIwsOge2t33DaOfOdSmmsI11jMN3GmALCXaw+Y6HMVHDzePshFAA== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" @@ -2705,6 +2818,11 @@ cardboard-vr-display@^1.0.19: nosleep.js "^0.7.0" webvr-polyfill-dpdb "^1.0.17" +ccount@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.0.tgz#3d6fb55803832766a24c6f339abc507297eb5d25" + integrity sha512-VOR0NWFYX65n9gELQdcpqsie5L5ihBXuZGAgaPEp/U7IOSjnPMEH6geE+2f6lcekaNEfWzAHS45mPvSo5bqsUA== + chakra-ui-autocomplete@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/chakra-ui-autocomplete/-/chakra-ui-autocomplete-1.4.2.tgz#6fb5ed6ff3ec1c4a866e01a873bb50bb9c7479ad" @@ -2741,6 +2859,16 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +character-entities-html4@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.0.0.tgz#55fcf3ed00febfe41f8f6a5709d25ab8ed73a449" + integrity sha512-dwT2xh5ZhUAjyP96k57ilMKoTQyASaw9IAMR9U5c1lCu2RUni6O6jxfpUEdO2RcPT6TJFvr8pqsbami4Jk+2oA== + +character-entities-legacy@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-2.0.0.tgz#57f4d00974c696e8f74e9f493e7fcb75b44d7ee7" + integrity sha512-YwaEtEvWLpFa6Wh3uVLrvirA/ahr9fki/NUd/Bd4OR6EdJ8D22hovYQEOUCBfQfcqnC4IAMGMsHXY1eXgL4ZZA== + version "3.5.1" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" @@ -2806,6 +2934,16 @@ colorette@^1.2.2: resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +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" @@ -3160,6 +3298,11 @@ [email protected]: resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +date-fns-tz@^1.1.4, date-fns-tz@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.1.6.tgz#93cbf354e2aeb2cd312ffa32e462c1943cf20a8e" + integrity sha512-nyy+URfFI3KUY7udEJozcoftju+KduaqkVfwyTIE0traBiVye09QnyWKLZK7drRr5h9B7sPJITmQnS3U6YOdQg== + debounce@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" @@ -3353,6 +3496,11 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +"emoji-regex@>=6.0.0 <=6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" + integrity sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4= + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" @@ -3677,11 +3825,33 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== +estree-util-attach-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-2.0.0.tgz#2c06d484dfcf841b5946bcb84d5412cbcd544e22" + integrity sha512-kT9YVRvlt2ewPp9BazfIIgXMGsXOEpOm57bK8aa4F3eOEndMml2JAETjWaG3SZYHmC6axSNIzHGY718dYwIuVg== + dependencies: + "@types/estree" "^0.0.46" + +estree-util-is-identifier-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-2.0.0.tgz#e2d3d2ae3032c017b2112832bfc5d8ba938c8010" + integrity sha512-aXXZFVMnBBDRP81vS4YtAYJ0hUkgEsXea7lNKWCOeaAquGb1Jm2rcONPB5fpzwgbNxulTvrWuKnp9UElUGAKeQ== + + version "3.0.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.0.tgz#ca4b284de9dffb255288c76a44870b360faf14f9" + integrity sha512-s6ceX0NFiU/vKPiKvFdR83U1Zffu7upwZsGwpoqfg5rbbq1l50WQ5hCeIvM6E6oD4shUHCYMsiFPns4Jk0YfMQ== + estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -3705,6 +3875,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +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.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -3929,6 +4104,13 @@ get-own-enumerable-property-symbols@^3.0.0: resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== +github-slugger@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz#9bd0a95c5efdfc46005e82a906ef8e2a059124c9" + integrity sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q== + dependencies: + emoji-regex ">=6.0.0 <=6.1.1" + gl-preserve-state@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz" @@ -4050,6 +4232,69 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hast-util-is-element@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/hast-util-is-element/-/hast-util-is-element-2.1.1.tgz#863019a27400dc4f1aedfa4900627f42fd75c2b7" + integrity sha512-ag0fiZfRWsPiR1udvnSbaazJLGv8qd8E+/e3rW8rUZhbKG4HNJmFL4QkEceN+22BgE+uozXY30z/s+2dL6Z++g== + dependencies: + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hast-util-to-estree@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-estree/-/hast-util-to-estree-2.0.0.tgz#27f68728c6411f6345b8a3d1cf0065806feb451d" + integrity sha512-eqc7B513sHmadiTbgXqjD+WAJ9LC5YcInyH4LPtwt75huq6j5lmoHnI0ICElJHfZRIIwdzKYNw8Ygl1BGTwm4g== + dependencies: + "@types/estree-jsx" "^0.0.1" + "@types/hast" "^2.0.0" + "@types/unist" "^2.0.0" + comma-separated-tokens "^2.0.0" + estree-util-attach-comments "^2.0.0" + estree-util-is-identifier-name "^2.0.0" + hast-util-whitespace "^2.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + style-to-object "^0.3.0" + unist-util-position "^4.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-8.0.1.tgz#05d2f37ca7979f474f2d23536ea4655e91ceecef" + integrity sha512-S1mTqXvWVGIxrWw0xOHHvmevwCBFTRGNvXWsjE32IyEAlMhbMkK+ZuP6CAqkQ6Vb7swrehaHpfXHEI6voGDh0w== + 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.0" + 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== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" @@ -4086,6 +4331,11 @@ hosted-git-info@^2.1.4: resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +html-void-elements@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-2.0.0.tgz#ea71bae0dd33de675cdda3c4ace1bc7584bb1071" + integrity sha512-4OYzQQsBt0G9bJ/nM9/DDsjm4+fVdzAaPJJcWk5QwA3GIAPxQEeOR0rsI8HbDHQz5Gta8pVvGnnTNSbZVEVvkQ== + version "1.7.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" @@ -4184,6 +4434,11 @@ [email protected], inherits@~2.0.1: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + version "0.1.1" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" + integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== + inline-style-prefixer@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.0.tgz#f73d5dbf2855733d6b153a4d24b7b47a73e9770b" @@ -4248,6 +4503,11 @@ is-buffer@^1.0.2: resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +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-callable@^1.1.4, is-callable@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz" @@ -4344,6 +4604,23 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-plain-obj@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.0.0.tgz#06c0999fd7574edf5a906ba5644ad0feb3a84d22" + integrity sha512-NXRbBtUdBioI73y/HmOhogw/U5msYPC9DAtGkJXeFcFWSFZw0mCUsPxk/snTuJHzNKA8kLBK4rH97RMB1BfCXw== + +is-reference@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz" @@ -4599,6 +4876,15 @@ loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" @@ -4747,6 +5033,11 @@ mime@^1.3.4: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.4.4: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== + mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" @@ -5020,6 +5311,16 @@ nosleep.js@^0.7.0: resolved "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.7.0.tgz" integrity sha1-z9kZwlUjyg0PSmn7MwXAg62u4ok= +oast-to-hast@^2.4.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/oast-to-hast/-/oast-to-hast-2.4.9.tgz#97c89279299e0195b95a2f91ee09dbc734baa7a6" + integrity sha512-atdK9oyPJakXC/xvyIsogqNwBdudc/NaBfCKrUzW8SqI5PQ/E6eRw5mke4uC3D/R7hZY48AAigtwyLu12IHGcA== + dependencies: + mime "^2.4.4" + orga "^2.4.9" + prismjs "^1.17.1" + unist-builder "^2.0.3" + object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" @@ -5107,6 +5408,26 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +orga@^2.4.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/orga/-/orga-2.4.9.tgz#f9eeb2f2fb536f02025d63c6ee0b2c96c9a32e47" + integrity sha512-8YH/U3dvpaB1n97AXiHqEyAxlLJIZ4/IPiNJGOsv23LM5phbh1wvgLezuZlwGLlTkUq8gXjN5nQ5YW/d8BVQ3w== + dependencies: + date-fns-tz "^1.1.4" + text-kit "^2.4.9" + +orgast-util-to-string@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/orgast-util-to-string/-/orgast-util-to-string-0.3.0.tgz#7229577b9014e622ccca997583f53aae65969b4f" + integrity sha512-XNuxcLQDUYK1NfBLsLVMCichePNo6EPPZhhf/OpTo4l/ROm6pRSgl3VmgAkM0FiAeE044sqzqE20b6qAx2FXdQ== + +orgast-util-visit-ids@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/orgast-util-visit-ids/-/orgast-util-visit-ids-0.3.0.tgz#e23c6edc3c3a8df54ddf6adac09a2a8433893e1b" + integrity sha512-QpIoPzUXHEVqpfQ9ffD1i6oXyj7JHxl1SIXi/tlNVEH5jVukEdfoI+BTjipC4TnmvH2tfz2iJGlIgl+djv7yNQ== + dependencies: + unist-util-visit-parents "^3.1.1" + [email protected], os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" @@ -5294,6 +5615,14 @@ performance-now@^2.1.0: resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + version "2.0.3" + resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-2.0.3.tgz#326e16c46068172ca9a9d20af1a684cd0796fa99" + integrity sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw== + dependencies: + estree-walker "^2.0.2" + is-reference "^1.1.4" + phin@^2.9.1: version "2.9.3" resolved "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz" @@ -5415,6 +5744,11 @@ pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== +prismjs@^1.17.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.24.1.tgz#c4d7895c4d6500289482fa8936d9cdd192684036" + integrity sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -5444,6 +5778,18 @@ [email protected], prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.2, object-assign "^4.1.1" react-is "^16.8.1" +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +property-information@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.0.1.tgz#7c668d9f2b9cb63bc3e105d8b8dfee7221a17800" + integrity sha512-F4WUUAF7fMeF4/JUFHNBWDaKDXi2jbvqBW/y6o5wsf3j19wTZ7S60TmtB5HoBhtgw7NKQRMWuz5vk2PR0CygUg== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" @@ -5819,11 +6165,25 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" +rehype-stringify@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/rehype-stringify/-/rehype-stringify-9.0.1.tgz#0252218f10ea400ca5b3010256c6cb66e25485dd" + integrity sha512-xfhm8Erp7yL+RRgYmtZMJUqu6OSguwOQMfR2LkqT1dgNDQheClFMaDPVERy4/su7o0eHo0PKFGn4L68kOjVdRQ== + dependencies: + "@types/hast" "^2.0.0" + hast-util-to-html "^8.0.0" + unified "^10.0.0" + version "0.4.2" resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= +repeat-string@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" @@ -6127,6 +6487,16 @@ sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +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.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" @@ -6253,7 +6623,7 @@ [email protected]: resolved "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= -string-width@^4.2.0: +string-width@^4.0.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== @@ -6306,6 +6676,14 @@ string_decoder@^1.0.0, string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.1.tgz#f483c9ca8d7e029edec9863c5a37c1f1e7702c8d" + integrity sha512-gmMQxKXPWIO3NXNSPyWNhlYcBNGpPA/487D+9dLPnU4xBnIrnHdr8cv5rGJOS/1BRxEXRb7uKwg7BA36IWV7xg== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^2.0.0" + stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -6337,6 +6715,13 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-to-object@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" + integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== + dependencies: + inline-style-parser "0.1.1" + version "4.1.4" resolved "https://registry.npmjs.org/style-value-types/-/style-value-types-4.1.4.tgz" @@ -6391,6 +6776,13 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" +supports-color@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -6458,6 +6850,11 @@ terser@^5.0.0, terser@^5.7.0: source-map "~0.7.2" source-map-support "~0.5.19" +text-kit@^2.4.9: + version "2.4.9" + resolved "https://registry.yarnpkg.com/text-kit/-/text-kit-2.4.9.tgz#43e9c07fdce4e95b6b3baded04454fd890aa03f0" + integrity sha512-408J1prtNl4OT803h7KlTvO34RWaK6hj9UqxXaN0uP0/5i8xb4U1Saj5UNluTSxVfVl/xq7K9iq7t2zlmBSuFQ== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -6603,6 +7000,16 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +trough@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" + integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== + +trough@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/trough/-/trough-2.0.2.tgz#94a3aa9d5ce379fc561f6244905b3f36b7458d96" + integrity sha512-FnHq5sTMxC0sk957wHDzRnemFnNBvt/gSY99HzK8F7UP5WAbvP70yX5bd7CjEQkN+TjdxwI7g7lJ6podqrG2/w== + ts-easing@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" @@ -6709,6 +7116,77 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unified-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unified-stream/-/unified-stream-2.0.0.tgz#53172f26f6a478d1066114fb91b7cb1c96c9bb79" + integrity sha512-KdwODjgqGsTbHMLqm57qLxNAkbCboD5EMPC4BULs/9iy5ZTsw3xgc0BUjeCmABt/yfZt0k7rgkBLcdiZ8LwZug== + dependencies: + unified "^10.0.0" + vfile "^5.0.0" + +unified@^10.0.0, unified@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.0.tgz#4e65eb38fc2448b1c5ee573a472340f52b9346fe" + integrity sha512-4U3ru/BRXYYhKbwXV6lU6bufLikoAavTwev89H5UxY8enDFaAT2VXmIXYNm6hb5oHPng/EXr77PVyDFcptbk5g== + 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" + +unified@^9.1.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + +uniorg-extract-keywords@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/uniorg-extract-keywords/-/uniorg-extract-keywords-0.3.0.tgz#36670565968322be230eb9f96e7ddb328153fe9d" + integrity sha512-VM1XxhhaiEyfWu0EwZKRdUdRxIQMgFw1JdTxS5d9eOETjxb8PxuOPEvOcLIY2Shugy6/vg+OE+rPDoiWAI81jg== + dependencies: + unist-util-visit "^2.0.3" + +uniorg-parse@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/uniorg-parse/-/uniorg-parse-0.3.0.tgz#88f8cef53c741b44ef20602873e8c607f165aeee" + integrity sha512-5wGZy4UU8xyxDHnQK5QDY6pE+2sT6YeCaGvHBTwpiSEXdcu+OMgSUIELRchMd8WptraWILl7VSE5gb3pKtGEuQ== + dependencies: + unist-builder "^2.0.3" + vfile "^4.2.1" + vfile-location "^3.2.0" + +uniorg-rehype@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/uniorg-rehype/-/uniorg-rehype-0.3.0.tgz#4218b377fef6055017a3dcfe7bfd959fd50948a1" + integrity sha512-PuU9fEx0SDB7hmLPErzEtGoZhsUpuF+432gT1DuNYG63SfPNWg5JFkO8LgHIAvNA+eAfcCZq8Ps4xe+mM2+7yw== + dependencies: + hastscript "^6.0.0" + unist-builder "^2.0.3" + +uniorg-slug@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/uniorg-slug/-/uniorg-slug-0.3.0.tgz#a67ad0e0b8b2b2c8a25f484f32a60250bcf3fdec" + integrity sha512-IOSdiOYa+URF3QWHkWKRWZXFrRykq7lcUKnDjJkKIDlphfg9EGEkxVkphM43wZQSibxiqmAZlE5wYquf8BtapQ== + dependencies: + github-slugger "^1.3.0" + orgast-util-to-string "^0.3.0" + unist-util-visit "^2.0.3" + +uniorg@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/uniorg/-/uniorg-0.3.0.tgz#a91f42cd653d036008ae02e4cc3c7bc30803382d" + integrity sha512-efkRhOYouDPjNP48vEM+jy2O6wUGl/GqCxcE7XjuqdC3dWFqppMNwN9FJGJ3ere9zW6zb2MthUaMMWbuC26uoQ== + unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -6716,6 +7194,57 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-builder@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" + integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== + +unist-util-is@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" + integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== + +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.1" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-4.0.1.tgz#f8484b2da19a897a0180556d160c28633070dbb9" + integrity sha512-mgy/zI9fQ2HlbOtTdr2w9lhVaiFUHWQnZrFF2EUoVOqtAUdzqMtNiD99qA5a1IcjWVR8O6aVYE9u7Z2z1v0SQA== + +unist-util-stringify-position@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" + integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== + dependencies: + "@types/unist" "^2.0.2" + +unist-util-stringify-position@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.0.tgz#d517d2883d74d0daa0b565adc3d10a02b4a8cde9" + integrity sha512-SdfAl8fsDclywZpfMDTVDxA2V7LjtRDTOFd44wUJamgl6OlVngsqWjxvermMYf60elWHbxhuRCZml7AnuXCaSA== + dependencies: + "@types/unist" "^2.0.0" + +unist-util-visit-parents@^3.0.0, unist-util-visit-parents@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" + integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + +unist-util-visit@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" + integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -6820,6 +7349,69 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +vfile-location@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" + integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== + +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + +vfile-message@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-3.0.1.tgz#b9bcf87cb5525e61777e0c6df07e816a577588a3" + integrity sha512-gYmSHcZZUEtYpTmaWaFJwsuUD70/rTY4v09COp8TGtOkix6gGxb/a8iTQByIY9ciTk9GwAwIXd/J9OPfM4Bvaw== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^3.0.0" + +vfile-reporter@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-6.0.2.tgz#cbddaea2eec560f27574ce7b7b269822c191a676" + integrity sha512-GN2bH2gs4eLnw/4jPSgfBjo+XCuvnX9elHICJZjVD4+NM0nsUrMTvdjGY5Sc/XG69XVTgLwj7hknQVc6M9FukA== + dependencies: + repeat-string "^1.5.0" + string-width "^4.0.0" + supports-color "^6.0.0" + unist-util-stringify-position "^2.0.0" + vfile-sort "^2.1.2" + vfile-statistics "^1.1.0" + +vfile-sort@^2.1.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/vfile-sort/-/vfile-sort-2.2.2.tgz#720fe067ce156aba0b411a01bb0dc65596aa1190" + integrity sha512-tAyUqD2R1l/7Rn7ixdGkhXLD3zsg+XLAeUDUhXearjfIcpL1Hcsj5hHpCoy/gvfK/Ws61+e972fm0F7up7hfYA== + +vfile-statistics@^1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-1.1.4.tgz#b99fd15ecf0f44ba088cc973425d666cb7a9f245" + integrity sha512-lXhElVO0Rq3frgPvFBwahmed3X03vjPF8OcjKMy8+F1xU/3Q3QU3tKEDp743SFtb74PdF0UWpxPvtOP0GCLheA== + +vfile@^4.0.0, vfile@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" + integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + +vfile@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-5.0.2.tgz#57773d1d91478b027632c23afab58ec3590344f0" + integrity sha512-5cV+K7tX83MT3bievROc+7AvHv0GXDB0zqbrTjbOe+HRbkzvY4EP+wS3IR77kUBCoWFMdG9py18t0sesPtQ1Rw== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + unist-util-stringify-position "^3.0.0" + vfile-message "^3.0.0" + [email protected], vm-browserify@^1.0.1: version "1.1.2" resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" @@ -7147,3 +7739,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 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== |