From 5b750a8bc321a40f26ce18c8d3d8fb8f4106359a Mon Sep 17 00:00:00 2001 From: "Thomas F. K. Jorna" Date: Sun, 8 Aug 2021 23:48:37 +0200 Subject: feat: much smoother local mode --- README.md | 4 + components/config.ts | 6 +- components/tweaks.tsx | 193 ++++++++------- next.config.js | 3 +- org-roam-ui.el | 2 +- package.json | 16 ++ pages/index.tsx | 260 ++++++++++---------- util/persistant-state.ts | 11 +- yarn.lock | 599 ++++++++++++++++++++++++++++++++++++++++++++++- 9 files changed, 873 insertions(+), 221 deletions(-) diff --git a/README.md b/README.md index 0ba6734..159f90e 100644 --- a/README.md +++ b/README.md @@ -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 ? ( { position="relative" boxShadow="xl" maxH={0.92 * globalThis.innerHeight} + marginBottom={10} > { Orphans { - setFilter({ ...filter, orphans: !filter.orphans }) + setFilter((curr: typeof initialFilter) => { + return { ...curr, orphans: !curr.orphans } + }) }} isChecked={filter.orphans} > @@ -298,15 +309,26 @@ export const Tweaks = (props: TweakProps) => { value={physics.gravityOn} onChange={() => setPhysics({ ...physics, gravityOn: !physics.gravityOn })} > + + Also in local + { + setPhysics((curr: typeof initialPhysics) => { + return { ...curr, gravityLocal: !curr.gravityLocal } + }) + }} + isChecked={physics.gravityLocal} + > + setPhysics({ ...physics, gravity: v / 10 })} + onChange={(v: number) => setPhysicsCallback(v, 'gravity', 10)} /> setPhysics({ ...physics, charge: -100 * value })} + onChange={(v) => setPhysicsCallback(v, 'gravity', -1 / 100)} label="Repulsive Force" /> { > 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" /> setPhysics({ ...physics, linkStrength: value / 5 })} + onChange={(v) => setPhysicsCallback(v, 'linkStrength', 5)} label="Link Force" /> 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) => { setPhysics({ ...physics, velocityDecay: value / 10 })} + onChange={(v) => setPhysicsCallback(v, 'velocityDecay', 10)} /> @@ -361,7 +383,7 @@ export const Tweaks = (props: TweakProps) => { setPhysics({ ...physics, alphaDecay: value / 50 })} + onChange={(v) => setPhysicsCallback(v, 'alphaDecay', 50)} /> { value={physics.centeringStrength} max={2} step={0.01} - onChange={(v) => setPhysics({ ...physics, centeringStrength: v })} + onChange={(v) => setPhysicsCallback(v, 'centeringStrength', 1)} /> @@ -445,7 +467,7 @@ export const Tweaks = (props: TweakProps) => { }} /> - + { Links - + { Accent - + { @@ -744,24 +762,21 @@ export const Tweaks = (props: TweakProps) => { @@ -785,31 +800,28 @@ export const Tweaks = (props: TweakProps) => { Labels - + { {!visuals.labels ? 'Never' : visuals.labels < 2 - ? 'On Highlight' - : 'Always'} + ? 'On Highlight' + : 'Always'} {' '} @@ -869,16 +881,14 @@ export const Tweaks = (props: TweakProps) => { @@ -932,8 +942,8 @@ export const Tweaks = (props: TweakProps) => { @@ -1045,7 +1055,7 @@ export const Tweaks = (props: TweakProps) => { Expand Node - + } @@ -1077,7 +1087,7 @@ export const Tweaks = (props: TweakProps) => { Open in Emacs - + } @@ -1111,7 +1121,7 @@ export const Tweaks = (props: TweakProps) => { Follow Emacs by... - + } @@ -1136,37 +1146,35 @@ export const Tweaks = (props: TweakProps) => { - {/* - - Follow local graph - - - - } - colorScheme="" - color="black" + + + Local graph + + + + } + colorScheme="" + color="black" + > + {behavior.localSame === 'add' ? 'Add' : 'Replace'} + + + {' '} + + setBehavior({ ...behavior, localSame: 'replace' })} > - {behavior.localSame === 'add' ? 'Add' : 'New'} - - - {' '} - - setBehavior({ ...behavior, localSame: 'new' })} - > - Open that nodes graph - - setBehavior({ ...behavior, localSame: 'add' })} - > - Add node to local graph - - - - - */} + Open that nodes graph + + setBehavior({ ...behavior, localSame: 'add' })}> + Add node to local graph + + + + + + {label} {infoText && } @@ -1253,7 +1261,7 @@ export interface EnableSectionProps { export const EnableSection = (props: EnableSectionProps) => { const { value, onChange, label, infoText, children } = props return ( - + {label} @@ -1279,7 +1287,7 @@ export interface DropDownMenuProps { export const DropDownMenu = (props: DropDownMenuProps) => { const { textArray, onClickArray, displayValue } = props return ( - + }> {displayValue} @@ -1287,7 +1295,7 @@ export const DropDownMenu = (props: DropDownMenuProps) => { {' '} {textArray.map((option, i) => { - ; {option} + ; {option} })} @@ -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 ( {label} - + }> {} @@ -1317,7 +1335,7 @@ export const ColorMenu = (props: ColorMenuProps) => { {' '} 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) => ( - 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('tagCols', {}) + const [scope, setScope] = useState({ 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((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('tagCols', {}) - const [scope, setScope] = useState({ nodeIds: [] }) const scopeRef = useRef({ 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(null) + const [rightClickedNode, setRightClickedNode] = useState(null) + const [contextPos, setContextPos] = useState([0, 0]) + const theme = useTheme() const { emacsTheme } = useContext(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(null) @@ -577,7 +579,6 @@ export const Graph = forwardRef(function (props: GraphProps, graphRef: any) { }, [centralHighlightedNode.current, linksByNodeId]) const hiddenNodeIdsRef = useRef({}) - const filteredLinksByNodeId = useRef({}) 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({ 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(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(null) - const [contextPos, setContextPos] = useState([0, 0]) - const openContextMenu = (node: OrgRoamNode, event: any) => { - setContextPos([event.pageX, event.pageY]) - setRightClickedNode(node) - onOpen() - } const graphCommonProps: ComponentPropsWithoutRef = { - 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( if (calculatedDefaultValue !== storageValue) { storage.update(calculatedDefaultValue) } - - const [value, setValue] = useState(calculatedDefaultValue) + const calculatedDefaultValueObject = + typeof storageValue === 'object' + ? { ...storageValue, ...calculatedDefaultValue } + : calculatedDefaultValue + const [value, setValue] = useState(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)) => { diff --git a/yarn.lock b/yarn.lock index 4126899..83f405c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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/core@2.4.4": 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/estree@0.0.39": 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/js-cookie@2.2.6": 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== + add-px-to-style@1.0.0: 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 @@ babel-plugin-syntax-jsx@6.18.0: 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== + chokidar@3.5.1: 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 @@ data-uri-to-buffer@3.0.1: 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== + +estree-walker@3.0.0: + 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" + he@1.2.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== + http-errors@1.7.3: version "1.7.3" resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" @@ -4184,6 +4434,11 @@ inherits@2.0.3, inherits@~2.0.1: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inline-style-parser@0.1.1: + 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" + os-browserify@0.3.0, 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= +periscopic@2.0.3: + 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 @@ prop-types@15.7.2, 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" + remove-accents@0.4.2: 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 @@ string-hash@1.1.3: 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" + style-value-types@4.1.4: 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" + vm-browserify@1.1.2, 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== -- cgit v1.2.3