From 5d8cba0dddf69c5b2f4e4e1f5e45989e5476743d Mon Sep 17 00:00:00 2001 From: Morten Olsen Date: Tue, 26 Sep 2023 21:14:31 +0200 Subject: [PATCH] docs: improved webpage --- .npmrc | 1 - packages/algorithm/src/index.ts | 2 +- packages/algorithm/src/plugins/index.ts | 5 + packages/algorithm/src/types/plugin.ts | 13 +- packages/algorithm/src/types/utils.ts | 17 ++ packages/playground/index.html | 3 +- packages/playground/package.json | 2 + packages/playground/src/app.tsx | 10 +- .../src/components/content/index.tsx | 13 ++ .../playground/src/components/frame/index.tsx | 41 ++++ .../containers/experiment/find-node/index.tsx | 97 +++++++++ .../src/containers/experiment/graph.tsx | 32 +++ .../src/containers/experiment/index.tsx | 38 ++-- .../src/containers/experiment/input/index.tsx | 116 ++++++++++ .../src/containers/experiment/node.tsx | 26 --- .../containers/experiment/node/details.tsx | 46 ++++ .../src/containers/experiment/node/index.tsx | 44 ++++ .../src/containers/experiment/nodes.tsx | 23 -- .../src/containers/experiment/stats/index.tsx | 17 ++ .../src/containers/experiment/view.tsx | 30 ++- .../playground/src/containers/page/index.tsx | 15 ++ .../playground/src/containers/page/page.tsx | 38 ++++ .../experiments/capabilities/experiment.ts | 163 ++++++++++++++ .../src/experiments/capabilities/index.tsx | 16 +- .../src/experiments/capabilities/script.ts | 181 ---------------- .../src/experiments/capabilities/view.mdx | 3 + .../src/experiments/hello/index.tsx | 12 -- .../src/experiments/hello/script.ts | 153 ------------- .../src/experiments/realistic/experiment.ts | 204 ++++++++++++++++++ .../src/experiments/realistic/index.tsx | 9 + .../src/features/experiment/context.tsx | 24 ++- .../src/features/experiment/create.tsx | 15 -- .../src/features/experiment/hooks.ts | 12 +- .../src/features/experiment/index.ts | 2 - .../src/features/experiment/types.ts | 9 + .../src/features/experiment/worker.ts | 55 +++-- .../playground/src/{main.css => index.css} | 7 + packages/playground/src/main.tsx | 1 - packages/playground/src/pages/experiments.tsx | 53 +++++ packages/playground/src/pages/index.tsx | 5 + .../playground/src/presenters/graph/index.tsx | 90 ++++---- .../playground/src/presenters/graph/plan.tsx | 76 ------- .../src/presenters/horizontal-plan/index.tsx | 90 ++++++++ .../playground/src/presenters/plan/index.tsx | 96 ++++----- packages/playground/src/router/index.tsx | 18 ++ packages/playground/src/utils/experiments.ts | 8 - packages/playground/src/utils/graph.ts | 8 +- packages/playground/src/utils/time.ts | 6 + packages/playground/tailwind.config.js | 6 +- packages/playground/tsconfig.node.tsbuildinfo | 1 - packages/playground/vite.config.d.ts | 2 - packages/playground/vite.config.js | 8 +- packages/playground/vite.config.ts | 11 - pnpm-lock.yaml | 78 +++++++ 54 files changed, 1358 insertions(+), 693 deletions(-) create mode 100644 packages/algorithm/src/types/utils.ts create mode 100644 packages/playground/src/components/content/index.tsx create mode 100644 packages/playground/src/components/frame/index.tsx create mode 100644 packages/playground/src/containers/experiment/find-node/index.tsx create mode 100644 packages/playground/src/containers/experiment/graph.tsx create mode 100644 packages/playground/src/containers/experiment/input/index.tsx delete mode 100644 packages/playground/src/containers/experiment/node.tsx create mode 100644 packages/playground/src/containers/experiment/node/details.tsx create mode 100644 packages/playground/src/containers/experiment/node/index.tsx delete mode 100644 packages/playground/src/containers/experiment/nodes.tsx create mode 100644 packages/playground/src/containers/experiment/stats/index.tsx create mode 100644 packages/playground/src/containers/page/index.tsx create mode 100644 packages/playground/src/containers/page/page.tsx create mode 100644 packages/playground/src/experiments/capabilities/experiment.ts delete mode 100644 packages/playground/src/experiments/capabilities/script.ts create mode 100644 packages/playground/src/experiments/capabilities/view.mdx delete mode 100644 packages/playground/src/experiments/hello/index.tsx delete mode 100644 packages/playground/src/experiments/hello/script.ts create mode 100644 packages/playground/src/experiments/realistic/experiment.ts create mode 100644 packages/playground/src/experiments/realistic/index.tsx delete mode 100644 packages/playground/src/features/experiment/create.tsx create mode 100644 packages/playground/src/features/experiment/types.ts rename packages/playground/src/{main.css => index.css} (53%) create mode 100644 packages/playground/src/pages/experiments.tsx create mode 100644 packages/playground/src/pages/index.tsx delete mode 100644 packages/playground/src/presenters/graph/plan.tsx create mode 100644 packages/playground/src/presenters/horizontal-plan/index.tsx create mode 100644 packages/playground/src/router/index.tsx delete mode 100644 packages/playground/src/utils/experiments.ts create mode 100644 packages/playground/src/utils/time.ts delete mode 100644 packages/playground/tsconfig.node.tsbuildinfo delete mode 100644 packages/playground/vite.config.d.ts delete mode 100644 packages/playground/vite.config.ts diff --git a/.npmrc b/.npmrc index 50b16cf..b0d8be6 100644 --- a/.npmrc +++ b/.npmrc @@ -1,4 +1,3 @@ -node-linker=hoisted public-hoist-pattern[]=*@nextui-org/* store-dir=.pnpm-store diff --git a/packages/algorithm/src/index.ts b/packages/algorithm/src/index.ts index f12f41f..9369dc8 100644 --- a/packages/algorithm/src/index.ts +++ b/packages/algorithm/src/index.ts @@ -5,4 +5,4 @@ export { type CalulationResult, type PlanableWithPlugins, } from './algorithm/calulation'; -export { plugins } from './plugins/index'; +export { plugins, type AllPlugins } from './plugins'; diff --git a/packages/algorithm/src/plugins/index.ts b/packages/algorithm/src/plugins/index.ts index c3239ed..64d3e26 100644 --- a/packages/algorithm/src/plugins/index.ts +++ b/packages/algorithm/src/plugins/index.ts @@ -7,4 +7,9 @@ const plugins = { capabilities, } satisfies Record Plugin>; +type AllPlugins = { + [K in keyof typeof plugins]: ReturnType<(typeof plugins)[K]>; +}; + +export type { AllPlugins }; export { plugins }; diff --git a/packages/algorithm/src/types/plugin.ts b/packages/algorithm/src/types/plugin.ts index 6a4a1b4..bbb41ad 100644 --- a/packages/algorithm/src/types/plugin.ts +++ b/packages/algorithm/src/types/plugin.ts @@ -1,3 +1,4 @@ +import { Expand, UnionToIntersection } from '../types/utils'; import { GraphNode } from './node'; import { Planable } from './planable'; @@ -20,16 +21,20 @@ type Plugin = { type Plugins = Record; -type PluginAttributes = { +type PluginAttributes = MergeRecords<{ [K in keyof TPlugins]: TPlugins[K] extends Plugin ? TAttributes : never; -}[keyof TPlugins]; +}>; -type PluginContext = { +type MergeRecords> = Expand< + UnionToIntersection +>; + +type PluginContext = MergeRecords<{ [K in keyof TPlugins]: TPlugins[K] extends Plugin ? TContext : never; -}[keyof TPlugins]; +}>; export type { Plugin, Plugins, PluginAttributes, PluginContext }; diff --git a/packages/algorithm/src/types/utils.ts b/packages/algorithm/src/types/utils.ts new file mode 100644 index 0000000..70e00fe --- /dev/null +++ b/packages/algorithm/src/types/utils.ts @@ -0,0 +1,17 @@ +// expands object types one level deep +type Expand = T extends infer O ? { [K in keyof O]: O[K] } : never; + +// expands object types recursively +type ExpandRecursively = T extends object + ? T extends infer O + ? { [K in keyof O]: ExpandRecursively } + : never + : T; + +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( + k: infer I, +) => void + ? I + : never; + +export type { Expand, ExpandRecursively, UnionToIntersection }; diff --git a/packages/playground/index.html b/packages/playground/index.html index 7e6449b..e6bd802 100644 --- a/packages/playground/index.html +++ b/packages/playground/index.html @@ -3,9 +3,10 @@ + Vite + React + TS - +
diff --git a/packages/playground/package.json b/packages/playground/package.json index 6beab3a..a75cea7 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -16,6 +16,8 @@ "framer-motion": "^10.16.4", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-json-tree": "^0.18.0", + "react-router-dom": "^6.16.0", "tailwindcss": "^3.3.3" }, "devDependencies": { diff --git a/packages/playground/src/app.tsx b/packages/playground/src/app.tsx index d43d42d..64658c1 100644 --- a/packages/playground/src/app.tsx +++ b/packages/playground/src/app.tsx @@ -1,11 +1,13 @@ import { NextUIProvider } from '@nextui-org/react'; -import { Page } from './containers/experiment'; +import { Router } from './router'; const App: React.FC = () => { return ( - - - +
+ + + +
); }; diff --git a/packages/playground/src/components/content/index.tsx b/packages/playground/src/components/content/index.tsx new file mode 100644 index 0000000..5a0025b --- /dev/null +++ b/packages/playground/src/components/content/index.tsx @@ -0,0 +1,13 @@ +type ContentProps = { + children: React.ReactNode; +}; + +const Content: React.FC = ({ children }) => { + return ( +
+
{children}
+
+ ); +}; + +export { Content }; diff --git a/packages/playground/src/components/frame/index.tsx b/packages/playground/src/components/frame/index.tsx new file mode 100644 index 0000000..f049444 --- /dev/null +++ b/packages/playground/src/components/frame/index.tsx @@ -0,0 +1,41 @@ +import { + Navbar, + NavbarBrand, + NavbarContent, + NavbarItem, + Link, +} from '@nextui-org/react'; +import { Link as RouterLink } from 'react-router-dom'; + +type FrameProps = { + children: React.ReactNode; +}; + +const Frame = ({ children }: FrameProps) => { + return ( +
+ + + +

Bob

+
+
+ + + + Home + + + + + Experiments + + + +
+
{children}
+
+ ); +}; + +export { Frame }; diff --git a/packages/playground/src/containers/experiment/find-node/index.tsx b/packages/playground/src/containers/experiment/find-node/index.tsx new file mode 100644 index 0000000..8f3014d --- /dev/null +++ b/packages/playground/src/containers/experiment/find-node/index.tsx @@ -0,0 +1,97 @@ +import { + Button, + Modal, + ModalBody, + ModalContent, + ModalHeader, + useDisclosure, + Badge, + Checkbox, + Input, +} from '@nextui-org/react'; +import { useMemo, useState } from 'react'; +import { useExperimentResult } from '../../../features/experiment'; +import { useSelectNode } from '../../../features/experiment/hooks'; +import { GraphNode } from '@bob-the-algorithm/core'; + +const FindNodeView = () => { + const data = useExperimentResult(); + const { isOpen, onOpen, onOpenChange } = useDisclosure(); + const [completed, setCompleted] = useState(true); + const [text, setText] = useState(''); + const selectNode = useSelectNode(); + + const nodes = useMemo(() => { + if (!data) { + return []; + } + let result = [...data.nodes]; + if (completed) { + result = result.filter((node) => node.completed); + } + if (text) { + result = result.filter((node) => node.id === text); + } + return result.sort((a, b) => b.score - a.score).slice(0, 10); + }, [data, completed, text]); + + const getColor = (node: GraphNode) => { + if (node.completed) { + return 'success'; + } + if (node.deadEnd) { + return 'danger'; + } + return 'primary'; + }; + + return ( + <> + + + + {(close) => ( + <> + Nodes + + + + Completed + +
+ {nodes.map((node) => ( + + + + ))} +
+
+ + )} +
+
+ + ); +}; + +export { FindNodeView }; diff --git a/packages/playground/src/containers/experiment/graph.tsx b/packages/playground/src/containers/experiment/graph.tsx new file mode 100644 index 0000000..6d229c2 --- /dev/null +++ b/packages/playground/src/containers/experiment/graph.tsx @@ -0,0 +1,32 @@ +import { + Modal, + ModalContent, + ModalHeader, + ModalBody, + Button, + useDisclosure, +} from '@nextui-org/react'; +import { Graph } from '../../presenters/graph'; + +const GraphView = () => { + const { isOpen, onOpen, onOpenChange } = useDisclosure(); + return ( + <> + + + + {() => ( + <> + Graph + + + + + )} + + + + ); +}; + +export { GraphView }; diff --git a/packages/playground/src/containers/experiment/index.tsx b/packages/playground/src/containers/experiment/index.tsx index 5631012..b350006 100644 --- a/packages/playground/src/containers/experiment/index.tsx +++ b/packages/playground/src/containers/experiment/index.tsx @@ -1,18 +1,18 @@ import { useEffect, useState } from 'react'; -import { experiments } from '../../utils/experiments'; import { ExperimentProvider } from '../../features/experiment/context'; import { ExperimentView } from './view'; +import { ExperimentInfo } from '../../features/experiment/types'; type PageProps = { - slug: string; + content: () => Promise<{ default: Experiment }>; }; type Experiment = { - worker: () => Worker; - view: React.ReactElement; + info: ExperimentInfo; + view: React.ComponentType; }; -const Page: React.FC = ({ slug }) => { +const ExperimentPage: React.FC = ({ content }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(); const [experiment, setExperiment] = useState(); @@ -22,11 +22,9 @@ const Page: React.FC = ({ slug }) => { setError(undefined); const load = async () => { try { - const page = experiments.find((page) => page.slug === slug); - if (!page) { - throw new Error(`Page not found: ${slug}`); - } - const next = (await page.loader()) as Experiment; + const { default: next } = (await content()) as { + default: Experiment; + }; console.log('n', next); setExperiment(next); } catch (err) { @@ -37,7 +35,7 @@ const Page: React.FC = ({ slug }) => { }; load(); - }, [slug]); + }, [content]); if (error) { return
Error: {error.toString()}
; @@ -48,10 +46,22 @@ const Page: React.FC = ({ slug }) => { } return ( - - {experiment.view} + + + + ); }; -export { Page }; +const pageImports = import.meta.glob('../../experiments/*/index.tsx'); + +const experiments: { + path: string; + element: JSX.Element; +}[] = Object.entries(pageImports).map(([path, page]) => ({ + path: path.replace('../../experiments/', '').replace('/index.tsx', ''), + element: , +})); + +export { experiments }; diff --git a/packages/playground/src/containers/experiment/input/index.tsx b/packages/playground/src/containers/experiment/input/index.tsx new file mode 100644 index 0000000..ebf91b0 --- /dev/null +++ b/packages/playground/src/containers/experiment/input/index.tsx @@ -0,0 +1,116 @@ +import { + Modal, + ModalContent, + ModalHeader, + ModalBody, + Button, + useDisclosure, + Card, + CardBody, + CardHeader, +} from '@nextui-org/react'; +import { useExperimentResult } from '../../../features/experiment'; +import { formatTime } from '../../../utils/time'; + +const InputView = () => { + const data = useExperimentResult(); + const { isOpen, onOpen, onOpenChange } = useDisclosure(); + if (!data) { + return null; + } + return ( + <> + + + + Input + +
+ {data.planables.map((item) => { + const description: [string, string][] = []; + + if (item.start) { + if (item.start.min === item.start.max) { + description.push(['start', formatTime(item.start.min)]); + } else { + const min = formatTime(item.start.min); + const max = formatTime(item.start.max); + description.push(['start', `${min} - ${max}`]); + } + } + + if (item.count || 0 > 1) { + description.push(['count', item.count?.toString() || '']); + } + if (item.attributes.locations) { + description.push([ + 'locations', + item.attributes.locations.join(', '), + ]); + } + if (item.attributes.capabilities?.requires) { + description.push([ + 'requires', + item.attributes.capabilities.requires.join(', '), + ]); + } + + if (item.attributes.capabilities?.perhibits) { + description.push([ + 'prohibits', + item.attributes.capabilities.perhibits.join(', '), + ]); + } + + if (item.attributes.capabilities?.provides) { + description.push([ + 'provides', + item.attributes.capabilities.provides.join(', '), + ]); + } + + if (item.attributes.capabilities?.consumes) { + description.push([ + 'consumes', + item.attributes.capabilities.consumes.join(', '), + ]); + } + + description.push([ + 'duration', + `${item.duration / 1000 / 60} minutes`, + ]); + + return ( + + {item.id} + +
+ {description.map((d) => ( +
+
+ {d[0]}: +
+
+ {d[1]} +
+
+ ))} +
+
+
+ ); + })} +
+
+
+
+ + ); +}; + +export { InputView }; diff --git a/packages/playground/src/containers/experiment/node.tsx b/packages/playground/src/containers/experiment/node.tsx deleted file mode 100644 index 7772c8d..0000000 --- a/packages/playground/src/containers/experiment/node.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Accordion, AccordionItem } from '@nextui-org/react'; -import { useSelectedNode } from '../../features/experiment/hooks'; -import { Plan } from '../../presenters/plan'; - -const NodeView = () => { - const node = useSelectedNode(); - if (!node) { - return null; - } - - return ( -
-

{node.id}

- - - - - -
{JSON.stringify(node.context, null, 2)}
-
-
-
- ); -}; - -export { NodeView }; diff --git a/packages/playground/src/containers/experiment/node/details.tsx b/packages/playground/src/containers/experiment/node/details.tsx new file mode 100644 index 0000000..7adbfd6 --- /dev/null +++ b/packages/playground/src/containers/experiment/node/details.tsx @@ -0,0 +1,46 @@ +import { GraphNode } from '@bob-the-algorithm/core'; +import { Modal, ModalBody, ModalContent, ModalHeader } from '@nextui-org/react'; +import { format } from 'date-fns'; +import { JSONTree } from 'react-json-tree'; +import { useExperimentResult } from '../../../features/experiment'; +import { useMemo } from 'react'; + +type NodeDetailsViewProps = { + node?: GraphNode; + onClose: () => void; +}; + +const NodeDetailsInfo = ({ node }: { node: GraphNode }) => { + const data = useExperimentResult(); + const start = format(new Date(node.time), 'HH:mm'); + const planable = useMemo(() => { + if (!data) { + return null; + } + return node.planable + ? data.planables.find((n) => n.id === node.planable) + : null; + }, [node, data]); + return ( +
+

{node.id}

+

{start}

+

+      
+      {planable && }
+    
+ ); +}; + +const NodeDetailsView = ({ node, onClose }: NodeDetailsViewProps) => { + return ( + + + Item details + {node && } + + + ); +}; + +export { NodeDetailsView }; diff --git a/packages/playground/src/containers/experiment/node/index.tsx b/packages/playground/src/containers/experiment/node/index.tsx new file mode 100644 index 0000000..641df88 --- /dev/null +++ b/packages/playground/src/containers/experiment/node/index.tsx @@ -0,0 +1,44 @@ +import { Modal, ModalBody, ModalContent, ModalHeader } from '@nextui-org/react'; +import { GraphNode } from '@bob-the-algorithm/core'; +import { + useSelectNode, + useSelectedNode, +} from '../../../features/experiment/hooks'; +import { Plan } from '../../../presenters/plan'; +import { useState } from 'react'; +import { NodeDetailsView } from './details'; +import { HorizontalPlan } from '../../../presenters/horizontal-plan'; + +const NodeView = () => { + const node = useSelectedNode(); + const selectNode = useSelectNode(); + const [selectedItem, setSelectedItem] = useState>(); + + return ( + <> + selectNode(undefined)} + > + + Node + + {node && ( + <> + + + + )} + + + + setSelectedItem(undefined)} + /> + + ); +}; + +export { NodeView }; diff --git a/packages/playground/src/containers/experiment/nodes.tsx b/packages/playground/src/containers/experiment/nodes.tsx deleted file mode 100644 index f85cd9c..0000000 --- a/packages/playground/src/containers/experiment/nodes.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { useExperimentResult } from '../../features/experiment'; -import { useSelectNode } from '../../features/experiment/hooks'; - -const NodesView = () => { - const data = useExperimentResult(); - const selectNode = useSelectNode(); - - if (!data) { - return null; - } - - return ( -
- {data.completed.map((node) => ( -
selectNode(node)} key={node.id}> - {node.id} {node.score} -
- ))} -
- ); -}; - -export { NodesView }; diff --git a/packages/playground/src/containers/experiment/stats/index.tsx b/packages/playground/src/containers/experiment/stats/index.tsx new file mode 100644 index 0000000..a5b6516 --- /dev/null +++ b/packages/playground/src/containers/experiment/stats/index.tsx @@ -0,0 +1,17 @@ +import { useExperimentResult } from '../../../features/experiment'; +import { useExperimentDuration } from '../../../features/experiment/hooks'; + +const Stats = () => { + const data = useExperimentResult(); + const duration = useExperimentDuration(); + + return ( +
+
Nodes: {data?.nodes.length}
+
Completed: {data?.completed.length}
+
Duration: {duration}ms
+
+ ); +}; + +export { Stats }; diff --git a/packages/playground/src/containers/experiment/view.tsx b/packages/playground/src/containers/experiment/view.tsx index 2d2d823..9c15b6f 100644 --- a/packages/playground/src/containers/experiment/view.tsx +++ b/packages/playground/src/containers/experiment/view.tsx @@ -1,6 +1,10 @@ -import { Graph } from '../../presenters/graph'; +import { Content } from '../../components/content'; +import { Frame } from '../../components/frame'; +import { FindNodeView } from './find-node'; +import { GraphView } from './graph'; +import { InputView } from './input'; import { NodeView } from './node'; -import { NodesView } from './nodes'; +import { Stats } from './stats'; type ExperimentViewProps = { children: React.ReactNode; @@ -8,11 +12,23 @@ type ExperimentViewProps = { const ExperimentView: React.FC = ({ children }) => { return ( - <> - - - - + +
+
+
+ {children} +
+
+ + + +
+ +
+
+ +
+ ); }; diff --git a/packages/playground/src/containers/page/index.tsx b/packages/playground/src/containers/page/index.tsx new file mode 100644 index 0000000..c9bbee8 --- /dev/null +++ b/packages/playground/src/containers/page/index.tsx @@ -0,0 +1,15 @@ +import { Page } from './page'; + +const pageImports = import.meta.glob('../../pages/**/*.tsx'); + +const pages: any = Object.entries(pageImports).map(([path, page]) => ({ + path: path + .replace('../../pages/', '') + .replace('index.tsx', '') + .replace('.tsx', ''), + element: , +})); + +console.log('pages', pages); + +export { pages }; diff --git a/packages/playground/src/containers/page/page.tsx b/packages/playground/src/containers/page/page.tsx new file mode 100644 index 0000000..83fac9c --- /dev/null +++ b/packages/playground/src/containers/page/page.tsx @@ -0,0 +1,38 @@ +import { useEffect, useState } from 'react'; +import { Frame } from '../../components/frame'; +import { Skeleton } from '@nextui-org/react'; +import { Content } from '../../components/content'; + +type Props = { + content: () => Promise<{ Page: (props: any) => JSX.Element }>; +}; + +const Page = ({ content }: Props) => { + const [Component, setComponent] = useState(); + useEffect(() => { + const run = async () => { + const component = await content(); + setComponent(() => component.Page); + }; + run(); + }, [content]); + + return ( + + + {!!Component ? ( +
+ +
+ ) : ( +
+ + +
+ )} +
+ + ); +}; + +export { Page }; diff --git a/packages/playground/src/experiments/capabilities/experiment.ts b/packages/playground/src/experiments/capabilities/experiment.ts new file mode 100644 index 0000000..b75e23a --- /dev/null +++ b/packages/playground/src/experiments/capabilities/experiment.ts @@ -0,0 +1,163 @@ +import { ExperimentInfo } from '../../features/experiment/types'; + +const MIN = 1000 * 60; +const HOUR = 1000 * 60 * 60; + +const info: ExperimentInfo = { + start: 0, + planables: [ + { + id: `Brush teeth`, + duration: 2 * MIN, + start: { + min: 7 * HOUR, + max: 8 * HOUR, + }, + attributes: { + locations: ['home'], + }, + score: 1, + }, + { + id: 'Drop off kids', + duration: 30 * MIN, + attributes: { + locations: ['daycare'], + capabilities: { + consumes: ['kids'], + requires: ['kids'], + }, + }, + score: 1, + start: { + min: 7 * HOUR, + max: 9 * HOUR, + }, + }, + { + id: 'visit zoo', + duration: 1 * HOUR, + attributes: { + locations: ['zoo'], + capabilities: { + requires: ['kids'], + }, + }, + score: 1, + start: { + min: 10 * HOUR, + max: 14 * HOUR, + }, + }, + { + id: 'Pickup the kids', + duration: 30 * MIN, + attributes: { + locations: ['daycare'], + capabilities: { + provides: ['kids'], + }, + }, + score: 1, + start: { + min: 10 * HOUR, + max: 15.5 * HOUR, + }, + }, + { + id: 'Do work', + duration: 1 * HOUR, + count: 5, + attributes: { + locations: ['work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 8 * HOUR, + max: 18 * HOUR, + }, + }, + { + id: 'put kids to bed', + duration: 30 * MIN, + attributes: { + locations: ['home'], + capabilities: { + consumes: ['kids'], + requires: ['kids'], + }, + }, + score: 1, + }, + { + id: 'Read book', + duration: 0.5 * HOUR, + attributes: { + locations: ['home', 'work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 3, + count: 2, + start: { + min: 8 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Meditate', + duration: 10 * MIN, + score: 1, + attributes: { + locations: ['home', 'work'], + capabilities: { + perhibits: ['kids'], + }, + }, + start: { + min: 8 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Meeting 1', + duration: 1 * HOUR, + attributes: { + locations: ['work', 'work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 10 * HOUR, + max: 10 * HOUR, + }, + }, + { + id: 'Play playstation', + duration: 1 * HOUR, + attributes: { + locations: ['home'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 16 * HOUR, + max: 24 * HOUR, + }, + }, + ], + context: { + location: 'home', + capabilities: ['kids'], + }, +}; + +export { info }; diff --git a/packages/playground/src/experiments/capabilities/index.tsx b/packages/playground/src/experiments/capabilities/index.tsx index 6e73402..6db4279 100644 --- a/packages/playground/src/experiments/capabilities/index.tsx +++ b/packages/playground/src/experiments/capabilities/index.tsx @@ -1,12 +1,6 @@ -const Foo = () => { - return
; +import { info } from './experiment'; + +export default { + info, + view: () => <>Hello, }; - -const worker = () => - new Worker(new URL('./script.ts', import.meta.url), { - type: 'module', - }); - -const view = ; - -export { worker, view }; diff --git a/packages/playground/src/experiments/capabilities/script.ts b/packages/playground/src/experiments/capabilities/script.ts deleted file mode 100644 index 11119a6..0000000 --- a/packages/playground/src/experiments/capabilities/script.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { Bob, plugins } from '@bob-the-algorithm/core'; -import { createWorker } from '../../features/experiment/worker'; - -const MIN = 1000 * 60; -const HOUR = 1000 * 60 * 60; - -const getTravelTime = async () => 30 * MIN; -const transport = plugins.transport({ - getTravelTime, -}); - -const realistic = async () => { - try { - const bob = new Bob({ - plugins: { transport, capabilities: plugins.capabilities() }, - }); - const result = await bob.run({ - context: { - location: 'home', - capabilities: ['kids'], - }, - start: 0, - heuristic: ({ completed }) => completed.length >= 30, - planables: [ - { - id: `Brush teeth`, - duration: 2 * MIN, - start: { - min: 7 * HOUR, - max: 8 * HOUR, - }, - attributes: { - locations: ['home'], - }, - score: 1, - }, - { - id: 'Drop off kids', - duration: 30 * MIN, - attributes: { - locations: ['daycare'], - capabilities: { - consumes: ['kids'], - requires: ['kids'], - }, - }, - score: 1, - start: { - min: 7 * HOUR, - max: 9 * HOUR, - }, - }, - { - id: 'visit zoo', - duration: 1 * HOUR, - attributes: { - locations: ['zoo'], - capabilities: { - requires: ['kids'], - }, - }, - score: 1, - start: { - min: 10 * HOUR, - max: 14 * HOUR, - }, - }, - { - id: 'Pickup the kids', - duration: 30 * MIN, - attributes: { - locations: ['daycare'], - capabilities: { - provides: ['kids'], - }, - }, - score: 1, - start: { - min: 10 * HOUR, - max: 15.5 * HOUR, - }, - }, - { - id: 'Do work', - duration: 1 * HOUR, - count: 5, - attributes: { - locations: ['work'], - capabilities: { - perhibits: ['kids'], - }, - }, - score: 10, - start: { - min: 8 * HOUR, - max: 18 * HOUR, - }, - }, - { - id: 'put kids to bed', - duration: 30 * MIN, - attributes: { - locations: ['home'], - capabilities: { - consumes: ['kids'], - requires: ['kids'], - }, - }, - score: 1, - }, - { - id: 'Read book', - duration: 0.5 * HOUR, - attributes: { - locations: ['home', 'work'], - capabilities: { - perhibits: ['kids'], - }, - }, - score: 3, - count: 2, - start: { - min: 8 * HOUR, - max: 22 * HOUR, - }, - }, - { - id: 'Meditate', - duration: 10 * MIN, - score: 1, - attributes: { - locations: ['home', 'work'], - capabilities: { - perhibits: ['kids'], - }, - }, - start: { - min: 8 * HOUR, - max: 22 * HOUR, - }, - }, - { - id: 'Meeting 1', - duration: 1 * HOUR, - attributes: { - locations: ['work', 'work'], - capabilities: { - perhibits: ['kids'], - }, - }, - score: 10, - start: { - min: 10 * HOUR, - max: 10 * HOUR, - }, - }, - { - id: 'Play playstation', - duration: 1 * HOUR, - attributes: { - locations: ['home'], - capabilities: { - perhibits: ['kids'], - }, - }, - score: 10, - start: { - min: 16 * HOUR, - max: 24 * HOUR, - }, - }, - ], - }); - return result; - } catch (e) { - console.error(e); - throw e; - } -}; - -createWorker(realistic); diff --git a/packages/playground/src/experiments/capabilities/view.mdx b/packages/playground/src/experiments/capabilities/view.mdx new file mode 100644 index 0000000..82e9442 --- /dev/null +++ b/packages/playground/src/experiments/capabilities/view.mdx @@ -0,0 +1,3 @@ +# Hello + +world diff --git a/packages/playground/src/experiments/hello/index.tsx b/packages/playground/src/experiments/hello/index.tsx deleted file mode 100644 index 6e73402..0000000 --- a/packages/playground/src/experiments/hello/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -const Foo = () => { - return
; -}; - -const worker = () => - new Worker(new URL('./script.ts', import.meta.url), { - type: 'module', - }); - -const view = ; - -export { worker, view }; diff --git a/packages/playground/src/experiments/hello/script.ts b/packages/playground/src/experiments/hello/script.ts deleted file mode 100644 index c388cd7..0000000 --- a/packages/playground/src/experiments/hello/script.ts +++ /dev/null @@ -1,153 +0,0 @@ -import { Bob, plugins } from '@bob-the-algorithm/core'; -import { createWorker } from '../../features/experiment/worker'; - -const MIN = 1000 * 60; -const HOUR = 1000 * 60 * 60; - -const getTravelTime = async () => 30 * MIN; -const transport = plugins.transport({ - getTravelTime, -}); - -const realistic = async () => { - try { - const bob = new Bob({ - plugins: { transport, capabilities: plugins.capabilities() }, - }); - const result = await bob.run({ - context: { - location: 'home', - }, - start: 0, - heuristic: ({ completed }) => completed.length >= 3, - planables: [ - { - id: `Brush teeth`, - duration: 2 * MIN, - start: { - min: 7 * HOUR, - max: 8 * HOUR, - }, - attributes: { - locations: ['home'], - }, - score: 1, - }, - { - id: 'Drop off kids', - duration: 30 * MIN, - attributes: { - locations: ['daycare'], - }, - score: 1, - start: { - min: 7 * HOUR, - max: 9 * HOUR, - }, - }, - { - id: 'Pickup the kids', - duration: 30 * MIN, - attributes: { - locations: ['daycare'], - }, - score: 1, - start: { - min: 15 * HOUR, - max: 15.5 * HOUR, - }, - }, - { - id: `Eat breakfast`, - duration: 15 * MIN, - start: { - min: 7 * HOUR, - max: 9 * HOUR, - }, - attributes: { - locations: ['home'], - }, - score: 1, - }, - { - id: 'Do work', - duration: 1 * HOUR, - count: 5, - attributes: { - locations: ['work'], - }, - score: 10, - start: { - min: 8 * HOUR, - max: 18 * HOUR, - }, - }, - { - id: 'Read book', - duration: 0.5 * HOUR, - attributes: { - locations: ['home', 'work'], - }, - score: 3, - count: 2, - start: { - min: 8 * HOUR, - max: 22 * HOUR, - }, - }, - { - id: 'Meditate', - duration: 10 * MIN, - score: 1, - attributes: {}, - start: { - min: 8 * HOUR, - max: 22 * HOUR, - }, - }, - { - id: 'Meeting 1', - duration: 1 * HOUR, - attributes: { - locations: ['work', 'work'], - }, - score: 10, - start: { - min: 10 * HOUR, - max: 10 * HOUR, - }, - }, - { - id: 'Meeting 2', - duration: 1 * HOUR, - attributes: { - locations: ['work', 'work'], - }, - score: 10, - start: { - min: 12 * HOUR, - max: 12 * HOUR, - }, - }, - { - id: 'Play playstation', - duration: 1 * HOUR, - attributes: { - locations: ['home'], - }, - score: 10, - start: { - min: 16 * HOUR, - max: 24 * HOUR, - }, - }, - ], - }); - return result; - } catch (e) { - console.error(e); - throw e; - } -}; - -createWorker(realistic); diff --git a/packages/playground/src/experiments/realistic/experiment.ts b/packages/playground/src/experiments/realistic/experiment.ts new file mode 100644 index 0000000..bcb6c08 --- /dev/null +++ b/packages/playground/src/experiments/realistic/experiment.ts @@ -0,0 +1,204 @@ +import { ExperimentInfo } from '../../features/experiment/types'; + +const MIN = 1000 * 60; +const HOUR = 1000 * 60 * 60; + +const info: ExperimentInfo = { + context: { + location: 'home', + capabilities: ['kids'], + }, + start: 0, + planables: [ + { + id: `Brush teeth`, + duration: 2 * MIN, + start: { + min: 7 * HOUR, + max: 8 * HOUR, + }, + attributes: { + locations: ['home'], + }, + score: 1, + }, + { + id: 'Drop off kids', + duration: 30 * MIN, + attributes: { + locations: ['daycare'], + capabilities: { + requires: ['kids'], + consumes: ['kids'], + }, + }, + score: 1, + start: { + min: 7 * HOUR, + max: 9 * HOUR, + }, + }, + { + id: 'put kids to bed', + duration: 30 * MIN, + attributes: { + locations: ['home'], + capabilities: { + consumes: ['kids'], + requires: ['kids'], + }, + }, + start: { + min: 18.5 * HOUR, + max: 19.5 * HOUR, + }, + score: 1, + }, + { + id: 'Pickup the kids', + duration: 30 * MIN, + attributes: { + locations: ['daycare'], + capabilities: { + provides: ['kids'], + }, + }, + score: 1, + start: { + min: 15 * HOUR, + max: 16 * HOUR, + }, + }, + { + id: `Eat breakfast`, + duration: 15 * MIN, + start: { + min: 7 * HOUR, + max: 9 * HOUR, + }, + attributes: { + locations: ['home'], + }, + score: 1, + }, + { + id: 'Eat dinner', + duration: 60 * MIN, + attributes: { + locations: ['home'], + capabilities: { + requires: ['kids'], + }, + }, + score: 1, + start: { + min: 17 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Have lunch', + duration: 30 * MIN, + attributes: {}, + score: 1, + start: { + min: 11 * HOUR, + max: 13.5 * HOUR, + }, + }, + { + id: 'Do work', + duration: 1 * HOUR, + count: 5, + attributes: { + locations: ['work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 8 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Read book', + duration: 0.5 * HOUR, + attributes: { + locations: ['home', 'work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 3, + count: 2, + start: { + min: 8 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Meditate', + duration: 10 * MIN, + score: 1, + attributes: { + locations: ['home', 'work'], + capabilities: { + perhibits: ['kids'], + }, + }, + start: { + min: 8 * HOUR, + max: 22 * HOUR, + }, + }, + { + id: 'Meeting 1', + duration: 1 * HOUR, + attributes: { + locations: ['work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 10 * HOUR, + max: 10 * HOUR, + }, + }, + { + id: 'Meeting 2', + duration: 1 * HOUR, + attributes: { + locations: ['work'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 12 * HOUR, + max: 12 * HOUR, + }, + }, + { + id: 'Play playstation', + duration: 1 * HOUR, + attributes: { + locations: ['home'], + capabilities: { + perhibits: ['kids'], + }, + }, + score: 10, + start: { + min: 16 * HOUR, + max: 24 * HOUR, + }, + }, + ], +}; + +export { info }; diff --git a/packages/playground/src/experiments/realistic/index.tsx b/packages/playground/src/experiments/realistic/index.tsx new file mode 100644 index 0000000..645fdb4 --- /dev/null +++ b/packages/playground/src/experiments/realistic/index.tsx @@ -0,0 +1,9 @@ +import { info } from './experiment'; +const Foo = () => { + return
; +}; + +export default { + info, + view: Foo, +}; diff --git a/packages/playground/src/features/experiment/context.tsx b/packages/playground/src/features/experiment/context.tsx index 28cc306..a1d61a8 100644 --- a/packages/playground/src/features/experiment/context.tsx +++ b/packages/playground/src/features/experiment/context.tsx @@ -1,4 +1,8 @@ -import { CalulationResult, GraphNode } from '@bob-the-algorithm/core'; +import { + AllPlugins, + CalulationResult, + GraphNode, +} from '@bob-the-algorithm/core'; import { ReactNode, createContext, @@ -7,9 +11,11 @@ import { useMemo, useState, } from 'react'; +import { ExperimentInfo } from './types'; type ExperimentResult = { - payload: CalulationResult; + payload: CalulationResult; + duration: number; }; type ExperimentContextValue = { @@ -22,9 +28,14 @@ type ExperimentContextValue = { type ExperimentProviderProps = { children: ReactNode; - worker: () => Worker; + experimentInfo: ExperimentInfo; }; +const createWorker = () => + new Worker(new URL('./worker.ts', import.meta.url), { + type: 'module', + }); + const ExperimentContext = createContext({ loading: false, selectNode: () => { }, @@ -32,7 +43,7 @@ const ExperimentContext = createContext({ const ExperimentProvider: React.FC = ({ children, - worker, + experimentInfo, }) => { const [result, setResult] = useState(); const [error, setError] = useState(); @@ -49,7 +60,7 @@ const ExperimentProvider: React.FC = ({ setLoading(true); setError(undefined); setResult(undefined); - const workerInstance = worker(); + const workerInstance = createWorker(); workerInstance.onmessage = (e) => { switch (e.data.type) { case 'error': { @@ -69,13 +80,14 @@ const ExperimentProvider: React.FC = ({ }; workerInstance.postMessage({ type: 'run', + payload: experimentInfo, }); }; run(); return () => { workerInstance?.terminate(); }; - }, [worker]); + }, [experimentInfo]); const value = useMemo( () => ({ diff --git a/packages/playground/src/features/experiment/create.tsx b/packages/playground/src/features/experiment/create.tsx deleted file mode 100644 index 286d407..0000000 --- a/packages/playground/src/features/experiment/create.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { ReactNode } from 'react'; -import { ExperimentProvider } from './context'; - -type CreateExperimentInput = { - worker: () => Worker; - view: ReactNode; -}; - -const createExperiment = (input: CreateExperimentInput) => { - return ( - {input.view} - ); -}; - -export { createExperiment }; diff --git a/packages/playground/src/features/experiment/hooks.ts b/packages/playground/src/features/experiment/hooks.ts index 7025150..046cbce 100644 --- a/packages/playground/src/features/experiment/hooks.ts +++ b/packages/playground/src/features/experiment/hooks.ts @@ -6,6 +6,11 @@ const useExperimentResult = () => { return result?.payload; }; +const useExperimentDuration = () => { + const { result } = useContext(ExperimentContext); + return result?.duration; +}; + const useSelectNode = () => { const { selectNode } = useContext(ExperimentContext); return selectNode; @@ -16,4 +21,9 @@ const useSelectedNode = () => { return selectedNode; }; -export { useExperimentResult, useSelectNode, useSelectedNode }; +export { + useExperimentResult, + useSelectNode, + useSelectedNode, + useExperimentDuration, +}; diff --git a/packages/playground/src/features/experiment/index.ts b/packages/playground/src/features/experiment/index.ts index 468c6cc..540241f 100644 --- a/packages/playground/src/features/experiment/index.ts +++ b/packages/playground/src/features/experiment/index.ts @@ -1,4 +1,2 @@ -export { createWorker } from './worker'; export { ExperimentProvider as Experminent } from './context'; -export { createExperiment } from './create'; export { useExperimentResult } from './hooks'; diff --git a/packages/playground/src/features/experiment/types.ts b/packages/playground/src/features/experiment/types.ts new file mode 100644 index 0000000..95428a1 --- /dev/null +++ b/packages/playground/src/features/experiment/types.ts @@ -0,0 +1,9 @@ +import { AllPlugins, PlanableWithPlugins } from '@bob-the-algorithm/core'; + +type ExperimentInfo = { + planables: PlanableWithPlugins[]; + context: any; + start: number; +}; + +export type { ExperimentInfo }; diff --git a/packages/playground/src/features/experiment/worker.ts b/packages/playground/src/features/experiment/worker.ts index d8436b0..3d7b0e7 100644 --- a/packages/playground/src/features/experiment/worker.ts +++ b/packages/playground/src/features/experiment/worker.ts @@ -1,23 +1,38 @@ -type WorkerFn = (...args: any[]) => any; +import { Bob, plugins } from '@bob-the-algorithm/core'; +import { ExperimentInfo } from './types'; -const createWorker = (fn: WorkerFn) => { - const run = async () => { - const startTime = performance.now(); - try { - const result = await fn(); - const endTime = performance.now(); - const duration = endTime - startTime; - self.postMessage({ type: 'output', payload: result, duration }); - } catch (error) { - self.postMessage({ type: 'error', payload: error }); - } - }; - self.addEventListener('message', (event) => { - const { type } = event.data; - if (type === 'run') { - run(); - } - }); +const MIN = 1000 * 60; + +const getTravelTime = async () => 30 * MIN; +const transport = plugins.transport({ + getTravelTime, +}); + +const run = async (payload: ExperimentInfo) => { + const startTime = performance.now(); + try { + const bob = new Bob({ + plugins: { transport, capabilities: plugins.capabilities() }, + }); + const result = await bob.run({ + planables: payload.planables, + context: payload.context, + start: payload.start, + heuristic: ({ completed }) => completed.length >= 3, + }); + + const endTime = performance.now(); + const duration = endTime - startTime; + self.postMessage({ type: 'output', payload: result, duration }); + } catch (error) { + self.postMessage({ type: 'error', payload: error }); + console.error(error); + } }; -export { createWorker }; +self.addEventListener('message', (event) => { + const { type, payload } = event.data; + if (type === 'run') { + run(payload); + } +}); diff --git a/packages/playground/src/main.css b/packages/playground/src/index.css similarity index 53% rename from packages/playground/src/main.css rename to packages/playground/src/index.css index b5c61c9..abdeff7 100644 --- a/packages/playground/src/main.css +++ b/packages/playground/src/index.css @@ -1,3 +1,10 @@ @tailwind base; @tailwind components; @tailwind utilities; + +html, +body, +#root, +#root > div { + height: 100%; +} diff --git a/packages/playground/src/main.tsx b/packages/playground/src/main.tsx index 7058e4c..73d5228 100644 --- a/packages/playground/src/main.tsx +++ b/packages/playground/src/main.tsx @@ -1,4 +1,3 @@ -import './main.css'; import React from 'react'; import ReactDOM from 'react-dom/client'; import { App } from './app.tsx'; diff --git a/packages/playground/src/pages/experiments.tsx b/packages/playground/src/pages/experiments.tsx new file mode 100644 index 0000000..1057a04 --- /dev/null +++ b/packages/playground/src/pages/experiments.tsx @@ -0,0 +1,53 @@ +import { useNavigate } from 'react-router-dom'; +import { Card, CardBody, Button } from '@nextui-org/react'; + +type Experiment = { + title: string; + slug: string; + description: string; +}; + +const experiments: Experiment[] = [ + { + title: 'Capabilities', + slug: 'capabilities', + description: 'Explore the capabilities of Bob.', + }, + { + title: 'Packed day', + slug: 'realistic', + description: 'Explore the capabilities of Bob.', + }, +]; + +const Experiments = () => { + const navigate = useNavigate(); + return ( +
+

Experiments

+ {experiments.map(({ title, slug, description }) => ( + + +
+
+

{title}

+

{description}

+
+ +
+
+
+ ))} +
+ ); +}; + +export { Experiments as Page }; diff --git a/packages/playground/src/pages/index.tsx b/packages/playground/src/pages/index.tsx new file mode 100644 index 0000000..85d87c6 --- /dev/null +++ b/packages/playground/src/pages/index.tsx @@ -0,0 +1,5 @@ +const Experiments = () => { + return
Welcome
; +}; + +export { Experiments as Page }; diff --git a/packages/playground/src/presenters/graph/index.tsx b/packages/playground/src/presenters/graph/index.tsx index 852853d..fc58c75 100644 --- a/packages/playground/src/presenters/graph/index.tsx +++ b/packages/playground/src/presenters/graph/index.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react'; +import { useMemo } from 'react'; import { GraphCanvas } from 'reagraph'; import { useExperimentResult } from '../../features/experiment'; import { convertResult } from '../../utils/graph'; @@ -17,7 +17,6 @@ const Graph: React.FC = () => { } return convertResult(data); }, [data]); - const [visualize, setVisualize] = useState(false); const selectedPath = useMemo(() => { if (!selectedNode) { return []; @@ -45,52 +44,47 @@ const Graph: React.FC = () => { return ( <> Nodes count: {output.nodes.length} - - {visualize && ( -
- { - if (node.id === selectedNode?.id) { - selectNode(undefined); - return; - } - const nextNode = data?.nodes.find((n) => n.id === node.id); - selectNode(nextNode); - }} - selections={selectedPath} - renderNode={({ size, opacity, node }) => { - let color = 'gray'; - if (node.data?.deadEnd) { - color = 'red'; - } - if (node.data?.completed) { - color = 'green'; - } - if (node.data?.type === 'root') { - color = 'black'; - } - return ( - - - - - - - ); - }} - /> -
- )} +
+ { + if (node.id === selectedNode?.id) { + selectNode(undefined); + return; + } + const nextNode = data?.nodes.find((n) => n.id === node.id); + selectNode(nextNode); + }} + selections={selectedPath} + renderNode={({ size, opacity, node }) => { + let color = 'gray'; + if (node.data?.deadEnd) { + color = 'red'; + } + if (node.data?.completed) { + color = 'green'; + } + if (node.data?.type === 'root') { + color = 'black'; + } + return ( + + + + + + + ); + }} + /> +
); }; diff --git a/packages/playground/src/presenters/graph/plan.tsx b/packages/playground/src/presenters/graph/plan.tsx deleted file mode 100644 index 4c5a56d..0000000 --- a/packages/playground/src/presenters/graph/plan.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { GraphNode } from '@bob-the-algorithm/core'; -import { useMemo } from 'react'; -import { ConvertedResult } from '../../utils/graph'; -import { format } from 'date-fns'; - -type PlanProps = { - id: string; - output: ConvertedResult; -}; - -type NodeProps = { - node: GraphNode; - output: ConvertedResult; -}; - -const Node = ({ node, output }: NodeProps) => { - const planable = useMemo(() => { - return node.planable - ? output.result.planables.find((n) => n.id === node.planable) - : null; - }, [node, output]); - - const time = useMemo(() => { - const start = new Date(node.time); - const end = new Date(start.getTime() + node.duration); - return ( - - {format(start, 'HH:mm')} - {format(end, 'HH:mm')} - - ); - }, [node.duration, node.time]); - - if (planable) { - return ( -
- {time} Planable: {planable!.id} -
- ); - } - if (node.type === 'travel') { - return ( -
- {time} Travel: {node.context.location} -
- ); - } - - return null; -}; - -const Plan: React.FC = ({ id, output }) => { - const nodes = useMemo(() => { - const result: GraphNode[] = []; - let current = output.result.nodes.find((n) => n.id === id); - - while (current) { - result.push(current); - if (!current.parent) { - break; - } - current = output.result.nodes.find((n) => n.id === current?.parent); - } - - return result; - }, [id, output]); - - return ( - <> - {nodes.map((n) => ( - - ))} - - ); -}; - -export { Plan }; diff --git a/packages/playground/src/presenters/horizontal-plan/index.tsx b/packages/playground/src/presenters/horizontal-plan/index.tsx new file mode 100644 index 0000000..5f9fa4a --- /dev/null +++ b/packages/playground/src/presenters/horizontal-plan/index.tsx @@ -0,0 +1,90 @@ +import { GraphNode } from '@bob-the-algorithm/core'; +import { Popover, PopoverTrigger, PopoverContent } from '@nextui-org/react'; +import { useExperimentResult } from '../../features/experiment'; +import { useMemo } from 'react'; +import { formatTime } from '../../utils/time'; + +type PlanProps = { + node: GraphNode; +}; + +const timespan = 24 * 60 * 60 * 1000; +const randomColor = () => Math.floor(Math.random() * 16777215).toString(16); + +const HorizontalPlan: React.FC = ({ node }) => { + const data = useExperimentResult(); + const nodes = useMemo(() => { + if (!data) { + return []; + } + const result: GraphNode[] = []; + let current = node; + if (!current) { + return []; + } + + while (current) { + result.push(current); + if (!current.parent) { + break; + } + current = data.nodes.find((n) => n.id === current?.parent)!; + } + + return result; + }, [data, node]); + + if (!data) { + return null; + } + + return ( +
+ {nodes.map((node) => { + const time = ( + + {formatTime(node.time)} - {formatTime(node.time + node.duration)} + + ); + let title = ''; + if (node.planable) { + const planable = data!.planables.find((n) => n.id === node.planable); + title = `Planable: ${planable?.id}`; + } + if (node.type === 'travel') { + title = `Travel: ${node.context.location}`; + } + return ( +
+ + +
+ + +
+
{title}
+
{time}
+
+
+ +
+ ); + })} +
+ ); +}; + +export { HorizontalPlan }; diff --git a/packages/playground/src/presenters/plan/index.tsx b/packages/playground/src/presenters/plan/index.tsx index 327919e..6e542c9 100644 --- a/packages/playground/src/presenters/plan/index.tsx +++ b/packages/playground/src/presenters/plan/index.tsx @@ -1,60 +1,18 @@ import { GraphNode } from '@bob-the-algorithm/core'; import { useMemo } from 'react'; -import { convertResult } from '../../utils/graph'; -import { format } from 'date-fns'; +import { Listbox, ListboxItem, cn } from '@nextui-org/react'; import { useExperimentResult } from '../../features/experiment'; -import { useSelectNode } from '../../features/experiment/hooks'; +import { formatTime } from '../../utils/time'; type PlanProps = { node: GraphNode; + onSelect: (node: GraphNode) => void; }; -type NodeProps = { - node: GraphNode; -}; - -const Node = ({ node }: NodeProps) => { - const selectNode = useSelectNode(); +const Plan: React.FC = ({ node, onSelect }) => { const data = useExperimentResult(); - const planable = useMemo(() => { - return node.planable - ? data?.planables.find((n) => n.id === node.planable) - : null; - }, [node, data]); - - const time = useMemo(() => { - const start = new Date(node.time); - const end = new Date(start.getTime() + node.duration); - return ( - - {format(start, 'HH:mm')} - {format(end, 'HH:mm')} - - ); - }, [node.duration, node.time]); - - if (planable) { - return ( -
selectNode(node)}> - {time} Planable: {planable!.id} -
- ); - } - if (node.type === 'travel') { - return ( -
selectNode(node)}> - {time} Travel: {node.context.location} -
- ); - } - - return null; -}; - -const Plan: React.FC = ({ node }) => { - const data = useExperimentResult(); - const output = useMemo(() => (data ? convertResult(data) : null), [data]); const nodes = useMemo(() => { - if (!output) { + if (!data) { return []; } const result: GraphNode[] = []; @@ -68,22 +26,48 @@ const Plan: React.FC = ({ node }) => { if (!current.parent) { break; } - current = output.result.nodes.find((n) => n.id === current?.parent)!; + current = data.nodes.find((n) => n.id === current?.parent)!; } - return result; - }, [output, node]); + return result.reverse(); + }, [data, node]); - if (!output) { + if (!data) { return null; } return ( - <> - {nodes.map((n) => ( - - ))} - + + {(node) => { + const time = ( + + {formatTime(node.time)} - {formatTime(node.time + node.duration)} + + ); + let title = ''; + if (node.planable) { + const planable = data!.planables.find((n) => n.id === node.planable); + title = `Planable: ${planable?.id}`; + } + if (node.type === 'travel') { + title = `Travel: ${node.context.location}`; + } + return ( + onSelect(node)} + description={time} + > + {title} + + ); + }} + ); }; diff --git a/packages/playground/src/router/index.tsx b/packages/playground/src/router/index.tsx new file mode 100644 index 0000000..6206022 --- /dev/null +++ b/packages/playground/src/router/index.tsx @@ -0,0 +1,18 @@ +import { createHashRouter, RouterProvider } from 'react-router-dom'; +import { pages } from '../containers/page'; +import { experiments } from '../containers/experiment'; + +const router = createHashRouter([ + { + path: '/', + children: pages, + }, + { + path: '/experiments', + children: experiments, + }, +]); + +const Router = () => ; + +export { Router }; diff --git a/packages/playground/src/utils/experiments.ts b/packages/playground/src/utils/experiments.ts deleted file mode 100644 index 83f22c0..0000000 --- a/packages/playground/src/utils/experiments.ts +++ /dev/null @@ -1,8 +0,0 @@ -const imports = import.meta.glob('../experiments/*/index.tsx'); - -const experiments = Object.entries(imports).map(([path, loader]) => { - const slug = path.replace('./experiments/', '').replace('/index.tsx', ''); - return { slug, loader }; -}); - -export { experiments }; diff --git a/packages/playground/src/utils/graph.ts b/packages/playground/src/utils/graph.ts index 6205099..2d7d19a 100644 --- a/packages/playground/src/utils/graph.ts +++ b/packages/playground/src/utils/graph.ts @@ -1,4 +1,4 @@ -import { CalulationResult } from '@bob-the-algorithm/core'; +import { AllPlugins, CalulationResult } from '@bob-the-algorithm/core'; function msToHMS(ms: number) { // 1- Convert to seconds: @@ -12,13 +12,13 @@ function msToHMS(ms: number) { seconds = seconds % 60; return hours + ':' + minutes + ':' + seconds; } -const convertResult = (result: CalulationResult) => { +const convertResult = (result: CalulationResult) => { const nodes = result.nodes.map((node) => { - let label = `root (${node.location})`; + let label = `root (${node.context.location})`; if (node.type === 'planable') { label = `task: ${node.planable!.toString()}`; } else if (node.type === 'travel') { - label = `travel->${node.location}`; + label = `travel->${node.context.location}`; } return { id: node.id, diff --git a/packages/playground/src/utils/time.ts b/packages/playground/src/utils/time.ts new file mode 100644 index 0000000..bebdc41 --- /dev/null +++ b/packages/playground/src/utils/time.ts @@ -0,0 +1,6 @@ +const formatTime = (time: number) => { + const toUtc = new Date(time).toUTCString(); + return toUtc.slice(17, 22); +}; + +export { formatTime }; diff --git a/packages/playground/tailwind.config.js b/packages/playground/tailwind.config.js index 35776a5..d0e4bbc 100644 --- a/packages/playground/tailwind.config.js +++ b/packages/playground/tailwind.config.js @@ -1,11 +1,15 @@ /** @type {import('tailwindcss').Config} */ +const path = require('path'); + const { nextui } = require('@nextui-org/react'); +const themePath = require.resolve('@nextui-org/theme/package.json'); +const themeDir = path.dirname(themePath); export default { content: [ './index.html', './src/**/*.{js,ts,jsx,tsx}', - './node_modules/@nextui-org/theme/dist/**/*.{js,ts,jsx,tsx}', + `${themeDir}/dist/**/*.{js,ts,jsx,tsx}`, ], theme: { extend: {}, diff --git a/packages/playground/tsconfig.node.tsbuildinfo b/packages/playground/tsconfig.node.tsbuildinfo deleted file mode 100644 index 6d81e91..0000000 --- a/packages/playground/tsconfig.node.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.d.ts","../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/types/hmrPayload.d.ts","../../node_modules/vite/types/customEvent.d.ts","../../node_modules/rollup/dist/rollup.d.ts","../../node_modules/vite/types/importGlob.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/vite/dist/node/index.d.ts","../../node_modules/@vitejs/plugin-react-swc/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@rollup/pluginutils/types/index.d.ts","../../node_modules/@types/unist/index.d.ts","../../node_modules/@types/hast/index.d.ts","../../node_modules/@types/mdast/index.d.ts","../../node_modules/mdast-util-to-hast/lib/state.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/footnote.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","../../node_modules/mdast-util-to-hast/lib/index.d.ts","../../node_modules/mdast-util-to-hast/index.d.ts","../../node_modules/vfile-message/lib/index.d.ts","../../node_modules/vfile-message/index.d.ts","../../node_modules/vfile/lib/minurl.shared.d.ts","../../node_modules/vfile/lib/index.d.ts","../../node_modules/vfile/index.d.ts","../../node_modules/unified/index.d.ts","../../node_modules/remark-rehype/lib/index.d.ts","../../node_modules/remark-rehype/index.d.ts","../../node_modules/@types/estree-jsx/index.d.ts","../../node_modules/@mdx-js/mdx/lib/plugin/rehype-recma.d.ts","../../node_modules/@mdx-js/mdx/lib/plugin/recma-document.d.ts","../../node_modules/source-map/source-map.d.ts","../../node_modules/@mdx-js/mdx/lib/plugin/recma-stringify.d.ts","../../node_modules/periscopic/types/index.d.ts","../../node_modules/@mdx-js/mdx/lib/plugin/recma-jsx-rewrite.d.ts","../../node_modules/@mdx-js/mdx/lib/core.d.ts","../../node_modules/@mdx-js/mdx/lib/node-types.d.ts","../../node_modules/@mdx-js/mdx/lib/compile.d.ts","../../node_modules/@types/mdx/types.d.ts","../../node_modules/@mdx-js/mdx/lib/util/resolve-evaluate-options.d.ts","../../node_modules/@mdx-js/mdx/lib/evaluate.d.ts","../../node_modules/@mdx-js/mdx/lib/run.d.ts","../../node_modules/@mdx-js/mdx/index.d.ts","../../node_modules/@mdx-js/rollup/lib/index.d.ts","../../node_modules/@mdx-js/rollup/index.d.ts","./vite.config.ts","../../node_modules/@types/acorn/index.d.ts","../../node_modules/@types/color-name/index.d.ts","../../node_modules/@types/color-convert/conversions.d.ts","../../node_modules/@types/color-convert/route.d.ts","../../node_modules/@types/color-convert/index.d.ts","../../node_modules/@types/color/index.d.ts","../../node_modules/@types/ms/index.d.ts","../../node_modules/@types/debug/index.d.ts","../../node_modules/@types/draco3d/index.d.ts","../../node_modules/@types/flat/index.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../node_modules/@types/lodash.foreach/index.d.ts","../../node_modules/@types/lodash.get/index.d.ts","../../node_modules/@types/lodash.kebabcase/index.d.ts","../../node_modules/@types/lodash.mapkeys/index.d.ts","../../node_modules/@types/lodash.omit/index.d.ts","../../node_modules/@types/mdx/index.d.ts","../../node_modules/@types/offscreencanvas/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/react-reconciler/index.d.ts","../../node_modules/@types/scheduler/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/ssri/index.d.ts","../../node_modules/@types/webxr/index.d.ts"],"fileInfos":["a7297ff837fcdf174a9524925966429eb8e5feecc2cc55cc06574e6b092c1eaa",{"version":"2ac9cdcfb8f8875c18d14ec5796a8b029c426f73ad6dc3ffb580c228b58d1c44","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","dc48272d7c333ccf58034c0026162576b7d50ea0e69c3b9292f803fc20720fd5","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"0075fa5ceda385bcdf3488e37786b5a33be730e8bc4aa3cf1e78c63891752ce8","affectsGlobalScope":true},{"version":"c5c5565225fce2ede835725a92a28ece149f83542aa4866cfb10290bff7b8996","affectsGlobalScope":true},{"version":"7d2dbc2a0250400af0809b0ad5f84686e84c73526de931f84560e483eb16b03c","affectsGlobalScope":true},{"version":"f296963760430fb65b4e5d91f0ed770a91c6e77455bacf8fa23a1501654ede0e","affectsGlobalScope":true},{"version":"09226e53d1cfda217317074a97724da3e71e2c545e18774484b61562afc53cd2","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"8b41361862022eb72fcc8a7f34680ac842aca802cf4bc1f915e8c620c9ce4331","affectsGlobalScope":true},{"version":"f7bd636ae3a4623c503359ada74510c4005df5b36de7f23e1db8a5c543fd176b","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"0c20f4d2358eb679e4ae8a4432bdd96c857a2960fd6800b21ec4008ec59d60ea","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"82d0d8e269b9eeac02c3bd1c9e884e85d483fcb2cd168bccd6bc54df663da031","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"b8deab98702588840be73d67f02412a2d45a417a3c097b2e96f7f3a42ac483d1","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"376d554d042fb409cb55b5cbaf0b2b4b7e669619493c5d18d5fa8bd67273f82a","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"c4138a3dd7cd6cf1f363ca0f905554e8d81b45844feea17786cdf1626cb8ea06","affectsGlobalScope":true},{"version":"6ff3e2452b055d8f0ec026511c6582b55d935675af67cdb67dd1dc671e8065df","affectsGlobalScope":true},{"version":"03de17b810f426a2f47396b0b99b53a82c1b60e9cba7a7edda47f9bb077882f4","affectsGlobalScope":true},{"version":"8184c6ddf48f0c98429326b428478ecc6143c27f79b79e85740f17e6feb090f1","affectsGlobalScope":true},{"version":"261c4d2cf86ac5a89ad3fb3fafed74cbb6f2f7c1d139b0540933df567d64a6ca","affectsGlobalScope":true},{"version":"6af1425e9973f4924fca986636ac19a0cf9909a7e0d9d3009c349e6244e957b6","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"15a630d6817718a2ddd7088c4f83e4673fde19fa992d2eae2cf51132a302a5d3","affectsGlobalScope":true},{"version":"b7e9f95a7387e3f66be0ed6db43600c49cec33a3900437ce2fd350d9b7cb16f2","affectsGlobalScope":true},{"version":"01e0ee7e1f661acedb08b51f8a9b7d7f959e9cdb6441360f06522cc3aea1bf2e","affectsGlobalScope":true},{"version":"ac17a97f816d53d9dd79b0d235e1c0ed54a8cc6a0677e9a3d61efb480b2a3e4e","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"9cc66b0513ad41cb5f5372cca86ef83a0d37d1c1017580b7dace3ea5661836df","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"307c8b7ebbd7f23a92b73a4c6c0a697beca05b06b036c23a34553e5fe65e4fdc","affectsGlobalScope":true},{"version":"f35a831e4f0fe3b3697f4a0fe0e3caa7624c92b78afbecaf142c0f93abfaf379","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"587f13f1e8157bd8cec0adda0de4ef558bb8573daa9d518d1e2af38e87ecc91f","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"d32f90e6cf32e99c86009b5f79fa50bc750fe54e17137d9bb029c377a2822ee2","affectsGlobalScope":true},"e6f0b909b1c34b38407a6c8b6c92e56a2635527d07dbabe765cfa729c26f3c20",{"version":"c81c51f43e343b6d89114b17341fb9d381c4ccbb25e0ee77532376052c801ba7","affectsGlobalScope":true},"3dd49afd822c82b63b3905a13e22240f34cf367aea4f4dd0e6564f4bddcb8370","57135ce61976a8b1dadd01bb412406d1805b90db6e8ecb726d0d78e0b5f76050",{"version":"49479e21a040c0177d1b1bc05a124c0383df7a08a0726ad4d9457619642e875a","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","f302f3a47d7758f67f2afc753b9375d6504dde05d2e6ecdb1df50abbb131fc89","93db4c949a785a3dbef7f5e08523be538e468c580dd276178b818e761b3b68cd","5b1c0a23f464f894e7c2b2b6c56df7b9afa60ed48c5345f8618d389a636b2108","be2b092f2765222757c6441b86c53a5ea8dfed47bbc43eab4c5fe37942c866b3","8e6b05abc98adba15e1ac78e137c64576c74002e301d682e66feb77a23907ab8","1ca735bb3d407b2af4fbee7665f3a0a83be52168c728cc209755060ba7ed67bd",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"6e335a70826a634c5a1a1fa36a2dacbf3712ef2be7a517540ae1de8a1e8ea4f6","affectsGlobalScope":true},"576115ea69691c96f8f2b9fcfde5d0fb9b5f047dfa7dec242ebc08694c3b3190","df8529626079d6f9d5d3cd7b6fb7db9cda5a3118d383d8cd46c52aadb59593e7","55709608060f77965c270ac10ac646286589f1bd1cb174fff1778a2dd9a7ef31","3122a3f1136508a27a229e0e4e2848299028300ffa11d0cdfe99df90c492fe20","42b40e40f2a358cda332456214fad311e1806a6abf3cebaaac72496e07556642","51fd089a29b2a91c69bdaa28882cf1340dac3df3a068327b6a044d21a79bf8f5",{"version":"0066ebbd0f4ef9656983a2017969afa6460879e894ebaf6f2969631ad9b5b430","affectsGlobalScope":true},"fe6dba0e8c69f2b244e3da38e53dd2cc9e51b2543e647e805396af73006613f7","5e2b91328a540a0933ab5c2203f4358918e6f0fe7505d22840a891a6117735f1","3abc3512fa04aa0230f59ea1019311fd8667bd935d28306311dccc8b17e79d5d",{"version":"5810080a0da989a944d3b691b7b479a4a13c75947fb538abb8070710baa5ccee","affectsGlobalScope":true},{"version":"19da7150ca062323b1db6311a6ef058c9b0a39cc64d836b5e9b75d301869653b","affectsGlobalScope":true},"1349077576abb41f0e9c78ec30762ff75b710208aff77f5fdcc6a8c8ce6289dd","e2ce82603102b5c0563f59fb40314cc1ff95a4d521a66ad14146e130ea80d89c","a3e0395220255a350aa9c6d56f882bfcb5b85c19fddf5419ec822cf22246a26d","c27b01e8ddff5cd280711af5e13aecd9a3228d1c256ea797dd64f8fdec5f7df5","898840e876dfd21843db9f2aa6ae38ba2eab550eb780ff62b894b9fbfebfae6b","8904e5b670bbfc712dda607853de9227206e7dad93ac97109fe30875c5f12b78","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","785e5be57d4f20f290a20e7b0c6263f6c57fd6e51283050756cef07d6d651c68","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","164deb2409ac5f4da3cd139dbcee7f7d66753d90363a4d7e2db8d8874f272270",{"version":"a54ee34c2cc03ec4bbf0c9b10a08b9f909a21b3314f90a743de7b12b85867cef","affectsGlobalScope":true},{"version":"8a985c7d30aea82342d5017730b546bb2b734fe37a2684ca55d4734deb019d58","affectsGlobalScope":true},"ad08154d9602429522cac965a715fde27d421d69b24756c5d291877dda75353e","5bc85813bfcb6907cc3a960fec8734a29d7884e0e372515147720c5991b8bc22","812b25f798033c202baedf386a1ccc41f9191b122f089bffd10fdccce99fba11","993325544790073f77e945bee046d53988c0bc3ac5695c9cf8098166feb82661",{"version":"4d06f3abc2a6aae86f1be39e397372f74fb6e7964f594d645926b4a3419cc15d","affectsGlobalScope":true},{"version":"0e08c360c9b5961ecb0537b703e253842b3ded53151ee07024148219b61a8baf","affectsGlobalScope":true},"2ce2210032ccaff7710e2abf6a722e62c54960458e73e356b6a365c93ab6ca66","5ba5b760345053acdf5beb1a9048ff43a51373f3d87849963779c1711ea7cbcc","16a3080e885ed52d4017c902227a8d0d8daf723d062bec9e45627c6fdcd6699b",{"version":"0bd9543cd8fc0959c76fb8f4f5a26626c2ed62ef4be98fd857bce268066db0a2","affectsGlobalScope":true},"1ca6858a0cbcd74d7db72d7b14c5360a928d1d16748a55ecfa6bfaff8b83071b",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"4905d61a3e1e9b12e12dbf8660fc8d2f085734da6da8d725f395bf41a04853d6","850040826cfa77593d44f44487133af21917f4f21507258bd4269501b80d32f0","8f07f2b6514744ac96e51d7cb8518c0f4de319471237ea10cf688b8d0e9d0225","bcb6ea18f23dae2c48459d7b86d3adccd6898f824fcbf9da08b935f559896580","1363ba7d52f2353d0c4306d0ecdaf171bf4509c0148842f9fd8d3986c098a2eb","11e1ca6d427a2d9472ca610ef12698684e2809ca463c5518cc9f883e96288caf","739c2c46edc112421fc023c24b4898b1f413f792bb6a02b40ba182c648e56c2f","858d0d831826c6eb563df02f7db71c90e26deadd0938652096bea3cc14899700","8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","18c04c22baee54d13b505fa6e8bcd4223f8ba32beee80ec70e6cac972d1cc9a6","5e92a2e8ba5cbcdfd9e51428f94f7bd0ab6e45c9805b1c9552b64abaffad3ce3","53ca39fe70232633759dd3006fc5f467ecda540252c0c819ab53e9f6ad97b226","e7174a839d4732630d904a8b488f22380e5bcf1d6405d1f59614e10795eca17d","7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","b9261ac3e9944d3d72c5ee4cf888ad35d9743a5563405c6963c4e43ee3708ca4","c84fd54e8400def0d1ef1569cafd02e9f39a622df9fa69b57ccc82128856b916","c7a38c1ef8d6ae4bf252be67bd9a8b012b2cdea65bd6225a3d1a726c4f0d52b6","e773630f8772a06e82d97046fc92da59ada8414c61689894fff0155dd08f102c","74f2815d9e1b8530120dcad409ed5f706df8513c4d93e99fc6213997aa4dd60e","9d1f36ccd354f2e286b909bf01d626a3a28dd6590770303a18afa7796fe50db9","c4bc6a572f9d763ac7fa0d839be3de80273a67660e2002e3225e00ef716b4f37","106e607866d6c3e9a497a696ac949c3e2ec46b6e7dda35aabe76100bf740833b","8a6c755dc994d16c4e072bba010830fa2500d98ff322c442c7c91488d160a10d","d4514d11e7d11c53da7d43b948654d6e608a3d93d666a36f8d01e18ece04c9bd","3d65182eff7bbb16de1a69e17651c51083f740af11a1a92359be6dab939e8bcf","bb53fe9074a25dfa9410e2ee1c4db8c71d02275f916d2019de7fd9cadd50c30b","77926a706478940016e826b162f95f8e4077b1ad3184b2592dc03bd8b33e0384","3799d8f9dc29c015f7d9606c674ad4cf731abc34b5d716cdc4e0c44ed035048d","62da501a446550b546984bbddd528cd14ccac89d0dd6628f7b763ff1220957a7","bee89e1eb6425eb49894f3f25e4562dc2564e84e5aa7610b7e13d8ecddf8f5db","bd71c74c0a6e0417bd42b0798895968db546e2e40a27cb2cdfe4498a150bb51c","0670eede14b39fd186fe7e224db70510158af5279528d12292df9b980867c1d0","3d2cd8f3047fff04a71e7037a6a4cb9f4accb28dbd8c0d83164d414811025af0","5774751340e987a6a9e4a5dcc03ff68a6515adc2b91423e1af2f660fc8f30e81","8b0a2400ba7522569871331988f820ba4cfc386f845b01058c63a62ad9db8d03","d3e29566a694a4068d450a58f59e3a3662fc12f74345343d441ef4d954984503","f7b3e68f7972250809e5b0cbd8f0e1f9da8c1dbf70244f289b204f1b49c2d398","4c7c99f7787c5c2ea6cbd911a7b5c7c2a4ee1cb9d7f538805ee2550cf1f1fb99","1557bf37fc8d5f129436caa0212f25d6cbeaf9d20e2e3a60b13306ff62a1d7a0","9a1e77270d63875c9a38630f9a7a9126f9a8df0245d5eb220832a65d408079eb","e48d0036e626bb40f236e236670722445ffff854908c2d9515b2b5b7f677794f","30f9018873d6d80256298011161a664a14b927f719f8a7605ceb8b49bc8808da","f543ea0fe820064a2cdbb39d2b2846c507467c4771eafcda2091da43b05c077b","9066d02264a67aae05410c340c8fa41a79bb076c33d1c6ae3ec29a05828f4c05","00435c177c3da6998c2f95b9e71239f00cfabd3461401cc4d8606ee3afb732b1","d432a2956d1efa172e1c60a8186a81657f2f9f4ba449c6abdfa9d057d484c45d","bc6679207eccaa45e49b930ad45ec8e7903bd8b0868e086d8bad91f79c914ca0","4dd35e71d52007465787dd2f374cc756a29e6c9b96dc237d0465d0294170c529","7ebf1f440efe6efebeb58a44000820cbe959da9d9496621fa6dcbc02666e3002","08a9e70641597e23d00be62e3a94b69ad93c5cf5541ec7bfdeb5e9f69c845507","ded59c554118589a8729fb70429318e41e7e8155b2aff5f3d7a77933e49dbc10","3af507089e65c1472a87e5f7345ec18838d7e923c2c06fdad3d31543278af762","c867e6d7de78f96eb55b534b3aca1da4e029a6ab0e4ea9d0610acf11d737f8a0","2df075b38e2135201202640fe92bce8d03fb319fece410b088a22ab4e1be7702","b9f07153f8e881c4cca036abccaa134df30cf09a3381772d089d1eeabe45770d","88213e972b5989f217627bdcb79a697f66821e8ff135265712346d532243084f","bf6122555f34582e6d5424a88676d90f2333e0e920764895c15d39b6c856053c","bf04a1c9ccfeabf521b7b97f388d05bc5f628422253399eb157fec0d9cd213ce","3c6ecfcc6ac82b5866368d1efbddeeb3bfae03962747bf6928d8faa092e5b369","06d19317f4c8474255b3ceab7102763faf7ff0aa4cc305384b13ccb6d27b2e50","ebe1694b3a7a0265b9cf8fb3bfed6575907247b61add671ea9771fd6715d1b29","bdf4a7242e5cce621b5ba689351af780b0b665d97ea88c71f50801aa80560236","e0c7d85789b8811c90a8d21e25021349e8a756a256ae42d9e816ecd392f00f71","bb8aba28c9589792407d6ae0c1a6568f3ddc40be20da25bc1939e2c9d76436bb","8fa1868ab5af3818ff4746f383ea84206596e284f7dc5ffd40a0fac08ed093f9","8d4537ea6fcdde620af5bfb4e19f88db40d44073f76f567283aa043b81ef8a3e","0bb848976eff244e33741d63372cbfb4d15153a92c171d0a374a3c0ef327a175","af79b166f5d41ec2ebae57e9b67df564452b90ae3f0af4cb3c2d8ad5adbfd2db","6bd6ae32288500128ae355de57d6bc3b5884f37e1e5d5ac597b142f63b3c8121","a6634dbc56e3d75efac697e59fef032aa15cc537acf7f6ad3a045001f48483f8","99373707de2fdfdce847a4d138c36cf137b243ad206cf82d32e0653e2f0dcb4e","16504c568924627fcf340804a3a1d3845490194df479983147007d83ba347a18","7253cdf6610e2d0b08b7f368bee406b28572f0764de87c1c68309ac713a4d6f5","b90c59ac4682368a01c83881b814738eb151de8a58f52eb7edadea2bcffb11b9","32e1fb333973369500d670e1a6adfbb3314d6b582b58062a46dc108789c183eb","e040fa1afb9b8d5bc1fde03bbf3cf82a42f35f7b03a088819011a87d5dab6e74","5156efecb13dffb9aefc31569a4e5a5c51c81a2063099a13e6f6780a283f94fd","585a7fca7507dd0d5fa46a5ec10b7b70c0cea245b72fc3d796286f04dacf96e4","7bc925c163a15f97148704174744d032f28ad153ff9d7485e109a22b5de643dc","c3dc433c0306a75261a665a4d8fd6d73d7274625e9665befd1c8d7641faeddd7","62ba3a124b971abfc9cc9d42bfde270d7b1d74c4de8c2b74dbf0557552afc132","9fc9575d1a0e89596012c6f5876b5c9654e1392fbd5d6d3d436bc9198ead87a0","f158579f034415f0bad9f6f41ed3ac0768dfe57dc36776d52e09c96a901c5e45","8e6a2d23d02da219dc17ca819efce29e1099883425f56e6c803c19d913b11173","bb2f509fedbf353c2dbb5626f25751308dda2cd304be0c1dfb7cf77f47fc56b3","1d81a71406d6fa67f8917a75cc8cade1b4152188f0e8c2286fe20b4c0bb1c7c1","54a411078cc8c72a819b47fc0dc00661a2187e62b7bb542458d5e2bcc5249333",{"version":"eb13c0bf3fcee2e1f923aaea8ef6deeab1208b8a6266813e1fd5bcc1a1470680","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"},"3777eb752cef9aa8dd35bb997145413310008aa54ec44766de81a7ad891526cd","f0cb4b3ab88193e3e51e9e2622e4c375955003f1f81239d72c5b7a95415dad3e","206fabd39297fecdcd46451a5695bbb4df96761f4818564f1ae4f3a935b8f683","9f5868b1ffbb19aabaf87e4f756900bb76379f9e66699a163f94de21dba16835","0b0a6280269769fdc3532e3e44ab71f4966c5f79933dbc2157075b24aa2774bf","a3a8f059f636d3b82bfc95d368563dd89ea161eda5629c4ffa0cf6f9e17ea5c2","6a9c5127096b35264eb7cd21b2417bfc1d42cceca9ba4ce2bb0c3410b7816042","93b7325b49dfbf613d940ed0e471216657b2d77459dac34f1b5b1678f08f884c","bf507af4c8ffdea5ee0c23988e32959955b19d724b75f94c60b323907539bb02","f8ced2901ec3304a03fe77c61efa5bce356d8de2674ed73eb6767dda5f6cf053","dca41e86e89dfb2e85e6935260250f02eb6683b86c2fa16bec729ddd1bcd9b4b","32ab25b7b28b24a138d879ca371b18c8fdfdd564ad5107e1333c5aa5d5fea494","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","dcd91d3b697cb650b95db5471189b99815af5db2a1cd28760f91e0b12ede8ed5","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","30abc554c7ad13063a02ddd06757929b34357aea1f6fcf4ca39114cb0fc19384","6b13171e475addfcc880d3b973c3f59e9c660c4cc1f05ba5e295c1c0cc2b9f9e","7990d4efa7515d50f75a341b8e3330987316fa9bdedef893f5dea07db43d9173","448d66924f8b2381d5788e8ef3c305fb852c9fc2c9f38bc45b9da7613f9ac625","055900c21a4212d93fad90234259a2799728fd8dfc3171f14631374a6a3174f5","8ab5fe27912c8f1d58fa58794f542cb3cea68984734f556a26195bffd4c74524","2cbb9a34f6b000f56b06119c624608d19f530ce727fbbbe27cc5dc122aa92776",{"version":"919f60fbfba888b65ed36f16d35225bdf478216665cce1f720d21c4c51b04811","affectsGlobalScope":true},"6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea",{"version":"549df62b64a71004aee17685b445a8289013daf96246ce4d9b087d13d7a27a61","affectsGlobalScope":true},"4c68749a564a6facdf675416d75789ee5a557afda8960e0803cf6711fa569288","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"74a5b16408f6c27e335559a4eb4b640b7cacc5d4839b659bf262c5e97b6c2b5d","affectsGlobalScope":true},"a95b76aef31395752eb5cb7b386be2e287fdc32dfdf7bdbbb666e333133b1ef7","097ddb99d443f0fafd23af7a3ce196ba07cb879ec64de8600fd528626bd24b10","7ccce4adb23a87a044c257685613126b47160f6975b224cea5f6af36c7f37514","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","55e103448f452988dbdf65e293607c77fb91a967744bad2a72f1a36765e7e88d","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","a1a261624efb3a00ff346b13580f70f3463b8cdcc58b60f5793ff11785d52cab","2e588ef3417282f95b0c54b657dba1fa6d05abfaddc5093c3988fc0415abbfbe",{"version":"ab37377053a80a10861640d5facfdae0ad974b166ff51750943ca33aecdb149b","affectsGlobalScope":true}],"root":[189],"options":{"allowSyntheticDefaultImports":true,"composite":true,"module":99,"skipLibCheck":true},"fileIdsList":[[95,179,180,181,184,185],[95,168,179],[95,169,171,173,174,176,178],[95,168,182,183],[95],[95,131,169,172],[95,131,169,172,177],[95,131,169,172,175],[95,131,134,163,169,172],[95,179],[95,187],[95,104,107,132,186],[95,131,172],[95,191],[95,192,193],[95,192],[95,194],[95,196],[95,133],[95,213],[95,201,203,204,205,206,207,208,209,210,211,212,213],[95,201,202,204,205,206,207,208,209,210,211,212,213],[95,202,203,204,205,206,207,208,209,210,211,212,213],[95,201,202,203,205,206,207,208,209,210,211,212,213],[95,201,202,203,204,206,207,208,209,210,211,212,213],[95,201,202,203,204,205,207,208,209,210,211,212,213],[95,201,202,203,204,205,206,208,209,210,211,212,213],[95,201,202,203,204,205,206,207,209,210,211,212,213],[95,201,202,203,204,205,206,207,208,210,211,212,213],[95,201,202,203,204,205,206,207,208,209,211,212,213],[95,201,202,203,204,205,206,207,208,209,210,212,213],[95,201,202,203,204,205,206,207,208,209,210,211,213],[95,201,202,203,204,205,206,207,208,209,210,211,212],[95,182,219],[49,95],[52,95],[53,58,86,95],[54,65,66,73,83,94,95],[54,55,65,73,95],[56,95],[57,58,66,74,95],[58,83,91,95],[59,61,65,73,95],[60,95],[61,62,95],[65,95],[63,65,95],[65,66,67,83,94,95],[65,66,67,80,83,86,95],[95,99],[61,65,68,73,83,94,95],[65,66,68,69,73,83,91,94,95],[68,70,83,91,94,95],[49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101],[65,71,95],[72,94,95,99],[61,65,73,83,95],[74,95],[75,95],[52,76,95],[77,93,95,99],[78,95],[79,95],[65,80,81,95],[80,82,95,97],[53,65,83,84,85,86,95],[53,83,85,95],[83,84,95],[86,95],[87,95],[52,83,95],[65,89,90,95],[89,90,95],[58,73,83,91,95],[92,95],[73,93,95],[53,68,79,94,95],[58,95],[83,95,96],[72,95,97],[95,98],[53,58,65,67,76,83,94,95,97,99],[83,95,100],[95,225],[95,221,222,223,224],[95,229,268],[95,229,253,268],[95,268],[95,229],[95,229,254,268],[95,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267],[95,254,268],[58,83,95,102],[95,129],[95,134,136,161,162,163],[95,134,135,136,163],[95,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160],[95,134,135,163],[95,124],[95,122,124],[95,113,121,122,123,125],[95,111],[95,114,119,124,127],[95,110,127],[95,114,115,118,119,120,127],[95,114,115,116,118,119,127],[95,111,112,113,114,115,119,120,121,123,124,125,127],[95,127],[95,109,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126],[95,109,127],[95,114,116,117,119,120,127],[95,118,127],[95,119,120,124,127],[95,112,122],[95,163,170],[95,134,135,162,163,169],[95,109],[95,133,168],[95,164],[95,167],[95,133,165,166,168],[65,66,68,70,73,83,91,94,95,100,102,103,104,105,106,107,108,128],[95,105],[95,107],[95,129,130,188],[129]],"referencedMap":[[186,1],[181,2],[179,3],[184,4],[180,5],[174,6],[178,7],[176,8],[173,9],[185,5],[183,10],[188,11],[187,12],[132,13],[190,13],[192,14],[194,15],[193,16],[191,5],[195,17],[197,18],[198,5],[172,13],[131,5],[199,5],[134,19],[200,5],[214,20],[215,20],[216,20],[217,20],[218,20],[202,21],[203,22],[201,23],[204,24],[205,25],[206,26],[207,27],[208,28],[209,29],[210,30],[211,31],[212,32],[213,33],[135,19],[219,34],[182,5],[196,5],[49,35],[50,35],[52,36],[53,37],[54,38],[55,39],[56,40],[57,41],[58,42],[59,43],[60,44],[61,45],[62,45],[64,46],[63,47],[65,46],[66,48],[67,49],[51,50],[101,5],[68,51],[69,52],[70,53],[102,54],[71,55],[72,56],[73,57],[74,58],[75,59],[76,60],[77,61],[78,62],[79,63],[80,64],[81,64],[82,65],[83,66],[85,67],[84,68],[86,69],[87,70],[88,71],[89,72],[90,73],[91,74],[92,75],[93,76],[94,77],[95,78],[96,79],[97,80],[98,81],[99,82],[100,83],[220,5],[221,5],[226,84],[227,84],[222,5],[225,85],[228,5],[224,5],[253,86],[254,87],[229,88],[232,88],[251,86],[252,86],[242,86],[241,89],[239,86],[234,86],[247,86],[245,86],[249,86],[233,86],[246,86],[250,86],[235,86],[236,86],[248,86],[230,86],[237,86],[238,86],[240,86],[244,86],[255,90],[243,86],[231,86],[268,91],[267,5],[262,90],[264,92],[263,90],[256,90],[257,90],[259,90],[261,90],[265,92],[266,92],[258,92],[260,92],[269,93],[133,5],[270,5],[130,94],[223,5],[103,5],[163,95],[137,96],[138,96],[139,96],[140,96],[141,96],[142,96],[143,96],[144,96],[145,96],[146,96],[147,96],[161,97],[148,96],[149,96],[150,96],[151,96],[152,96],[153,96],[154,96],[155,96],[157,96],[158,96],[156,96],[159,96],[160,96],[162,96],[136,98],[177,13],[125,99],[123,100],[124,101],[112,102],[113,100],[120,103],[111,104],[116,105],[126,5],[117,106],[122,107],[128,108],[127,109],[110,110],[118,111],[119,112],[114,113],[121,99],[115,114],[171,115],[170,116],[107,5],[109,117],[175,5],[1,5],[47,5],[48,5],[9,5],[13,5],[12,5],[3,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[21,5],[4,5],[5,5],[22,5],[26,5],[23,5],[24,5],[25,5],[27,5],[28,5],[29,5],[6,5],[30,5],[31,5],[32,5],[33,5],[7,5],[37,5],[34,5],[35,5],[36,5],[38,5],[8,5],[39,5],[44,5],[45,5],[40,5],[41,5],[42,5],[43,5],[2,5],[46,5],[11,5],[10,5],[169,118],[165,119],[164,19],[168,120],[167,121],[166,5],[129,122],[106,123],[105,5],[108,5],[104,124],[189,125]],"exportedModulesMap":[[186,1],[181,2],[179,3],[184,4],[180,5],[174,6],[178,7],[176,8],[173,9],[185,5],[183,10],[188,11],[187,12],[132,13],[190,13],[192,14],[194,15],[193,16],[191,5],[195,17],[197,18],[198,5],[172,13],[131,5],[199,5],[134,19],[200,5],[214,20],[215,20],[216,20],[217,20],[218,20],[202,21],[203,22],[201,23],[204,24],[205,25],[206,26],[207,27],[208,28],[209,29],[210,30],[211,31],[212,32],[213,33],[135,19],[219,34],[182,5],[196,5],[49,35],[50,35],[52,36],[53,37],[54,38],[55,39],[56,40],[57,41],[58,42],[59,43],[60,44],[61,45],[62,45],[64,46],[63,47],[65,46],[66,48],[67,49],[51,50],[101,5],[68,51],[69,52],[70,53],[102,54],[71,55],[72,56],[73,57],[74,58],[75,59],[76,60],[77,61],[78,62],[79,63],[80,64],[81,64],[82,65],[83,66],[85,67],[84,68],[86,69],[87,70],[88,71],[89,72],[90,73],[91,74],[92,75],[93,76],[94,77],[95,78],[96,79],[97,80],[98,81],[99,82],[100,83],[220,5],[221,5],[226,84],[227,84],[222,5],[225,85],[228,5],[224,5],[253,86],[254,87],[229,88],[232,88],[251,86],[252,86],[242,86],[241,89],[239,86],[234,86],[247,86],[245,86],[249,86],[233,86],[246,86],[250,86],[235,86],[236,86],[248,86],[230,86],[237,86],[238,86],[240,86],[244,86],[255,90],[243,86],[231,86],[268,91],[267,5],[262,90],[264,92],[263,90],[256,90],[257,90],[259,90],[261,90],[265,92],[266,92],[258,92],[260,92],[269,93],[133,5],[270,5],[130,94],[223,5],[103,5],[163,95],[137,96],[138,96],[139,96],[140,96],[141,96],[142,96],[143,96],[144,96],[145,96],[146,96],[147,96],[161,97],[148,96],[149,96],[150,96],[151,96],[152,96],[153,96],[154,96],[155,96],[157,96],[158,96],[156,96],[159,96],[160,96],[162,96],[136,98],[177,13],[125,99],[123,100],[124,101],[112,102],[113,100],[120,103],[111,104],[116,105],[126,5],[117,106],[122,107],[128,108],[127,109],[110,110],[118,111],[119,112],[114,113],[121,99],[115,114],[171,115],[170,116],[107,5],[109,117],[175,5],[1,5],[47,5],[48,5],[9,5],[13,5],[12,5],[3,5],[14,5],[15,5],[16,5],[17,5],[18,5],[19,5],[20,5],[21,5],[4,5],[5,5],[22,5],[26,5],[23,5],[24,5],[25,5],[27,5],[28,5],[29,5],[6,5],[30,5],[31,5],[32,5],[33,5],[7,5],[37,5],[34,5],[35,5],[36,5],[38,5],[8,5],[39,5],[44,5],[45,5],[40,5],[41,5],[42,5],[43,5],[2,5],[46,5],[11,5],[10,5],[169,118],[165,119],[164,19],[168,120],[167,121],[166,5],[129,122],[106,123],[105,5],[108,5],[104,124],[189,126]],"semanticDiagnosticsPerFile":[186,181,179,184,180,174,178,176,173,185,183,188,187,132,190,192,194,193,191,195,197,198,172,131,199,134,200,214,215,216,217,218,202,203,201,204,205,206,207,208,209,210,211,212,213,135,219,182,196,49,50,52,53,54,55,56,57,58,59,60,61,62,64,63,65,66,67,51,101,68,69,70,102,71,72,73,74,75,76,77,78,79,80,81,82,83,85,84,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,220,221,226,227,222,225,228,224,253,254,229,232,251,252,242,241,239,234,247,245,249,233,246,250,235,236,248,230,237,238,240,244,255,243,231,268,267,262,264,263,256,257,259,261,265,266,258,260,269,133,270,130,223,103,163,137,138,139,140,141,142,143,144,145,146,147,161,148,149,150,151,152,153,154,155,157,158,156,159,160,162,136,177,125,123,124,112,113,120,111,116,126,117,122,128,127,110,118,119,114,121,115,171,170,107,109,175,1,47,48,9,13,12,3,14,15,16,17,18,19,20,21,4,5,22,26,23,24,25,27,28,29,6,30,31,32,33,7,37,34,35,36,38,8,39,44,45,40,41,42,43,2,46,11,10,169,165,164,168,167,166,129,106,105,108,104,189],"latestChangedDtsFile":"./vite.config.d.ts"},"version":"5.2.2"} \ No newline at end of file diff --git a/packages/playground/vite.config.d.ts b/packages/playground/vite.config.d.ts deleted file mode 100644 index 340562a..0000000 --- a/packages/playground/vite.config.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const _default: import("vite").UserConfig; -export default _default; diff --git a/packages/playground/vite.config.js b/packages/playground/vite.config.js index 6ed9cbd..7f43f81 100644 --- a/packages/playground/vite.config.js +++ b/packages/playground/vite.config.js @@ -1,9 +1,11 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react-swc'; import mdx from '@mdx-js/rollup'; -var ASSET_URL = process.env.ASSET_URL || ''; + +const ASSET_URL = process.env.ASSET_URL || ''; + // https://vitejs.dev/config/ export default defineConfig({ - base: ASSET_URL, - plugins: [mdx(), react()], + base: ASSET_URL, + plugins: [mdx(), react()], }); diff --git a/packages/playground/vite.config.ts b/packages/playground/vite.config.ts deleted file mode 100644 index 7f43f81..0000000 --- a/packages/playground/vite.config.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react-swc'; -import mdx from '@mdx-js/rollup'; - -const ASSET_URL = process.env.ASSET_URL || ''; - -// https://vitejs.dev/config/ -export default defineConfig({ - base: ASSET_URL, - plugins: [mdx(), react()], -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7e77a9..230f247 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,6 +69,12 @@ importers: react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) + react-json-tree: + specifier: ^0.18.0 + version: 0.18.0(@types/react@18.2.15)(react@18.2.0) + react-router-dom: + specifier: ^6.16.0 + version: 6.16.0(react-dom@18.2.0)(react@18.2.0) tailwindcss: specifier: ^3.3.3 version: 3.3.3(ts-node@10.9.1) @@ -3168,6 +3174,11 @@ packages: react: 18.2.0 dev: false + /@remix-run/router@1.9.0: + resolution: {integrity: sha512-bV63itrKBC0zdT27qYm6SDZHlkXwFL1xMBuhkn+X7l0+IIhNaH5wuuvZKp6eKhCD4KFhujhfhCT1YxXW6esUIA==} + engines: {node: '>=14.0.0'} + dev: false + /@rollup/pluginutils@5.0.4(rollup@3.28.1): resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} engines: {node: '>=14.0.0'} @@ -3350,6 +3361,10 @@ packages: '@types/estree': 1.0.1 dev: true + /@types/base16@1.0.3: + resolution: {integrity: sha512-rjrIWFr73ylMjEQuU1OQjkoIDcLR2/dIwiopZe2S5ASo5eoSYBxaAnGtwTUhWc5oWefQXxHRFmGDelYR5yMcgA==} + dev: false + /@types/color-convert@2.0.1: resolution: {integrity: sha512-GwXanrvq/tBHJtudbl1lSy9Ybt7KS9+rA+YY3bcuIIM+d6jSHUr+5yjO83gtiRpuaPiBccwFjSnAK2qSrIPA7w==} dependencies: @@ -4018,6 +4033,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: false + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -4240,6 +4259,13 @@ packages: resolution: {integrity: sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==} dev: false + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + /color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -5856,6 +5882,10 @@ packages: resolution: {integrity: sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg==} dev: true + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + /lodash.foreach@4.5.0: resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==} dev: false @@ -6814,6 +6844,18 @@ packages: engines: {node: '>=8'} dev: false + /react-base16-styling@0.9.1: + resolution: {integrity: sha512-1s0CY1zRBOQ5M3T61wetEpvQmsYSNtWEcdYzyZNxKa8t7oDvaOn9d21xrGezGAHFWLM7SHcktPuPTrvoqxSfKw==} + dependencies: + '@babel/runtime': 7.22.15 + '@types/base16': 1.0.3 + '@types/lodash': 4.14.199 + base16: 1.0.0 + color: 3.2.1 + csstype: 3.1.2 + lodash.curry: 4.1.1 + dev: false + /react-composer@5.0.3(react@18.2.0): resolution: {integrity: sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==} peerDependencies: @@ -6835,6 +6877,19 @@ packages: /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + /react-json-tree@0.18.0(@types/react@18.2.15)(react@18.2.0): + resolution: {integrity: sha512-Qe6HKSXrr++n9Y31nkRJ3XvQMATISpqigH1vEKhLwB56+nk5thTP0ITThpjxY6ZG/ubpVq/aEHIcyLP/OPHxeA==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + '@babel/runtime': 7.22.15 + '@types/lodash': 4.14.199 + '@types/react': 18.2.15 + react: 18.2.0 + react-base16-styling: 0.9.1 + dev: false + /react-merge-refs@1.1.0: resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==} dev: true @@ -6885,6 +6940,29 @@ packages: use-sidecar: 1.1.2(@types/react@18.2.15)(react@18.2.0) dev: false + /react-router-dom@6.16.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-aTfBLv3mk/gaKLxgRDUPbPw+s4Y/O+ma3rEN1u8EgEpLpPe6gNjIsWt9rxushMHHMb7mSwxRGdGlGdvmFsyPIg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.9.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.16.0(react@18.2.0) + dev: false + + /react-router@6.16.0(react@18.2.0): + resolution: {integrity: sha512-VT4Mmc4jj5YyjpOi5jOf0I+TYzGpvzERy4ckNSvSh2RArv8LLoCxlsZ2D+tc7zgjxcY34oTz2hZaeX5RVprKqA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + dependencies: + '@remix-run/router': 1.9.0 + react: 18.2.0 + dev: false + /react-style-singleton@2.2.1(@types/react@18.2.15)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'}