From 3c9567fa8e467f9bf588b9c385c6ab3625bce4e9 Mon Sep 17 00:00:00 2001 From: Timur Bazhirov Date: Wed, 21 Dec 2022 16:03:38 -0800 Subject: [PATCH 01/80] Update Flowchart-Designer.md --- Flowchart-Designer.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Flowchart-Designer.md b/Flowchart-Designer.md index 76a923d0..12d69e62 100644 --- a/Flowchart-Designer.md +++ b/Flowchart-Designer.md @@ -35,4 +35,10 @@ We leave exact timing to the candidate. Must fit Within 5 days total. # Examples -To view examples or discuss this task more in details, please [contact us](README.md). +We recommend reviewing the following: + +- Introduction to Flowcharts: https://www.geeksforgeeks.org/an-introduction-to-flowcharts/ +- An example convergence workflow: https://docs.mat3ra.com/models/auxiliary-concepts/reciprocal-space/convergence/ +- ReactFlow library examples: https://reactflow.dev/docs/examples/overview/ and https://pro.reactflow.dev/pro-examples + +To discuss this task more in details, please [contact us](README.md). From 6a718045d438b805e9d6159a8cd0f6f2c2d2469e Mon Sep 17 00:00:00 2001 From: Timur Bazhirov Date: Fri, 10 Feb 2023 17:30:14 -0800 Subject: [PATCH 02/80] Update Materials-Designer.md --- Materials-Designer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Materials-Designer.md b/Materials-Designer.md index 611f7904..3af1c5d8 100644 --- a/Materials-Designer.md +++ b/Materials-Designer.md @@ -4,9 +4,9 @@ # Overview -Create a skeleton IDE (integrated development environment) for materials design. Close to Adobe Dreamweaver (or any other IDE) - when you can change html-markup and simultaneously see the result in another tab. We edit material in XYZ format and view result in 3D. +Create a skeleton IDE (integrated development environment) for materials design, where one can change text and simultaneously see the visual result in another tab. We edit material in XYZ format and view result in 3D. -Front-end developers: use Meteor and React.js and minimalistic UX/UI. +Front-end developers: use React.js and minimalistic UX/UI. Pure UI/UX designers: create high fidelity mockups.  From 96e01f3753f57a38418013fee956b11f02942737 Mon Sep 17 00:00:00 2001 From: Timur Bazhirov Date: Fri, 10 Feb 2023 17:34:03 -0800 Subject: [PATCH 03/80] fix: file name in URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 414438d3..6c154cfb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Each file represents an assignment similar to what one would get when hired. | Front-End / UX | [Materials Designer](Materials-Designer.md) | ReactJS / UX Design, ThreeJS | | Front-End / UX | [Flowchart Designer](Flowchart-Designer.md) | ReactJS / UX Design, DAG | | Back-End / Ops | [Parallel Uploader](Parallel-File-Uploader.md) | Python, OOD, Threading, Objectstore | -| CI/CD, DevOps | [End-to-End Tests](End-To-End-Tests.md) | BDD tests, CI/CD workflows, Cypress | +| CI/CD, DevOps | [End-to-End Tests](End-to-End-Tests.md) | BDD tests, CI/CD workflows, Cypress | | HPC, Cloud Inf | [Cloud HPC Bench.](Cloud-Infrastructure.md) | HPC Cluster, Linpack, Benchmarks | | HPC, Containers| [Containerized HPC](Containerization-HPC.md) | HPC Cluster, Containers, Benchmarks | From 680de484eb4143e9dcd7acd5bb092a4338e452d0 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 20:06:50 -0400 Subject: [PATCH 04/80] feat: Initial commit --- package-lock.json | 535 +++++++ seankwarren/Flowchart-Designer.md | 44 + seankwarren/react-flow-calc/index.html | 13 + seankwarren/react-flow-calc/package-lock.json | 1403 +++++++++++++++++ seankwarren/react-flow-calc/src/App.jsx | 9 + seankwarren/react-flow-calc/src/index.css | 15 + seankwarren/react-flow-calc/src/main.jsx | 10 + seankwarren/react-flow-calc/vite.config.js | 7 + 8 files changed, 2036 insertions(+) create mode 100644 package-lock.json create mode 100644 seankwarren/Flowchart-Designer.md create mode 100644 seankwarren/react-flow-calc/index.html create mode 100644 seankwarren/react-flow-calc/package-lock.json create mode 100644 seankwarren/react-flow-calc/src/App.jsx create mode 100644 seankwarren/react-flow-calc/src/index.css create mode 100644 seankwarren/react-flow-calc/src/main.jsx create mode 100644 seankwarren/react-flow-calc/vite.config.js diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..76cb6668 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,535 @@ +{ + "name": "rewotes", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "reactflow": "^11.7.0" + } + }, + "node_modules/@reactflow/background": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", + "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", + "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", + "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", + "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", + "dependencies": { + "@reactflow/core": "11.7.0", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", + "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", + "dependencies": { + "@reactflow/core": "^11.6.0", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", + "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", + "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/classcat": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", + "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "peer": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/reactflow": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.7.0.tgz", + "integrity": "sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg==", + "dependencies": { + "@reactflow/background": "11.2.0", + "@reactflow/controls": "11.1.11", + "@reactflow/core": "11.7.0", + "@reactflow/minimap": "11.5.0", + "@reactflow/node-resizer": "2.1.0", + "@reactflow/node-toolbar": "1.1.11" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/zustand": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.7.tgz", + "integrity": "sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md new file mode 100644 index 00000000..12d69e62 --- /dev/null +++ b/seankwarren/Flowchart-Designer.md @@ -0,0 +1,44 @@ +# Flowchart Designer (Frontend/UX) + +> Ideal candidate: skilled front-end developer with UI/UX chops. + +# Overview + +Create a drag-and-drop flowchart designer close to a basic programming flowchart editor that is purpose-built for dealing with certain types of data. + +Front-end developers: use Meteor and React.js and minimalistic UX/UI. +Pure UI/UX designers: create high fidelity mockups.  + +# Requirements + +1. Implement basic arithmetic units as flowchart elements: increment, decrement, multiply, divide +1. Implement conditions +1. Implement 2 viewer components: + - flowchart + - underlying data structure (JSON) +1. Make JSON data structure to update reactively based on flowchart content + +# Expectations + +1. up and running application OR high fidelity clickable mockups +1. drag-and-drop flowchart builder with support for basic arithmetics +1. clean and documented code +1. tests + +# Timeline + +We leave exact timing to the candidate. Must fit Within 5 days total. + +# Notes + +- use a designated github repo for version control and submission + +# Examples + +We recommend reviewing the following: + +- Introduction to Flowcharts: https://www.geeksforgeeks.org/an-introduction-to-flowcharts/ +- An example convergence workflow: https://docs.mat3ra.com/models/auxiliary-concepts/reciprocal-space/convergence/ +- ReactFlow library examples: https://reactflow.dev/docs/examples/overview/ and https://pro.reactflow.dev/pro-examples + +To discuss this task more in details, please [contact us](README.md). diff --git a/seankwarren/react-flow-calc/index.html b/seankwarren/react-flow-calc/index.html new file mode 100644 index 00000000..79c47019 --- /dev/null +++ b/seankwarren/react-flow-calc/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +
+ + + diff --git a/seankwarren/react-flow-calc/package-lock.json b/seankwarren/react-flow-calc/package-lock.json new file mode 100644 index 00000000..65d7fa49 --- /dev/null +++ b/seankwarren/react-flow-calc/package-lock.json @@ -0,0 +1,1403 @@ +{ + "name": "react-flow-calc", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-flow-calc", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@vitejs/plugin-react": "^3.1.0", + "vite": "^4.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", + "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", + "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", + "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", + "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", + "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", + "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", + "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", + "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", + "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", + "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", + "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", + "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", + "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", + "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", + "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", + "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", + "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", + "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", + "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", + "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", + "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", + "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", + "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", + "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.33", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.33.tgz", + "integrity": "sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001475", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001475.tgz", + "integrity": "sha512-6xvTuQbEjQvvdknKCA/B6w6edEG9OMrkTY3M2sre8Iau/5f9stnJA3RfnzUMZlVhcsp1Lyl2KsM8T2R8B3P0Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.356", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", + "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.17.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", + "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.15", + "@esbuild/android-arm64": "0.17.15", + "@esbuild/android-x64": "0.17.15", + "@esbuild/darwin-arm64": "0.17.15", + "@esbuild/darwin-x64": "0.17.15", + "@esbuild/freebsd-arm64": "0.17.15", + "@esbuild/freebsd-x64": "0.17.15", + "@esbuild/linux-arm": "0.17.15", + "@esbuild/linux-arm64": "0.17.15", + "@esbuild/linux-ia32": "0.17.15", + "@esbuild/linux-loong64": "0.17.15", + "@esbuild/linux-mips64el": "0.17.15", + "@esbuild/linux-ppc64": "0.17.15", + "@esbuild/linux-riscv64": "0.17.15", + "@esbuild/linux-s390x": "0.17.15", + "@esbuild/linux-x64": "0.17.15", + "@esbuild/netbsd-x64": "0.17.15", + "@esbuild/openbsd-x64": "0.17.15", + "@esbuild/sunos-x64": "0.17.15", + "@esbuild/win32-arm64": "0.17.15", + "@esbuild/win32-ia32": "0.17.15", + "@esbuild/win32-x64": "0.17.15" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", + "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", + "integrity": "sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==", + "dev": true, + "dependencies": { + "esbuild": "^0.17.5", + "postcss": "^8.4.21", + "resolve": "^1.22.1", + "rollup": "^3.18.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/seankwarren/react-flow-calc/src/App.jsx b/seankwarren/react-flow-calc/src/App.jsx new file mode 100644 index 00000000..50eaff83 --- /dev/null +++ b/seankwarren/react-flow-calc/src/App.jsx @@ -0,0 +1,9 @@ +function App() { + return ( +
+ Hello World! +
+ ) +} + +export default App diff --git a/seankwarren/react-flow-calc/src/index.css b/seankwarren/react-flow-calc/src/index.css new file mode 100644 index 00000000..5de6d04a --- /dev/null +++ b/seankwarren/react-flow-calc/src/index.css @@ -0,0 +1,15 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/main.jsx b/seankwarren/react-flow-calc/src/main.jsx new file mode 100644 index 00000000..5cc59919 --- /dev/null +++ b/seankwarren/react-flow-calc/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/seankwarren/react-flow-calc/vite.config.js b/seankwarren/react-flow-calc/vite.config.js new file mode 100644 index 00000000..5a33944a --- /dev/null +++ b/seankwarren/react-flow-calc/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From 7dc00a106c220a6c6a5f0bbcfd754be7609f0f91 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 20:20:14 -0400 Subject: [PATCH 05/80] feat: page layout added --- seankwarren/react-flow-calc/package-lock.json | 474 +++++++++++++++++- seankwarren/react-flow-calc/src/App.jsx | 4 +- .../src/components/CalculatorWrapper.jsx | 17 + .../src/components/FlowchartViewer.jsx | 18 + .../src/components/JSONViewer.jsx | 11 + seankwarren/react-flow-calc/src/index.css | 4 - 6 files changed, 522 insertions(+), 6 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx create mode 100644 seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx create mode 100644 seankwarren/react-flow-calc/src/components/JSONViewer.jsx diff --git a/seankwarren/react-flow-calc/package-lock.json b/seankwarren/react-flow-calc/package-lock.json index 65d7fa49..bbc3f2b8 100644 --- a/seankwarren/react-flow-calc/package-lock.json +++ b/seankwarren/react-flow-calc/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "reactflow": "^11.7.0" }, "devDependencies": { "@types/react": "^18.0.28", @@ -766,6 +767,328 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@reactflow/background": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", + "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", + "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", + "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", + "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", + "dependencies": { + "@reactflow/core": "11.7.0", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", + "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", + "dependencies": { + "@reactflow/core": "^11.6.0", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", + "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", + "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", @@ -891,6 +1214,11 @@ "node": ">=4" } }, + "node_modules/classcat": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", + "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -918,6 +1246,102 @@ "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1226,6 +1650,23 @@ "node": ">=0.10.0" } }, + "node_modules/reactflow": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.7.0.tgz", + "integrity": "sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg==", + "dependencies": { + "@reactflow/background": "11.2.0", + "@reactflow/controls": "11.1.11", + "@reactflow/core": "11.7.0", + "@reactflow/minimap": "11.5.0", + "@reactflow/node-resizer": "2.1.0", + "@reactflow/node-toolbar": "1.1.11" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -1344,6 +1785,14 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/vite": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.1.tgz", @@ -1398,6 +1847,29 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true + }, + "node_modules/zustand": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.7.tgz", + "integrity": "sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ==", + "dependencies": { + "use-sync-external-store": "1.2.0" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "immer": ">=9.0", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } } } } diff --git a/seankwarren/react-flow-calc/src/App.jsx b/seankwarren/react-flow-calc/src/App.jsx index 50eaff83..e16eed4e 100644 --- a/seankwarren/react-flow-calc/src/App.jsx +++ b/seankwarren/react-flow-calc/src/App.jsx @@ -1,7 +1,9 @@ +import CalculatorWrapper from "./components/CalculatorWrapper" + function App() { return (
- Hello World! +
) } diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx new file mode 100644 index 00000000..5de3c002 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -0,0 +1,17 @@ +import React from 'react' +import FlowchartViewer from './FlowchartViewer' +import JSONViewer from './JSONViewer' +import 'reactflow/dist/style.css'; + +const CalculatorWrapper = () => { + return ( +
+
+ +
+ +
+ ) +} + +export default CalculatorWrapper \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx new file mode 100644 index 00000000..cb3a4331 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -0,0 +1,18 @@ +import React from 'react' +import ReactFlow, { + Controls, + Background, + MiniMap, +} from 'reactflow' + +const FlowchartViewer = () => { + return ( + + + + + + ) +} + +export default FlowchartViewer \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/JSONViewer.jsx b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx new file mode 100644 index 00000000..58a6a62e --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx @@ -0,0 +1,11 @@ +import React from 'react' + +const JSONViewer = () => { + return ( +
+ JSONViewer +
+ ) +} + +export default JSONViewer \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/index.css b/seankwarren/react-flow-calc/src/index.css index 5de6d04a..e4342d13 100644 --- a/seankwarren/react-flow-calc/src/index.css +++ b/seankwarren/react-flow-calc/src/index.css @@ -3,10 +3,6 @@ line-height: 1.5; font-weight: 400; - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; From d64e18a8859d3bc8d80c3c5467deedc681152bb8 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 20:35:45 -0400 Subject: [PATCH 06/80] feat: drag and drop custom nodes onto flowchart --- .../src/components/CalculatorWrapper.jsx | 59 ++++++++++++++++- .../src/components/ComparisonNode.jsx | 9 +++ .../src/components/FlowchartViewer.jsx | 66 ++++++++++++++++++- .../src/components/InputNode.jsx | 9 +++ .../src/components/NodeButtons.jsx | 38 +++++++++++ .../src/components/OperationNode.jsx | 9 +++ .../src/components/OutputNode.jsx | 9 +++ 7 files changed, 194 insertions(+), 5 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/components/ComparisonNode.jsx create mode 100644 seankwarren/react-flow-calc/src/components/InputNode.jsx create mode 100644 seankwarren/react-flow-calc/src/components/NodeButtons.jsx create mode 100644 seankwarren/react-flow-calc/src/components/OperationNode.jsx create mode 100644 seankwarren/react-flow-calc/src/components/OutputNode.jsx diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 5de3c002..e540fdb6 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -1,13 +1,68 @@ -import React from 'react' +import React, { useState } from 'react' import FlowchartViewer from './FlowchartViewer' import JSONViewer from './JSONViewer' +import NodeButtons from './NodeButtons' import 'reactflow/dist/style.css'; const CalculatorWrapper = () => { + + // Set up state for nodes and edges + const [nodes, setNodes] = useState([]); + const [edges, setEdges] = useState([]); + + const [draggedNodeType, setDraggedNodeType] = useState(null); + + + const handleDragStart = (e, nodeType) => { + setDraggedNodeType(nodeType); + e.dataTransfer.setData('text/plain', nodeType); + }; + + // Function to add a new node + const addNode = (type, position) => { + // Generate a unique ID for the node + const id = `${type}${nodes.length + 1}`; + + // Create a new node object with an ID, type, initial value, and onChange function + const newNode = { + id, + type: `${type}Node`, + data: { + value: + type === 'input' + ? 0 + : type === 'operation' + ? 'add' + : type === 'comparison' + ? 'greater' + : null, + onChange: (value, callback) => { + // Update the value of the node when its input changes + setNodes((ns) => + ns.map((n) => + n.id === id + ? { ...n, data: { ...n.data, value } } + : n + ) + ); + // Call the provided callback function + if (callback) { + callback(); + } + }, + }, + position: position, // Set the position here + }; + + // Add the new node to the list of nodes + setNodes((ns) => [...ns, newNode]); + }; + return (
- + +
diff --git a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx new file mode 100644 index 00000000..e06a5be8 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const ComparisonNode = () => { + return ( +
ComparisonNode
+ ) +} + +export default ComparisonNode \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index cb3a4331..de938700 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -1,13 +1,73 @@ -import React from 'react' +import React, { useCallback, useMemo } from 'react' import ReactFlow, { Controls, Background, MiniMap, + applyNodeChanges, + applyEdgeChanges, } from 'reactflow' -const FlowchartViewer = () => { +const FlowchartViewer = ({ + nodes, + edges, + setNodes, + setEdges, + addNode, + draggedNodeType, + setDraggedNodeType, +}) => { + + const onNodesChange = useCallback( + (changes) => setNodes((els) => applyNodeChanges(changes, els)), + [] + ); + + const onEdgesChange = useCallback( + (changes) => setEdges((els) => applyEdgeChanges(changes, els)), + [] + ); + + const handleDrop = (e) => { + console.log('dropped', draggedNodeType); + e.preventDefault(); + e.stopPropagation(); + + if (!draggedNodeType) return; + + const reactFlowBounds = e.currentTarget.getBoundingClientRect(); + const position = { + x: e.clientX - reactFlowBounds.left, + y: e.clientY - reactFlowBounds.top, + }; + + addNode(draggedNodeType, position); + setDraggedNodeType(null); + }; + + const handleDragOver = (e) => { + e.preventDefault(); + e.stopPropagation(); + }; + + const nodeTypes = useMemo(() => { + return { + inputNode: (props) => , + operationNode: (props) => , + outputNode: (props) => , + comparisonNode: (props) => + }; + }, []); + return ( - + diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx new file mode 100644 index 00000000..72c2d850 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const InputNode = () => { + return ( +
InputNode
+ ) +} + +export default InputNode \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx new file mode 100644 index 00000000..67c410d2 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -0,0 +1,38 @@ +import React from 'react' + +const NodeButtons = ({ addNode, handleDragStart }) => { + return ( +
+ + + + +
+ ); +}; + +export default NodeButtons; \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/OperationNode.jsx b/seankwarren/react-flow-calc/src/components/OperationNode.jsx new file mode 100644 index 00000000..842cf09c --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/OperationNode.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const OperationNode = () => { + return ( +
OperationNode
+ ) +} + +export default OperationNode \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/OutputNode.jsx new file mode 100644 index 00000000..c35ecbf0 --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/OutputNode.jsx @@ -0,0 +1,9 @@ +import React from 'react' + +const OutputNode = () => { + return ( +
OutputNode
+ ) +} + +export default OutputNode \ No newline at end of file From e675d26603d16fa6aeb6336e65a91fef0044de21 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 20:41:20 -0400 Subject: [PATCH 07/80] feat(styles): styling framework for custom nodes --- .../src/components/ComparisonNode.jsx | 1 + .../src/components/FlowchartViewer.jsx | 5 +++ .../src/components/InputNode.jsx | 1 + .../src/components/OperationNode.jsx | 1 + .../src/components/OutputNode.jsx | 1 + .../src/styles/ComparisonNode.css | 9 ++++ .../react-flow-calc/src/styles/InputNode.css | 9 ++++ .../src/styles/OperationNode.css | 10 +++++ .../react-flow-calc/src/styles/OutputNode.css | 9 ++++ .../react-flow-calc/src/styles/index.css | 42 +++++++++++++++++++ 10 files changed, 88 insertions(+) create mode 100644 seankwarren/react-flow-calc/src/styles/ComparisonNode.css create mode 100644 seankwarren/react-flow-calc/src/styles/InputNode.css create mode 100644 seankwarren/react-flow-calc/src/styles/OperationNode.css create mode 100644 seankwarren/react-flow-calc/src/styles/OutputNode.css create mode 100644 seankwarren/react-flow-calc/src/styles/index.css diff --git a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx index e06a5be8..46b0ab23 100644 --- a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx +++ b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx @@ -1,4 +1,5 @@ import React from 'react' +import '../styles/ComparisonNode.css' const ComparisonNode = () => { return ( diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index de938700..9165f6ea 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -6,6 +6,10 @@ import ReactFlow, { applyNodeChanges, applyEdgeChanges, } from 'reactflow' +import InputNode from './InputNode'; +import OperationNode from './OperationNode'; +import ComparisonNode from './ComparisonNode'; +import OutputNode from './OutputNode'; const FlowchartViewer = ({ nodes, @@ -64,6 +68,7 @@ const FlowchartViewer = ({ edges={edges} onNodesChange={onNodesChange} onEdgesChange={onEdgesChange} + nodeTypes={nodeTypes} snapToGrid onDrop={handleDrop} onDragOver={handleDragOver} diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx index 72c2d850..ad7da418 100644 --- a/seankwarren/react-flow-calc/src/components/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -1,4 +1,5 @@ import React from 'react' +import '../styles/InputNode.css' const InputNode = () => { return ( diff --git a/seankwarren/react-flow-calc/src/components/OperationNode.jsx b/seankwarren/react-flow-calc/src/components/OperationNode.jsx index 842cf09c..c6a63537 100644 --- a/seankwarren/react-flow-calc/src/components/OperationNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OperationNode.jsx @@ -1,4 +1,5 @@ import React from 'react' +import '../styles/OperationNode.css' const OperationNode = () => { return ( diff --git a/seankwarren/react-flow-calc/src/components/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/OutputNode.jsx index c35ecbf0..acde3845 100644 --- a/seankwarren/react-flow-calc/src/components/OutputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OutputNode.jsx @@ -1,4 +1,5 @@ import React from 'react' +import '../styles/OutputNode.css' const OutputNode = () => { return ( diff --git a/seankwarren/react-flow-calc/src/styles/ComparisonNode.css b/seankwarren/react-flow-calc/src/styles/ComparisonNode.css new file mode 100644 index 00000000..e07e22be --- /dev/null +++ b/seankwarren/react-flow-calc/src/styles/ComparisonNode.css @@ -0,0 +1,9 @@ +.comparison-node { + display: flex; + flex-direction: row; + align-items: center; + background-color: #e1f5fe; + padding: 15px; + border: 1px solid #000; + border-radius: 5px; +} diff --git a/seankwarren/react-flow-calc/src/styles/InputNode.css b/seankwarren/react-flow-calc/src/styles/InputNode.css new file mode 100644 index 00000000..b6c2f138 --- /dev/null +++ b/seankwarren/react-flow-calc/src/styles/InputNode.css @@ -0,0 +1,9 @@ +.input-node { + background-color: var(--input-color); + padding: var(--med-padding); + border: 1px solid #000; + border-radius: var(--small-radius); + display: flex; + justify-content: center; + align-items: center; +} diff --git a/seankwarren/react-flow-calc/src/styles/OperationNode.css b/seankwarren/react-flow-calc/src/styles/OperationNode.css new file mode 100644 index 00000000..a2ed51d7 --- /dev/null +++ b/seankwarren/react-flow-calc/src/styles/OperationNode.css @@ -0,0 +1,10 @@ +.operation-node { + background-color: var(--operation-color); + padding: var(--med-padding); + border: 1px solid #000; + border-radius: 50%; + aspect-ratio: 1; + display: flex; + justify-content: center; + align-items: center; +} \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/styles/OutputNode.css b/seankwarren/react-flow-calc/src/styles/OutputNode.css new file mode 100644 index 00000000..5608a09e --- /dev/null +++ b/seankwarren/react-flow-calc/src/styles/OutputNode.css @@ -0,0 +1,9 @@ +.output-node { + background-color: var(--output-color); + padding: var(--med-padding); + border: 1px solid #000; + border-radius: 5px; + display: flex; + justify-content: left; + align-items: center; +} diff --git a/seankwarren/react-flow-calc/src/styles/index.css b/seankwarren/react-flow-calc/src/styles/index.css new file mode 100644 index 00000000..17165f09 --- /dev/null +++ b/seankwarren/react-flow-calc/src/styles/index.css @@ -0,0 +1,42 @@ +body { + padding: 0; + margin: 0; + --input-color: #cefada; + --operation-color: #f8e1fe; + --comparison-color: #e1f5fe; + --output-color: #f8f6ce; + --small-padding: 10px; + --med-padding: 15px; + --small-radius: 5px; +} + +.node-buttons { + position: fixed; + top: 0; + z-index: 10; + padding: var(--small-padding); +} + +.node-button { + margin: 5px; + padding: var(--small-padding); + border-radius: var(--small-radius); + border: 1px solid black; +} + +.input-button { + background-color: var(--input-color); +} + +.operation-button { + background-color: var(--operation-color); + border-radius: 50%; +} + +.comparison-button { + background-color: var(--comparison-color); +} + +.output-button { + background-color: var(--output-color); +} From 73dd1398ee52172b4b54355912d53989f96e20da Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 22:02:39 -0400 Subject: [PATCH 08/80] feat(styling): styling structure changes --- package-lock.json | 535 ------------------ .../src/components/ComparisonNode.jsx | 3 +- .../src/components/InputNode.jsx | 3 +- .../src/components/NodeButtons.jsx | 22 +- .../src/components/OperationNode.jsx | 3 +- .../src/components/OutputNode.jsx | 3 +- seankwarren/react-flow-calc/src/index.css | 11 - seankwarren/react-flow-calc/src/main.jsx | 2 +- .../src/styles/ComparisonNode.css | 9 - .../react-flow-calc/src/styles/InputNode.css | 9 - .../src/styles/OperationNode.css | 10 - .../react-flow-calc/src/styles/OutputNode.css | 9 - .../react-flow-calc/src/styles/index.css | 55 +- 13 files changed, 60 insertions(+), 614 deletions(-) delete mode 100644 package-lock.json delete mode 100644 seankwarren/react-flow-calc/src/index.css delete mode 100644 seankwarren/react-flow-calc/src/styles/ComparisonNode.css delete mode 100644 seankwarren/react-flow-calc/src/styles/InputNode.css delete mode 100644 seankwarren/react-flow-calc/src/styles/OperationNode.css delete mode 100644 seankwarren/react-flow-calc/src/styles/OutputNode.css diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 76cb6668..00000000 --- a/package-lock.json +++ /dev/null @@ -1,535 +0,0 @@ -{ - "name": "rewotes", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "reactflow": "^11.7.0" - } - }, - "node_modules/@reactflow/background": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", - "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/controls": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", - "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/core": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", - "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/minimap": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", - "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", - "dependencies": { - "@reactflow/core": "11.7.0", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-resizer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", - "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", - "dependencies": { - "@reactflow/core": "^11.6.0", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", - "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", - "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" - }, - "node_modules/@types/d3-format": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" - }, - "node_modules/@types/d3-geo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" - }, - "node_modules/@types/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", - "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" - }, - "node_modules/classcat": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", - "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/reactflow": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.7.0.tgz", - "integrity": "sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg==", - "dependencies": { - "@reactflow/background": "11.2.0", - "@reactflow/controls": "11.1.11", - "@reactflow/core": "11.7.0", - "@reactflow/minimap": "11.5.0", - "@reactflow/node-resizer": "2.1.0", - "@reactflow/node-toolbar": "1.1.11" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/zustand": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.7.tgz", - "integrity": "sha512-dY8ERwB9Nd21ellgkBZFhudER8KVlelZm8388B5nDAXhO/+FZDhYMuRnqDgu5SYyRgz/iaf8RKnbUs/cHfOGlQ==", - "dependencies": { - "use-sync-external-store": "1.2.0" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "immer": ">=9.0", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } - } - } -} diff --git a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx index 46b0ab23..50761d33 100644 --- a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx +++ b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx @@ -1,9 +1,8 @@ import React from 'react' -import '../styles/ComparisonNode.css' const ComparisonNode = () => { return ( -
ComparisonNode
+
ComparisonNode
) } diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx index ad7da418..415d35b3 100644 --- a/seankwarren/react-flow-calc/src/components/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -1,9 +1,8 @@ import React from 'react' -import '../styles/InputNode.css' const InputNode = () => { return ( -
InputNode
+
InputNode
) } diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx index 67c410d2..3d0cc323 100644 --- a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -2,34 +2,34 @@ import React from 'react' const NodeButtons = ({ addNode, handleDragStart }) => { return ( -
+
); diff --git a/seankwarren/react-flow-calc/src/components/OperationNode.jsx b/seankwarren/react-flow-calc/src/components/OperationNode.jsx index c6a63537..220fb3dc 100644 --- a/seankwarren/react-flow-calc/src/components/OperationNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OperationNode.jsx @@ -1,9 +1,8 @@ import React from 'react' -import '../styles/OperationNode.css' const OperationNode = () => { return ( -
OperationNode
+
OperationNode
) } diff --git a/seankwarren/react-flow-calc/src/components/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/OutputNode.jsx index acde3845..c8e22996 100644 --- a/seankwarren/react-flow-calc/src/components/OutputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OutputNode.jsx @@ -1,9 +1,8 @@ import React from 'react' -import '../styles/OutputNode.css' const OutputNode = () => { return ( -
OutputNode
+
OutputNode
) } diff --git a/seankwarren/react-flow-calc/src/index.css b/seankwarren/react-flow-calc/src/index.css deleted file mode 100644 index e4342d13..00000000 --- a/seankwarren/react-flow-calc/src/index.css +++ /dev/null @@ -1,11 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/main.jsx b/seankwarren/react-flow-calc/src/main.jsx index 5cc59919..1b425290 100644 --- a/seankwarren/react-flow-calc/src/main.jsx +++ b/seankwarren/react-flow-calc/src/main.jsx @@ -1,7 +1,7 @@ import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' -import './index.css' +import './styles/index.css' ReactDOM.createRoot(document.getElementById('root')).render( diff --git a/seankwarren/react-flow-calc/src/styles/ComparisonNode.css b/seankwarren/react-flow-calc/src/styles/ComparisonNode.css deleted file mode 100644 index e07e22be..00000000 --- a/seankwarren/react-flow-calc/src/styles/ComparisonNode.css +++ /dev/null @@ -1,9 +0,0 @@ -.comparison-node { - display: flex; - flex-direction: row; - align-items: center; - background-color: #e1f5fe; - padding: 15px; - border: 1px solid #000; - border-radius: 5px; -} diff --git a/seankwarren/react-flow-calc/src/styles/InputNode.css b/seankwarren/react-flow-calc/src/styles/InputNode.css deleted file mode 100644 index b6c2f138..00000000 --- a/seankwarren/react-flow-calc/src/styles/InputNode.css +++ /dev/null @@ -1,9 +0,0 @@ -.input-node { - background-color: var(--input-color); - padding: var(--med-padding); - border: 1px solid #000; - border-radius: var(--small-radius); - display: flex; - justify-content: center; - align-items: center; -} diff --git a/seankwarren/react-flow-calc/src/styles/OperationNode.css b/seankwarren/react-flow-calc/src/styles/OperationNode.css deleted file mode 100644 index a2ed51d7..00000000 --- a/seankwarren/react-flow-calc/src/styles/OperationNode.css +++ /dev/null @@ -1,10 +0,0 @@ -.operation-node { - background-color: var(--operation-color); - padding: var(--med-padding); - border: 1px solid #000; - border-radius: 50%; - aspect-ratio: 1; - display: flex; - justify-content: center; - align-items: center; -} \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/styles/OutputNode.css b/seankwarren/react-flow-calc/src/styles/OutputNode.css deleted file mode 100644 index 5608a09e..00000000 --- a/seankwarren/react-flow-calc/src/styles/OutputNode.css +++ /dev/null @@ -1,9 +0,0 @@ -.output-node { - background-color: var(--output-color); - padding: var(--med-padding); - border: 1px solid #000; - border-radius: 5px; - display: flex; - justify-content: left; - align-items: center; -} diff --git a/seankwarren/react-flow-calc/src/styles/index.css b/seankwarren/react-flow-calc/src/styles/index.css index 17165f09..16c80c87 100644 --- a/seankwarren/react-flow-calc/src/styles/index.css +++ b/seankwarren/react-flow-calc/src/styles/index.css @@ -1,6 +1,14 @@ -body { - padding: 0; - margin: 0; +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; + --input-color: #cefada; --operation-color: #f8e1fe; --comparison-color: #e1f5fe; @@ -10,33 +18,58 @@ body { --small-radius: 5px; } -.node-buttons { +body { + padding: 0; + margin: 0; +} + +.buttons-panel { position: fixed; top: 0; z-index: 10; padding: var(--small-padding); + display: grid; + grid-auto-flow: column; + align-items: center; + /* flex-wrap: nowrap; */ +} + +.node { + border: 1px solid #000; + padding: var(--med-padding); + border-radius: var(--small-radius); + display: flex; + justify-content: center; + align-items: center; } .node-button { margin: 5px; - padding: var(--small-padding); - border-radius: var(--small-radius); + padding: var(--med-padding); border: 1px solid black; + border-radius: var(--small-radius); + display: flex; + justify-content: center; + align-items: center; } -.input-button { +.round { + border-radius: 50%; + aspect-ratio: 1; +} + +.input { background-color: var(--input-color); } -.operation-button { +.operation { background-color: var(--operation-color); - border-radius: 50%; } -.comparison-button { +.comparison { background-color: var(--comparison-color); } -.output-button { +.output { background-color: var(--output-color); } From 193287189fd8e46233e3d48a543e8a2f5f78bcca Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 23:05:13 -0400 Subject: [PATCH 09/80] feat: nodes state and input-output nodes --- .../src/components/CalculatorWrapper.jsx | 46 ++++++----- .../src/components/FlowchartViewer.jsx | 81 ++++++++++++++----- .../src/components/InputNode.jsx | 28 +++++-- .../src/components/OutputNode.jsx | 14 +++- 4 files changed, 122 insertions(+), 47 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index e540fdb6..f8d1d33b 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -1,18 +1,16 @@ -import React, { useState } from 'react' -import FlowchartViewer from './FlowchartViewer' -import JSONViewer from './JSONViewer' -import NodeButtons from './NodeButtons' +import React, { useState } from 'react'; +import FlowchartViewer from './FlowchartViewer'; +import JSONViewer from './JSONViewer'; +import NodeButtons from './NodeButtons'; import 'reactflow/dist/style.css'; const CalculatorWrapper = () => { - // Set up state for nodes and edges const [nodes, setNodes] = useState([]); const [edges, setEdges] = useState([]); const [draggedNodeType, setDraggedNodeType] = useState(null); - const handleDragStart = (e, nodeType) => { setDraggedNodeType(nodeType); e.dataTransfer.setData('text/plain', nodeType); @@ -38,13 +36,14 @@ const CalculatorWrapper = () => { : null, onChange: (value, callback) => { // Update the value of the node when its input changes - setNodes((ns) => - ns.map((n) => + setNodes((ns) => { + return (ns.map((n) => { n.id === id - ? { ...n, data: { ...n.data, value } } - : n - ) - ); + ? { ...n, data: { ...n.data, value } } + : n + })) + }); + // Call the provided callback function if (callback) { callback(); @@ -61,12 +60,23 @@ const CalculatorWrapper = () => { return (
- - + +
- +
- ) -} + ); +}; -export default CalculatorWrapper \ No newline at end of file +export default CalculatorWrapper; diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index 9165f6ea..ca467793 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -1,25 +1,26 @@ -import React, { useCallback, useMemo } from 'react' +import React, { useCallback, useState, useEffect, useMemo } from 'react'; import ReactFlow, { Controls, Background, MiniMap, applyNodeChanges, applyEdgeChanges, -} from 'reactflow' +} from 'reactflow'; import InputNode from './InputNode'; import OperationNode from './OperationNode'; -import ComparisonNode from './ComparisonNode'; import OutputNode from './OutputNode'; +import ComparisonNode from './ComparisonNode'; -const FlowchartViewer = ({ - nodes, - edges, +const FlowchartViewer = ({ + nodes, + edges, setNodes, - setEdges, - addNode, + setEdges, + addNode, draggedNodeType, - setDraggedNodeType, + setDraggedNodeType, }) => { + //setup state for drag and drop const onNodesChange = useCallback( (changes) => setNodes((els) => applyNodeChanges(changes, els)), @@ -31,8 +32,52 @@ const FlowchartViewer = ({ [] ); + // Function to handle connecting nodes + const handleConnect = () => { + + }; + + const updateOutputNodes = useCallback(() => { + setNodes((currentNodes) => { + const outputNodes = currentNodes.filter((node) => { + return node.type === 'outputNode'; + }); + // console.log(currentNodes) + const newNodes = currentNodes.map((node) => { + if (node.type !== 'outputNode') return node; + + const connectedEdge = edges.find( + (edge) => edge.target === node.id + ); + console.log(connectedEdge); + if (connectedEdge) { + const newValue = calculate( + nodes, + edges, + connectedEdge.sourceHandle + ); + return { ...node, data: { ...node.data, value: newValue } }; + } else { + return node; + } + }); + console.log(newNodes.length); + + return newNodes; + }); + }, [nodes, edges]); + + // Define custom node types + const nodeTypes = useMemo(() => { + return { + inputNode: (props) => , + operationNode: (props) => , + outputNode: (props) => , + comparisonNode: (props) => , + }; + }, []); + const handleDrop = (e) => { - console.log('dropped', draggedNodeType); e.preventDefault(); e.stopPropagation(); @@ -53,21 +98,13 @@ const FlowchartViewer = ({ e.stopPropagation(); }; - const nodeTypes = useMemo(() => { - return { - inputNode: (props) => , - operationNode: (props) => , - outputNode: (props) => , - comparisonNode: (props) => - }; - }, []); - return ( - ) -} + ); +}; -export default FlowchartViewer \ No newline at end of file +export default FlowchartViewer; diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx index 415d35b3..deb1ccd5 100644 --- a/seankwarren/react-flow-calc/src/components/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -1,9 +1,27 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' +import { Handle } from 'reactflow'; -const InputNode = () => { - return ( -
InputNode
- ) +const InputNode = ({ id, data }) => { + const [val, setVal] = useState(data); + + const handleInputChange = (e) => { + const inputValue = parseFloat(e.target.value); + data.onChange({ id, data: { ...data, value: inputValue } }); + setVal(inputValue); + }; + + return ( +
+ + console.log('handle onConnect', params)} + /> +
+ ) } export default InputNode \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/OutputNode.jsx index c8e22996..c75c694f 100644 --- a/seankwarren/react-flow-calc/src/components/OutputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OutputNode.jsx @@ -1,8 +1,18 @@ import React from 'react' +import { Handle } from 'reactflow'; -const OutputNode = () => { +const OutputNode = ({ id, data}) => { return ( -
OutputNode
+
+ console.log('handle onConnect', params)} + /> + Result: {String(data.value)} +
) } From 01f0843bee5560a7f16be0d68ef4f45f65f63aaf Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 7 Apr 2023 23:07:26 -0400 Subject: [PATCH 10/80] fix: correct minor syntax issue --- .../react-flow-calc/src/components/CalculatorWrapper.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index f8d1d33b..a19b2048 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -37,11 +37,11 @@ const CalculatorWrapper = () => { onChange: (value, callback) => { // Update the value of the node when its input changes setNodes((ns) => { - return (ns.map((n) => { + return (ns.map((n) => n.id === id - ? { ...n, data: { ...n.data, value } } - : n - })) + ? { ...n, data: { ...n.data, value } } + : n + )) }); // Call the provided callback function From 2d6282a3f61bdd7faa52a23c353a1c2c7cd1058e Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 00:21:41 -0400 Subject: [PATCH 11/80] feat: OperationNode --- .../src/components/CalculatorWrapper.jsx | 1 - .../src/components/OperationNode.jsx | 50 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index a19b2048..dd5007bc 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -43,7 +43,6 @@ const CalculatorWrapper = () => { : n )) }); - // Call the provided callback function if (callback) { callback(); diff --git a/seankwarren/react-flow-calc/src/components/OperationNode.jsx b/seankwarren/react-flow-calc/src/components/OperationNode.jsx index 220fb3dc..780f3e76 100644 --- a/seankwarren/react-flow-calc/src/components/OperationNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OperationNode.jsx @@ -1,9 +1,51 @@ import React from 'react' +import { Handle } from 'reactflow'; -const OperationNode = () => { - return ( -
OperationNode
- ) +const OperationNode = ({ id, data }) => { + + const handleSelectChange = (e) => { + data.onChange(e.target.value); + }; + + return ( +
+ console.log('handle onConnect', params)} + /> + console.log('handle onConnect', params)} + /> + + console.log('handle onConnect', params)} + /> +
+ ); } export default OperationNode \ No newline at end of file From 1349404114ee5158d797875fa63f395d6dcc55a2 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 00:25:51 -0400 Subject: [PATCH 12/80] feat: handled drawing edge connections --- .../src/components/FlowchartViewer.jsx | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index ca467793..6ab70647 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -33,8 +33,32 @@ const FlowchartViewer = ({ ); // Function to handle connecting nodes - const handleConnect = () => { - + const handleConnect = (params) => { + const { source, sourceHandle, target, targetHandle } = params; + // Check if an edge with the same source and target already exists + const existingEdge = edges.find( + (edge) => + edge.source === sourceHandle && edge.target === targetHandle + ); + // If a duplicate edge is found, do not add the new edge + if (existingEdge) { + console.log('Duplicate edge detected, not adding the new edge'); + return; + } + + // Create a new edge with an ID, source node ID, target node ID, and arrowhead type + const newEdge = { + id: `${source}-${target}`, + source: source, + sourceHandle: sourceHandle, + target: target, + targetHandle: targetHandle, + arrowHeadType: 'arrowclosed', + }; + + setEdges((es) => [...es, newEdge]); + + // If the target node is an output node, calculate its value and update its state }; const updateOutputNodes = useCallback(() => { From 6672832c089e89388187e2dcf98517e39d10ee06 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 00:30:41 -0400 Subject: [PATCH 13/80] feat: font changed and css modularized --- .../src/components/NodeButtons.jsx | 8 ++++---- seankwarren/react-flow-calc/src/styles/index.css | 15 +++++---------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx index 3d0cc323..44f9d722 100644 --- a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -4,28 +4,28 @@ const NodeButtons = ({ addNode, handleDragStart }) => { return (
- ) -} + ); +}; -export default InputNode \ No newline at end of file +export default InputNode; diff --git a/seankwarren/react-flow-calc/src/utils/calculate.js b/seankwarren/react-flow-calc/src/utils/calculate.js new file mode 100644 index 00000000..a262d8d4 --- /dev/null +++ b/seankwarren/react-flow-calc/src/utils/calculate.js @@ -0,0 +1,35 @@ +import performOperation from './performOperation'; + +// Function to calculate the value of a node +const calculate = (nodes, edges, sourceHandleId) => { + // Find the node with the specified ID + const node = nodes.find((n) => n.id === sourceHandleId.split("-")[0]); + if (!node) return 0; + + console.log(node) + + // Calculate value based on node type + if (node.type === 'inputNode') { + return node.data.value; + } else if (node.type === 'operationNode' || node.type === 'comparisonNode') { + // Get all incoming edges for the node + const inputEdges = edges.filter((e) => e.target === node.id); + // Calculate the values of all incoming nodes + const inputValues = inputEdges.map((e) => { + return calculate(nodes, edges, e.sourceHandle); + }); + + // Perform the specified operation on the input values + const result = performOperation( + node.data.value, + inputValues[0], + inputValues[1] + ); + // console.log(result); + return result; + } + + return 0; +} + +export default calculate; diff --git a/seankwarren/react-flow-calc/src/utils/performOperation.js b/seankwarren/react-flow-calc/src/utils/performOperation.js new file mode 100644 index 00000000..f3b7dfd6 --- /dev/null +++ b/seankwarren/react-flow-calc/src/utils/performOperation.js @@ -0,0 +1,29 @@ +// Helper function to perform an operation +const performOperation = (op, val1, val2) => { + switch (op) { + case 'add': + return val1 + val2; + case 'subtract': + return val1 - val2; + case 'multiply': + return val1 * val2; + case 'divide': + return val1 / val2; + case 'greater': + return val1 > val2; + case 'less': + return val1 < val2; + case 'greaterEqual': + return val1 >= val2; + case 'lessEqual': + return val1 <= val2; + case 'equal': + return val1 === val2; + case 'notEqual': + return val1 !== val2; + default: + return 0; + } +}; + +export default performOperation; \ No newline at end of file From 4eebcc2fa26342347ad7888684a59d9b42864441 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:00:01 -0400 Subject: [PATCH 15/80] feat: state updated on user input --- .../src/components/CalculatorWrapper.jsx | 6 +---- .../src/components/FlowchartViewer.jsx | 26 +++++++++---------- .../src/components/InputNode.jsx | 4 +-- .../react-flow-calc/src/hooks/usePrevious.jsx | 11 ++++++++ .../react-flow-calc/src/utils/calculate.js | 2 -- 5 files changed, 26 insertions(+), 23 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/hooks/usePrevious.jsx diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index dd5007bc..14421120 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -34,7 +34,7 @@ const CalculatorWrapper = () => { : type === 'comparison' ? 'greater' : null, - onChange: (value, callback) => { + onChange: (value) => { // Update the value of the node when its input changes setNodes((ns) => { return (ns.map((n) => @@ -43,10 +43,6 @@ const CalculatorWrapper = () => { : n )) }); - // Call the provided callback function - if (callback) { - callback(); - } }, }, position: position, // Set the position here diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index ec0c3329..4c5c57da 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -11,6 +11,7 @@ import OperationNode from './OperationNode'; import OutputNode from './OutputNode'; import ComparisonNode from './ComparisonNode'; import calculate from '../utils/calculate'; +import usePrevious from '../hooks/usePrevious'; const FlowchartViewer = ({ nodes, @@ -21,7 +22,8 @@ const FlowchartViewer = ({ draggedNodeType, setDraggedNodeType, }) => { - //setup state for drag and drop + const prevNodes = usePrevious(nodes); + const prevEdges = usePrevious(edges); const onNodesChange = useCallback( (changes) => setNodes((els) => applyNodeChanges(changes, els)), @@ -64,13 +66,11 @@ const FlowchartViewer = ({ updateOutputNodes(); }; - const updateOutputNodes = () => { - console.log("updating outputs") + const updateOutputNodes = (currentEdges) => { setNodes((currentNodes) => { const outputNodes = currentNodes.filter((node) => { return node.type === 'outputNode'; }); - console.log(currentNodes) const newNodes = currentNodes.map((node) => { if (node.type !== 'outputNode') return node; @@ -78,22 +78,17 @@ const FlowchartViewer = ({ const connectedEdge = edges.find( (edge) => edge.target === node.id ); - - console.log(connectedEdge) if (connectedEdge) { const newValue = calculate( nodes, edges, connectedEdge.sourceHandle ); - console.log(newValue); return { ...node, data: { ...node.data, value: newValue } }; } else { return node; } }); - // console.log(newNodes.length); - return newNodes; }); } @@ -104,19 +99,16 @@ const FlowchartViewer = ({ inputNode: (props) => ( ), operationNode: (props) => ( ), comparisonNode: (props) => ( ), outputNode: (props) => , @@ -124,8 +116,14 @@ const FlowchartViewer = ({ }, []); useEffect(() => { - updateOutputNodes(); - }, [edges]); + // TODO: use lodash to evaluate equality? + if ( + JSON.stringify(prevNodes) !== JSON.stringify(nodes) || + JSON.stringify(prevEdges) !== JSON.stringify(edges) + ) { + updateOutputNodes(); + } + }, [nodes, edges, prevNodes, prevEdges]); const handleDrop = (e) => { e.preventDefault(); diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx index 57e8e3c6..317a467c 100644 --- a/seankwarren/react-flow-calc/src/components/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -1,12 +1,12 @@ import React, { useState } from 'react'; import { Handle } from 'reactflow'; -const InputNode = ({ id, data, updateOutputNodes }) => { +const InputNode = ({ id, data }) => { const [val, setVal] = useState(data); const handleInputChange = (e) => { const inputValue = parseFloat(e.target.value) - data.onChange(inputValue, updateOutputNodes); + data.onChange(inputValue); // updateOutputNodes(); setVal(inputValue); }; diff --git a/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx b/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx new file mode 100644 index 00000000..b16d55c6 --- /dev/null +++ b/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx @@ -0,0 +1,11 @@ +import { useEffect, useRef } from 'react'; + +const usePrevious = (value) => { + const ref = useRef(); + useEffect(() => { + ref.current = value; + }); + return ref.current; +} + +export default usePrevious; \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/utils/calculate.js b/seankwarren/react-flow-calc/src/utils/calculate.js index a262d8d4..a74b636b 100644 --- a/seankwarren/react-flow-calc/src/utils/calculate.js +++ b/seankwarren/react-flow-calc/src/utils/calculate.js @@ -6,8 +6,6 @@ const calculate = (nodes, edges, sourceHandleId) => { const node = nodes.find((n) => n.id === sourceHandleId.split("-")[0]); if (!node) return 0; - console.log(node) - // Calculate value based on node type if (node.type === 'inputNode') { return node.data.value; From ab492498bf61177ff21fc82d190c25e445451b45 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:07:44 -0400 Subject: [PATCH 16/80] feat: binary comparison node --- .../src/components/ComparisonNode.jsx | 53 ++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx index 50761d33..ed0c1b89 100644 --- a/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx +++ b/seankwarren/react-flow-calc/src/components/ComparisonNode.jsx @@ -1,9 +1,48 @@ -import React from 'react' +import React from 'react'; +import { Handle } from 'reactflow'; -const ComparisonNode = () => { - return ( -
ComparisonNode
- ) -} +export const ComparisonNode = ({ id, data, updateOutputNodes }) => { + const handleSelectChange = (e) => { + data.onChange(e.target.value, updateOutputNodes); + updateOutputNodes(); + }; -export default ComparisonNode \ No newline at end of file + return ( +
+ + + + +
+ ); +}; + +export default ComparisonNode; From f9c8b29874a4d79ee7941dcb94adabcff25d109f Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:08:05 -0400 Subject: [PATCH 17/80] feat(style): modularized handle css --- .../react-flow-calc/src/components/InputNode.jsx | 2 +- .../src/components/OperationNode.jsx | 13 ++++--------- .../react-flow-calc/src/components/OutputNode.jsx | 3 +-- seankwarren/react-flow-calc/src/styles/index.css | 10 ++++++++++ 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/InputNode.jsx b/seankwarren/react-flow-calc/src/components/InputNode.jsx index 317a467c..6964fb2c 100644 --- a/seankwarren/react-flow-calc/src/components/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/InputNode.jsx @@ -15,10 +15,10 @@ const InputNode = ({ id, data }) => {
); diff --git a/seankwarren/react-flow-calc/src/components/OperationNode.jsx b/seankwarren/react-flow-calc/src/components/OperationNode.jsx index 780f3e76..ee0ceda5 100644 --- a/seankwarren/react-flow-calc/src/components/OperationNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OperationNode.jsx @@ -8,28 +8,24 @@ const OperationNode = ({ id, data }) => { }; return ( -
+
console.log('handle onConnect', params)} /> console.log('handle onConnect', params)} /> console.log('handle onConnect', params)} />
); diff --git a/seankwarren/react-flow-calc/src/components/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/OutputNode.jsx index c75c694f..6c2aa427 100644 --- a/seankwarren/react-flow-calc/src/components/OutputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/OutputNode.jsx @@ -5,11 +5,10 @@ const OutputNode = ({ id, data}) => { return (
console.log('handle onConnect', params)} /> Result: {String(data.value)}
diff --git a/seankwarren/react-flow-calc/src/styles/index.css b/seankwarren/react-flow-calc/src/styles/index.css index 3f8d24da..7ac26d92 100644 --- a/seankwarren/react-flow-calc/src/styles/index.css +++ b/seankwarren/react-flow-calc/src/styles/index.css @@ -48,6 +48,16 @@ body { font-weight: 700; } +.handle.input { + background-color: #fff; + border-color: #000; +} + +.handle.output { + background-color: #000; + border-color: #fff; +} + .round { border-radius: 50%; aspect-ratio: 1; From 4d34027bf376dcb2fb608562596e76ad269623af Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:24:04 -0400 Subject: [PATCH 18/80] fix: operand order honored correctly --- seankwarren/react-flow-calc/src/utils/calculate.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/seankwarren/react-flow-calc/src/utils/calculate.js b/seankwarren/react-flow-calc/src/utils/calculate.js index a74b636b..0ea2a0c4 100644 --- a/seankwarren/react-flow-calc/src/utils/calculate.js +++ b/seankwarren/react-flow-calc/src/utils/calculate.js @@ -12,11 +12,21 @@ const calculate = (nodes, edges, sourceHandleId) => { } else if (node.type === 'operationNode' || node.type === 'comparisonNode') { // Get all incoming edges for the node const inputEdges = edges.filter((e) => e.target === node.id); + + // Sort the input edges based on the position of their target handle + inputEdges.sort((edge1, edge2) => { + const edge1Position = edge1.targetHandle.split('-')[2]; + const edge2Position = edge2.targetHandle.split('-')[2]; + + return edge1Position === 'top' ? -1 : 1; + }); + // Calculate the values of all incoming nodes const inputValues = inputEdges.map((e) => { return calculate(nodes, edges, e.sourceHandle); }); + // Perform the specified operation on the input values const result = performOperation( node.data.value, From 53a04c96fb98af9135cfb07853831bd64747c882 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:28:15 -0400 Subject: [PATCH 19/80] fix: input handles now only support one edge --- .../src/components/FlowchartViewer.jsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index 4c5c57da..f981852f 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -37,17 +37,21 @@ const FlowchartViewer = ({ // Function to handle connecting nodes const handleConnect = (params) => { + const { source, sourceHandle, target, targetHandle } = params; + // Check if an edge with the same source and target already exists const existingEdge = edges.find( (edge) => edge.source === sourceHandle && edge.target === targetHandle ); - // If a duplicate edge is found, do not add the new edge - if (existingEdge) { - console.log('Duplicate edge detected, not adding the new edge'); - return; - } + if (existingEdge) return; + + // Check if there is already an edge connected to the target handle + const existingEdgeWithSameTargetHandle = edges.find( + (edge) => edge.targetHandle === targetHandle + ); + if (existingEdgeWithSameTargetHandle) return; // Create a new edge with an ID, source node ID, target node ID, and arrowhead type const newEdge = { From 81f151219f794db77d271c182d25ceb681903f20 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:50:09 -0400 Subject: [PATCH 20/80] chore(docs): README.md created --- seankwarren/Flowchart-Designer.md | 70 +++++++++++++++++-------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index 12d69e62..f7f71bfe 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -1,44 +1,50 @@ -# Flowchart Designer (Frontend/UX) +# Flowchart Calculator -> Ideal candidate: skilled front-end developer with UI/UX chops. +Flowchart Calculator is a React application that allows users to create flowcharts representing mathematical operations and logical comparisons. Users can visually create and connect nodes representing input values, operations, comparisons, and output results. +### Features -# Overview +- Drag and drop interface for adding nodes to the flowchart +- Custom node types: input, operation, comparison, and output +- Visual connections between nodes using edges +- Automatic calculation and display of output node results based on connected input and operation nodes +- Support for arithmetic operations (+, -, *, /) and logical comparisons (>, <, >=, <=, ==, !=) +- Real-time update of output nodes when input values or operations are changed +- Interactive flowchart editor powered by React Flow -Create a drag-and-drop flowchart designer close to a basic programming flowchart editor that is purpose-built for dealing with certain types of data. +### Use Case -Front-end developers: use Meteor and React.js and minimalistic UX/UI. -Pure UI/UX designers: create high fidelity mockups.  +This application can be used as a visual calculator for solving complex mathematical expressions and logical comparisons. Users can create a flowchart by connecting input nodes to operation and comparison nodes, which can then be connected to output nodes to display the results. By adjusting the input values and operations, users can easily explore different scenarios and observe the corresponding output changes in real time. -# Requirements +### How to Run: -1. Implement basic arithmetic units as flowchart elements: increment, decrement, multiply, divide -1. Implement conditions -1. Implement 2 viewer components: - - flowchart - - underlying data structure (JSON) -1. Make JSON data structure to update reactively based on flowchart content +install dependecies: +> `npm install` -# Expectations +then launch: +> `npm run dev` +> +> will launch on localhost:5173/ -1. up and running application OR high fidelity clickable mockups -1. drag-and-drop flowchart builder with support for basic arithmetics -1. clean and documented code -1. tests -# Timeline +Complete User Stories: +- [x] As an end user, I should be able to perform calculations using these 4 binary operators (+, -, *, /) and 6 comparison operators (<, >, >=, <=, ==, !=) +- [x] As an end user, when I operate on two values, I should be able to read the output as a number in an output node +- [x] As an end user, when I compare two values, I should be able to read the output as 'true' or 'false' in an output node +- [x] As an end user, when I operate on or compare two values, the top-most edge should always come first in the operation. e.g $3\over4$ vs $4\over3$ +- [x] As an end user, when I add any nodes or edges, the results in all output nodes should update. +- [x] As an end user, the result should update on any change to the input values or selected operators that I make. +- [x] As an end user, I should be able to construct flowcharts of arbitrary depth and number of output cells. +- [x] As an end user, I should be able to drag desired nodes onto the flowchart, and they should be placed at the dropped position. -We leave exact timing to the candidate. Must fit Within 5 days total. -# Notes +Potential Improvement User Stories: +- [ ] As an end user, node types should be quickly and easily distinguished by shape and color. +- [ ] As an end user, I should be able to edit the flowchart and have the JSON update accordingly. +- [ ] As an end user, I should be able to edit the JSON and have the flowchart update accordingly. +- [ ] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. +- [ ] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. +- [ ] As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed. +- [ ] As an end user, I should be able to use common unary oeprators such as sin, cos, tan, and ex. +- [ ] As an end user, I should be able to use the yx binary operator, that takes two inputs and calculates the exponential. +- [ ] As an end user, I should be able to attach a GradientNode to any node, and get the gradient of that value with respect to the final result -- use a designated github repo for version control and submission - -# Examples - -We recommend reviewing the following: - -- Introduction to Flowcharts: https://www.geeksforgeeks.org/an-introduction-to-flowcharts/ -- An example convergence workflow: https://docs.mat3ra.com/models/auxiliary-concepts/reciprocal-space/convergence/ -- ReactFlow library examples: https://reactflow.dev/docs/examples/overview/ and https://pro.reactflow.dev/pro-examples - -To discuss this task more in details, please [contact us](README.md). From bef14ce1e4e049a149f340cab2da933a46992870 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 14:50:33 -0400 Subject: [PATCH 21/80] feat: JSONViewer functional --- .../react-flow-calc/src/components/CalculatorWrapper.jsx | 2 +- seankwarren/react-flow-calc/src/components/JSONViewer.jsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 14421120..2976075e 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -69,7 +69,7 @@ const CalculatorWrapper = () => { setDraggedNodeType={setDraggedNodeType} />
- +
); }; diff --git a/seankwarren/react-flow-calc/src/components/JSONViewer.jsx b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx index 58a6a62e..08f88db8 100644 --- a/seankwarren/react-flow-calc/src/components/JSONViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx @@ -1,9 +1,10 @@ import React from 'react' -const JSONViewer = () => { +const JSONViewer = ({ nodes, edges }) => { return (
- JSONViewer + nodes: {JSON.stringify(nodes, ['id', 'data', 'value', 'type'], 4)} + edges: {JSON.stringify(edges, ['id', 'source', 'sourceHandle', 'target', 'targetHandle'], 4)}
) } From 011b27953c0930c3b7bcb62eeb5d6ff50599b654 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 15:24:29 -0400 Subject: [PATCH 22/80] feat: resizable split panes --- seankwarren/react-flow-calc/package-lock.json | 202 +++++++++--------- .../src/components/CalculatorWrapper.jsx | 21 +- .../src/components/JSONViewer.jsx | 13 +- .../react-flow-calc/src/styles/index.css | 12 ++ 4 files changed, 141 insertions(+), 107 deletions(-) diff --git a/seankwarren/react-flow-calc/package-lock.json b/seankwarren/react-flow-calc/package-lock.json index bbc3f2b8..cba54634 100644 --- a/seankwarren/react-flow-calc/package-lock.json +++ b/seankwarren/react-flow-calc/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "react": "^18.2.0", "react-dom": "^18.2.0", - "reactflow": "^11.7.0" + "reactflow": "^11.7.0", + "split-pane-react": "^0.1.3" }, "devDependencies": { "@types/react": "^18.0.28", @@ -767,101 +768,6 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, - "node_modules/@reactflow/background": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", - "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/controls": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", - "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/core": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", - "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", - "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/minimap": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", - "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", - "dependencies": { - "@reactflow/core": "11.7.0", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-resizer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", - "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", - "dependencies": { - "@reactflow/core": "^11.6.0", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", - "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", - "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" - }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" - } - }, "node_modules/@types/d3": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", @@ -1667,6 +1573,101 @@ "react-dom": ">=17" } }, + "node_modules/reactflow/node_modules/@reactflow/background": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", + "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/reactflow/node_modules/@reactflow/controls": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", + "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/reactflow/node_modules/@reactflow/core": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", + "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/reactflow/node_modules/@reactflow/minimap": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", + "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", + "dependencies": { + "@reactflow/core": "11.7.0", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/reactflow/node_modules/@reactflow/node-resizer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", + "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", + "dependencies": { + "@reactflow/core": "^11.6.0", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/reactflow/node_modules/@reactflow/node-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", + "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -1726,6 +1727,15 @@ "node": ">=0.10.0" } }, + "node_modules/split-pane-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/split-pane-react/-/split-pane-react-0.1.3.tgz", + "integrity": "sha512-+50VW9+1yglO+2AgL7MhvJ3UazYTqJ4LBJTs44od/D/CTvsqQ9xoDlaHdIpJ5SbXxUqBxvdJD5zoIVnoG+mNTg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 2976075e..087d6389 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -2,6 +2,8 @@ import React, { useState } from 'react'; import FlowchartViewer from './FlowchartViewer'; import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; +import SplitPane, { Pane } from 'split-pane-react'; +import 'split-pane-react/esm/themes/default.css'; import 'reactflow/dist/style.css'; const CalculatorWrapper = () => { @@ -11,6 +13,12 @@ const CalculatorWrapper = () => { const [draggedNodeType, setDraggedNodeType] = useState(null); + const [sizes, setSizes] = useState(['60%', '50%']); + + const handleSizeChange = (sizes) => { + setSizes(sizes); + }; + const handleDragStart = (e, nodeType) => { setDraggedNodeType(nodeType); e.dataTransfer.setData('text/plain', nodeType); @@ -53,12 +61,9 @@ const CalculatorWrapper = () => { }; return ( -
-
- + +
+ { setDraggedNodeType={setDraggedNodeType} />
- -
+ + ); }; diff --git a/seankwarren/react-flow-calc/src/components/JSONViewer.jsx b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx index 08f88db8..8b104ed9 100644 --- a/seankwarren/react-flow-calc/src/components/JSONViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/JSONViewer.jsx @@ -2,9 +2,16 @@ import React from 'react' const JSONViewer = ({ nodes, edges }) => { return ( -
- nodes: {JSON.stringify(nodes, ['id', 'data', 'value', 'type'], 4)} - edges: {JSON.stringify(edges, ['id', 'source', 'sourceHandle', 'target', 'targetHandle'], 4)} +
+ nodes: + {nodes.map((node) => { + return

{JSON.stringify(node, ['id', 'data', 'value', 'type'], 4)}

+ })} +
+ edges: + {edges.map((edge) => { + return

{JSON.stringify(edge, ['id', 'source', 'sourceHandle', 'target', 'targetHandle'], 4)}

+ })}
) } diff --git a/seankwarren/react-flow-calc/src/styles/index.css b/seankwarren/react-flow-calc/src/styles/index.css index 7ac26d92..7050405c 100644 --- a/seankwarren/react-flow-calc/src/styles/index.css +++ b/seankwarren/react-flow-calc/src/styles/index.css @@ -33,6 +33,10 @@ body { align-items: center; } +.react-split { + height: 100vh; +} + .node { border: 1px solid #000; padding: var(--med-padding); @@ -58,6 +62,14 @@ body { border-color: #fff; } +.json-viewer { + padding: var(--small-padding); + line-height: 1; + white-space: pre-wrap; + width: 100%; + border-left: 2px solid #ccc; +} + .round { border-radius: 50%; aspect-ratio: 1; From ce911c68b876099b9a30236cfbcbc027740aff24 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 8 Apr 2023 16:46:49 -0400 Subject: [PATCH 23/80] feat(style): added more UI for node selection --- seankwarren/Flowchart-Designer.md | 1 + .../src/components/CalculatorWrapper.jsx | 2 +- .../src/components/JSONViewer.jsx | 4 +-- .../src/components/NodeButtons.jsx | 2 +- .../react-flow-calc/src/styles/index.css | 26 ++++++++++++++++--- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index f7f71bfe..a8fe620b 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -47,4 +47,5 @@ Potential Improvement User Stories: - [ ] As an end user, I should be able to use common unary oeprators such as sin, cos, tan, and ex. - [ ] As an end user, I should be able to use the yx binary operator, that takes two inputs and calculates the exponential. - [ ] As an end user, I should be able to attach a GradientNode to any node, and get the gradient of that value with respect to the final result +- [ ] As a user, the input nodes should be exapandable to include multiple values each with their own handle diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 087d6389..8685097c 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -62,7 +62,7 @@ const CalculatorWrapper = () => { return ( -
+
{
nodes: {nodes.map((node) => { - return

{JSON.stringify(node, ['id', 'data', 'value', 'type'], 4)}

+ return

{JSON.stringify(node, ['id', 'data', 'value', 'type'], 4)}

})}
edges: {edges.map((edge) => { - return

{JSON.stringify(edge, ['id', 'source', 'sourceHandle', 'target', 'targetHandle'], 4)}

+ return

{JSON.stringify(edge, ['id', 'source', 'sourceHandle', 'target', 'targetHandle'], 4)}

})}
) diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx index 44f9d722..9f2628b0 100644 --- a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -2,7 +2,7 @@ import React from 'react' const NodeButtons = ({ addNode, handleDragStart }) => { return ( -
+
+
); -} +}; -export default BinaryNode \ No newline at end of file +export default BinaryNode; diff --git a/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx b/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx index 6964fb2c..62eb20c3 100644 --- a/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx @@ -5,7 +5,7 @@ const InputNode = ({ id, data }) => { const [val, setVal] = useState(data); const handleInputChange = (e) => { - const inputValue = parseFloat(e.target.value) + const inputValue = parseFloat(e.target.value); data.onChange(inputValue); // updateOutputNodes(); setVal(inputValue); diff --git a/seankwarren/react-flow-calc/src/components/customNodes/OutputNode.jsx b/seankwarren/react-flow-calc/src/components/customNodes/OutputNode.jsx index 6c2aa427..898f5d38 100644 --- a/seankwarren/react-flow-calc/src/components/customNodes/OutputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/customNodes/OutputNode.jsx @@ -1,18 +1,18 @@ -import React from 'react' +import React from 'react'; import { Handle } from 'reactflow'; -const OutputNode = ({ id, data}) => { - return ( -
- - Result: {String(data.value)} -
- ) -} +const OutputNode = ({ id, data }) => { + return ( +
+ + Result: {String(data.value)} +
+ ); +}; -export default OutputNode \ No newline at end of file +export default OutputNode; diff --git a/seankwarren/react-flow-calc/src/components/customNodes/UnaryNode.jsx b/seankwarren/react-flow-calc/src/components/customNodes/UnaryNode.jsx index b6479b7b..7979aceb 100644 --- a/seankwarren/react-flow-calc/src/components/customNodes/UnaryNode.jsx +++ b/seankwarren/react-flow-calc/src/components/customNodes/UnaryNode.jsx @@ -1,8 +1,7 @@ -import React from 'react' +import React from 'react'; import { Handle } from 'reactflow'; const UnaryNode = ({ id, data }) => { - const handleSelectChange = (e) => { data.onChange(e.target.value); }; @@ -29,6 +28,6 @@ const UnaryNode = ({ id, data }) => { />
); -} +}; -export default UnaryNode \ No newline at end of file +export default UnaryNode; diff --git a/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx b/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx index b16d55c6..ea30554f 100644 --- a/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx +++ b/seankwarren/react-flow-calc/src/hooks/usePrevious.jsx @@ -6,6 +6,6 @@ const usePrevious = (value) => { ref.current = value; }); return ref.current; -} +}; -export default usePrevious; \ No newline at end of file +export default usePrevious; From 2fa33fa805838132eec2d6f38c947120764f30d3 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 12:36:36 -0400 Subject: [PATCH 33/80] chore(docs): user stories updated --- seankwarren/Flowchart-Designer.md | 53 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index 003bcfd3..fb539c37 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -1,51 +1,54 @@ # Flowchart Calculator -Flowchart Calculator is a React application that allows users to create flowcharts representing mathematical operations and logical comparisons. Users can visually create and connect nodes representing input values, operations, comparisons, and output results. +Flowchart Calculator is a React application that allows users to create flowcharts representing mathematical operations, functions, and logical comparisons. It's built using React, Vite, and the React Flow library. + ### Features - Drag and drop interface for adding nodes to the flowchart -- Custom node types: input, operation, comparison, and output -- Visual connections between nodes using edges -- Automatic calculation and display of output node results based on connected input and operation nodes -- Support for arithmetic operations (+, -, *, /) and logical comparisons (>, <, >=, <=, ==, !=) -- Real-time update of output nodes when input values or operations are changed +- Live calculation and display of results +- Support for arithmetic operations (+, -, *, /, ^), functions (sin, cos, tan, exp), and logical comparisons (>, <, >=, <=, ==, !=) +- View real-time JSON representation of nodes and edges - Interactive flowchart editor powered by React Flow +- Dark mode 🎉 -### Use Case +### Usage -This application can be used as a visual calculator for solving complex mathematical expressions and logical comparisons. Users can create a flowchart by connecting input nodes to operation and comparison nodes, which can then be connected to output nodes to display the results. By adjusting the input values and operations, users can easily explore different scenarios and observe the corresponding output changes in real time. +- Drag and drop a custom node (input, operation, comparison, or output) from the buttons panel onto the flowchart area. +- Connect nodes using the handles on each node. Ensure to connect the output handle of one node to the input handle of another. +- Edit input nodes or operation/comparison nodes to see the updated output values in the output nodes. +- View the JSON representation of nodes and edges in the right pane. -### How to Run: +### Setup -install dependecies: -> `npm install` +Install dependencies using `npm install`. -then launch: -> `npm run dev` -> +Run the development server using `npm run dev`. > will launch on localhost:5173/ +Build the production version using `npm run build`. ### Complete User Stories: -- [x] As an end user, I should be able to perform calculations using these 4 binary operators (+, -, *, /) and 6 comparison operators (<, >, >=, <=, ==, !=) -- [x] As an end user, when I operate on two values, I should be able to read the output as a number in an output node -- [x] As an end user, when I compare two values, I should be able to read the output as 'true' or 'false' in an output node +- [x] As an end user, I should be able to perform calculations using these 4 binary operators (+, -, *, /) and 6 comparison operators (<, >, >=, <=, ==, !=). +- [x] As an end user, when I operate on two values, I should be able to read the output as a number in an output node. +- [x] As an end user, when I compare two values, I should be able to read the output as 'true' or 'false' in an output node. - [x] As an end user, when I operate on or compare two values, the top-most edge should always come first in the operation. e.g $3\over4$ vs $4\over3$ - [x] As an end user, when I add any nodes or edges, the results in all output nodes should update. - [x] As an end user, the result should update on any change to the input values or selected operators that I make. - [x] As an end user, I should be able to construct flowcharts of arbitrary depth and number of output cells. - [x] As an end user, I should be able to drag desired nodes onto the flowchart, and they should be placed at the dropped position. - [x] As an end user, I should be able to edit the flowchart and have the JSON update accordingly. +- [x] As an end user, I should be able to use common unary operators such as sin, cos, tan, and ex. +- [x] As an end user, I should be able to use the yx binary operator, that takes two inputs and calculates the exponential. +- [x] As an end user, node types should be quickly and easily distinguished by shape and color. ### Potential Improvement User Stories: -- [ ] As an end user, node types should be quickly and easily distinguished by shape and color. -- [ ] As an end user, I should be able to edit the JSON and have the flowchart update accordingly. +- [ ] As an end user, I should see some nodes on screen when I launch the application that explain how to use the app. +- [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ +- [ ] As an end user, I should be able to easily read the JSON representation with syntax highlighting. - [ ] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. - [ ] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. -- [ ] As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed. -- [ ] As an end user, I should be able to use common unary operators such as sin, cos, tan, and ex. -- [ ] As an end user, I should be able to use the yx binary operator, that takes two inputs and calculates the exponential. -- [ ] As a user, the input nodes should be exapandable to include multiple values each with their own handle -- [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart -- [ ] As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place +- [ ] ~~As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed.~~ +- [ ] As an end user, the input nodes should be exapandable to include multiple values each with their own handle. +- [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. +- [ ] As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place. From a97b5f0bc57352b952d830f91c66aecd125472c7 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 15:20:04 -0400 Subject: [PATCH 34/80] chore: nodeTypes moved to seperate file --- .../src/components/FlowchartViewer.jsx | 19 +++++++------------ .../src/components/customNodes/nodeTypes.jsx | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/components/customNodes/nodeTypes.jsx diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx index aedeeea8..f0fa301d 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx @@ -6,13 +6,9 @@ import ReactFlow, { applyNodeChanges, applyEdgeChanges, } from 'reactflow'; -import InputNode from './customNodes/InputNode'; -import BinaryNode from './customNodes/BinaryNode'; -import UnaryNode from './customNodes/UnaryNode'; -import OutputNode from './customNodes/OutputNode'; -import ComparisonNode from './customNodes/ComparisonNode'; import calculate from '../utils/calculate'; import usePrevious from '../hooks/usePrevious'; +import nodeTypesConfig from './customNodes/nodeTypes'; const FlowchartViewer = ({ nodes, @@ -104,13 +100,7 @@ const FlowchartViewer = ({ // Define custom node types const nodeTypes = useMemo(() => { - return { - inputNode: (props) => , - binaryNode: (props) => , - unaryNode: (props) => , - comparisonNode: (props) => , - outputNode: (props) => , - }; + return nodeTypesConfig }, []); useEffect(() => { @@ -135,6 +125,11 @@ const FlowchartViewer = ({ y: e.clientY - reactFlowBounds.top, }; + // Adjust position based on current pan position + // const transform = zoomPanHelper.getTransform(e.currentTarget); + // position.x = (position.x - transform[4]) / transform[0]; + // position.y = (position.y - transform[5]) / transform[3]; + addNode(draggedNodeType, position); setDraggedNodeType(null); }; diff --git a/seankwarren/react-flow-calc/src/components/customNodes/nodeTypes.jsx b/seankwarren/react-flow-calc/src/components/customNodes/nodeTypes.jsx new file mode 100644 index 00000000..da83418c --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/customNodes/nodeTypes.jsx @@ -0,0 +1,15 @@ +import InputNode from './InputNode'; +import BinaryNode from './BinaryNode'; +import UnaryNode from './UnaryNode'; +import OutputNode from './OutputNode'; +import ComparisonNode from './ComparisonNode'; + +const nodeTypesConfig = { + inputNode: (props) => , + binaryNode: (props) => , + unaryNode: (props) => , + comparisonNode: (props) => , + outputNode: (props) => , +}; + +export default nodeTypesConfig; \ No newline at end of file From 67941baa9b74415760dff0a31ab29f7fdbef798f Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 15:21:52 -0400 Subject: [PATCH 35/80] feat(style): can drag from entire button area and other style changes --- .../src/components/NodeButtons.jsx | 10 +-- .../src/components/customNodes/InputNode.jsx | 2 +- .../react-flow-calc/src/styles/index.css | 61 ++++++++++++++++--- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx index 539031d9..9451ca8f 100644 --- a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -18,35 +18,35 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode }) => { draggable='true' onDragStart={(e) => handleDragStart(e, 'input')} > - in + in
); diff --git a/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx b/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx index 62eb20c3..6876ab6a 100644 --- a/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx +++ b/seankwarren/react-flow-calc/src/components/customNodes/InputNode.jsx @@ -13,7 +13,7 @@ const InputNode = ({ id, data }) => { return (
- + span { + padding: var(--med-padding); + display: inline-flex; + justify-content: center; + align-items: center; +} + +.handle { + width: 7px; + height: 7px; } .handle.input { @@ -80,7 +93,7 @@ body { line-height: 1; white-space: pre-wrap; width: 100%; - border-left: 2px solid #ccc; + border-left: 2px solid var(--light-gray); overflow-y: auto; } @@ -112,14 +125,34 @@ body { input { width: 80px; font-family: 'Courier New', Courier, monospace; - font-weight: 600; + font-weight: var(--ft-wt-bold); } select { width: 40px; font-family: 'Courier New', Courier, monospace; - font-weight: 600; + font-weight: var(--ft-wt-bold); font-size: small; + background-color: transparent; + border: 1px solid #000; + border-radius: var(--small-radius); + appearance: none; + text-align: center; +} + +/* Add this to style the dropdown arrow */ +select::-ms-expand { + display: none; +} + +select::after { + content: '▼'; + font-size: 10px; + /* position: absolute; */ + /* right: 5px; + top: 50%; */ + /* transform: translateY(-50%); */ + pointer-events: none; /* Ignore clicks on the arrow */ } .darkmode-switch { @@ -135,4 +168,12 @@ select { .react-flow__attribution { background: none; -} \ No newline at end of file +} + +.react-flow__node-default { + width: 400px; + white-space: pre-wrap; + text-align: left; + font-weight: var(--ft-wt-bold); + font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; +} From b884e923589c7f79ae62390f79ca89f957c82afe Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 15:23:17 -0400 Subject: [PATCH 36/80] feat: nanoid for node ids and start node added --- seankwarren/react-flow-calc/package-lock.json | 30 +++++++++++++++---- .../src/components/CalculatorWrapper.jsx | 23 +++++++++++--- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/seankwarren/react-flow-calc/package-lock.json b/seankwarren/react-flow-calc/package-lock.json index ebde164b..5d4f6480 100644 --- a/seankwarren/react-flow-calc/package-lock.json +++ b/seankwarren/react-flow-calc/package-lock.json @@ -8,6 +8,7 @@ "name": "react-flow-calc", "version": "0.0.0", "dependencies": { + "nanoid": "^4.0.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-switch": "^7.0.0", @@ -1466,10 +1467,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", "funding": [ { "type": "github", @@ -1477,10 +1477,10 @@ } ], "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^14 || ^16 || >=18" } }, "node_modules/node-releases": { @@ -1533,6 +1533,24 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index c0b22b1a..04a03f63 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import FlowchartViewer from './FlowchartViewer'; import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; @@ -6,10 +6,24 @@ import SplitPane, { Pane } from 'split-pane-react'; import Switch from 'react-switch'; import 'split-pane-react/esm/themes/default.css'; import 'reactflow/dist/style.css'; +import { nanoid } from 'nanoid'; +// import { initialEdges, initialNodes } from '../../public/initialFlow'; const CalculatorWrapper = () => { // Set up state for nodes and edges - const [nodes, setNodes] = useState([]); + const [nodes, setNodes] = useState([ + { + id: 'instructions', + type: 'default', + position: { x: 250, y: 150 }, + selected: true, + data: { label: ` + 1. Drag and drop a node onto the flowchart\n + 2. Connect nodes using the handles on each node. Ensure to connect an outputs (black) to input (white).\n + 3. Edit input values and select functions from the dropdown to see the updated results in the output nodes.\n + 4. View the JSON representation of nodes and edges on the right.` }, + }, + ]); const [edges, setEdges] = useState([]); // Drag and drop state @@ -33,9 +47,9 @@ const CalculatorWrapper = () => { }; // Function to add a new node - const addNode = (type, position) => { + const addNode = (type, position, value) => { // Generate a unique ID for the node - const id = `${type}${nodes.length + 1}`; + const id = `${type}${nanoid(11)}`; // Create a new node object with an ID, type, initial value, and onChange function const newNode = { @@ -43,6 +57,7 @@ const CalculatorWrapper = () => { type: `${type}Node`, data: { value: + value !== undefined ? value : type === 'input' ? 0 : type === 'binary' From da840fd8f23cf0ec782524fdcf649a3961b84bca Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 15:25:05 -0400 Subject: [PATCH 37/80] fix(style): init instructions restyled --- .../src/components/CalculatorWrapper.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 04a03f63..1cc33a71 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -17,11 +17,11 @@ const CalculatorWrapper = () => { type: 'default', position: { x: 250, y: 150 }, selected: true, - data: { label: ` - 1. Drag and drop a node onto the flowchart\n - 2. Connect nodes using the handles on each node. Ensure to connect an outputs (black) to input (white).\n - 3. Edit input values and select functions from the dropdown to see the updated results in the output nodes.\n - 4. View the JSON representation of nodes and edges on the right.` }, + data: { label: + `1. Drag and drop a node onto the flowchart\n` + + `2. Connect nodes using the handles on each node. Ensure to connect an outputs (black) to input (white).\n` + + `3. Edit input values and select functions from the dropdown to see the updated results in the output nodes.\n` + + `4. View the JSON representation of nodes and edges on the right.` }, }, ]); const [edges, setEdges] = useState([]); From fb0cda2483567ed8d2258183398bd48f9c5ef348 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 22:52:43 -0400 Subject: [PATCH 38/80] refactor: drag and drop button modularized --- .../src/components/DraggableButton.jsx | 15 ++++++ .../src/components/NodeButtons.jsx | 46 +++---------------- 2 files changed, 22 insertions(+), 39 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/components/DraggableButton.jsx diff --git a/seankwarren/react-flow-calc/src/components/DraggableButton.jsx b/seankwarren/react-flow-calc/src/components/DraggableButton.jsx new file mode 100644 index 00000000..912f9d2e --- /dev/null +++ b/seankwarren/react-flow-calc/src/components/DraggableButton.jsx @@ -0,0 +1,15 @@ +import React from 'react'; + +const DraggableButton = ({ label, nodeType, onDragStart }) => { + return ( + + ); +}; + +export default DraggableButton; \ No newline at end of file diff --git a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx index 9451ca8f..cdbffc65 100644 --- a/seankwarren/react-flow-calc/src/components/NodeButtons.jsx +++ b/seankwarren/react-flow-calc/src/components/NodeButtons.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import DraggableButton from './DraggableButton'; const NodeButtons = ({ addNode, handleDragStart, isDarkMode }) => { // Darkmode style toggling @@ -9,45 +10,12 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode }) => { }; return ( -
- - - - - +
+ + + + +
); }; From 66e732a45fd0f2657e4c0f902d2d8e9e4f464114 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 22:53:22 -0400 Subject: [PATCH 39/80] refactor: node creation modularized --- .../src/components/CalculatorWrapper.jsx | 38 ++----------------- .../react-flow-calc/src/utils/createNode.js | 34 +++++++++++++++++ 2 files changed, 38 insertions(+), 34 deletions(-) create mode 100644 seankwarren/react-flow-calc/src/utils/createNode.js diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx index 1cc33a71..10f535e7 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx @@ -7,6 +7,7 @@ import Switch from 'react-switch'; import 'split-pane-react/esm/themes/default.css'; import 'reactflow/dist/style.css'; import { nanoid } from 'nanoid'; +import createNode from '../utils/createNode'; // import { initialEdges, initialNodes } from '../../public/initialFlow'; const CalculatorWrapper = () => { @@ -47,40 +48,9 @@ const CalculatorWrapper = () => { }; // Function to add a new node - const addNode = (type, position, value) => { - // Generate a unique ID for the node - const id = `${type}${nanoid(11)}`; - - // Create a new node object with an ID, type, initial value, and onChange function - const newNode = { - id, - type: `${type}Node`, - data: { - value: - value !== undefined ? value : - type === 'input' - ? 0 - : type === 'binary' - ? 'add' - : type === 'comparison' - ? 'greater' - : null, - onChange: (value) => { - // Update the value of the node when its input changes - setNodes((ns) => { - return ns.map((n) => - n.id === id - ? { ...n, data: { ...n.data, value } } - : n - ); - }); - }, - }, - position: position, // Set the position here - }; - - // Add the new node to the list of nodes - setNodes((ns) => [...ns, newNode]); + const addNode = (type, position) => { + const newNode = createNode(type, position); + setNodes((nodes) => [...nodes, newNode]); }; return ( diff --git a/seankwarren/react-flow-calc/src/utils/createNode.js b/seankwarren/react-flow-calc/src/utils/createNode.js new file mode 100644 index 00000000..6988d489 --- /dev/null +++ b/seankwarren/react-flow-calc/src/utils/createNode.js @@ -0,0 +1,34 @@ +import { nanoid } from 'nanoid'; + +const createNode = (type, position, value) => { + const id = `${type}-${nanoid(11)}`; + + const newNode = { + id, + type: `${type}Node`, + data: { + value: value !== undefined ? value : getDefaultNodeValue(type), + onChange: (value) => { + // This function will be updated later in the component + }, + }, + position: position, + }; + + return newNode; +}; + +const getDefaultNodeValue = (type) => { + switch (type) { + case 'input': + return 0; + case 'binary': + return 'add'; + case 'comparison': + return 'greater'; + default: + return null; + } +}; + +export default createNode; \ No newline at end of file From 963777ec263ac14199254b657df5fe23712c7569 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 22:53:49 -0400 Subject: [PATCH 40/80] chore(docs): user stories updated --- seankwarren/Flowchart-Designer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index fb539c37..d4315515 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -40,9 +40,9 @@ Build the production version using `npm run build`. - [x] As an end user, I should be able to use common unary operators such as sin, cos, tan, and ex. - [x] As an end user, I should be able to use the yx binary operator, that takes two inputs and calculates the exponential. - [x] As an end user, node types should be quickly and easily distinguished by shape and color. +- [x] As an end user, I should see some nodes on screen when I launch the application that explain how to use the app. ### Potential Improvement User Stories: -- [ ] As an end user, I should see some nodes on screen when I launch the application that explain how to use the app. - [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ - [ ] As an end user, I should be able to easily read the JSON representation with syntax highlighting. - [ ] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. From 3c8b77f08e2ece54ab982486efda3b6ff8285d69 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 9 Apr 2023 23:11:46 -0400 Subject: [PATCH 41/80] refactor: reorganize dir and renamed components --- seankwarren/react-flow-calc/src/App.jsx | 4 +- .../FlowchartCalculator.jsx} | 11 +++--- .../FlowchartCanvas.jsx} | 38 ++++++------------- .../components/{ => mainPage}/JSONViewer.jsx | 0 .../components/{ => mainPage}/NodeButtons.jsx | 8 ++-- .../{ => reusable}/DraggableButton.jsx | 4 +- .../react-flow-calc/src/utils/getNodeColor.js | 18 +++++++++ 7 files changed, 43 insertions(+), 40 deletions(-) rename seankwarren/react-flow-calc/src/components/{CalculatorWrapper.jsx => mainPage/FlowchartCalculator.jsx} (93%) rename seankwarren/react-flow-calc/src/components/{FlowchartViewer.jsx => mainPage/FlowchartCanvas.jsx} (84%) rename seankwarren/react-flow-calc/src/components/{ => mainPage}/JSONViewer.jsx (100%) rename seankwarren/react-flow-calc/src/components/{ => mainPage}/NodeButtons.jsx (80%) rename seankwarren/react-flow-calc/src/components/{ => reusable}/DraggableButton.jsx (64%) create mode 100644 seankwarren/react-flow-calc/src/utils/getNodeColor.js diff --git a/seankwarren/react-flow-calc/src/App.jsx b/seankwarren/react-flow-calc/src/App.jsx index e16eed4e..2632d716 100644 --- a/seankwarren/react-flow-calc/src/App.jsx +++ b/seankwarren/react-flow-calc/src/App.jsx @@ -1,9 +1,9 @@ -import CalculatorWrapper from "./components/CalculatorWrapper" +import FlowchartCalculator from "./components/mainPage/FlowchartCalculator" function App() { return (
- +
) } diff --git a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx b/seankwarren/react-flow-calc/src/components/mainPage/FlowchartCalculator.jsx similarity index 93% rename from seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx rename to seankwarren/react-flow-calc/src/components/mainPage/FlowchartCalculator.jsx index 10f535e7..2a806ee9 100644 --- a/seankwarren/react-flow-calc/src/components/CalculatorWrapper.jsx +++ b/seankwarren/react-flow-calc/src/components/mainPage/FlowchartCalculator.jsx @@ -1,16 +1,15 @@ import React, { useState, useEffect } from 'react'; -import FlowchartViewer from './FlowchartViewer'; +import FlowchartCanvas from './FlowchartCanvas'; import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; import SplitPane, { Pane } from 'split-pane-react'; import Switch from 'react-switch'; import 'split-pane-react/esm/themes/default.css'; import 'reactflow/dist/style.css'; -import { nanoid } from 'nanoid'; -import createNode from '../utils/createNode'; +import createNode from '../../utils/createNode'; // import { initialEdges, initialNodes } from '../../public/initialFlow'; -const CalculatorWrapper = () => { +const FlowchartCalculator = () => { // Set up state for nodes and edges const [nodes, setNodes] = useState([ { @@ -64,7 +63,7 @@ const CalculatorWrapper = () => { handleDragStart={handleDragStart} isDarkMode={isDarkMode} /> - { ); }; -export default CalculatorWrapper; +export default FlowchartCalculator; diff --git a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx b/seankwarren/react-flow-calc/src/components/mainPage/FlowchartCanvas.jsx similarity index 84% rename from seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx rename to seankwarren/react-flow-calc/src/components/mainPage/FlowchartCanvas.jsx index f0fa301d..9cf1fa79 100644 --- a/seankwarren/react-flow-calc/src/components/FlowchartViewer.jsx +++ b/seankwarren/react-flow-calc/src/components/mainPage/FlowchartCanvas.jsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo } from 'react'; +import React, { useState, useCallback, useEffect, useMemo } from 'react'; import ReactFlow, { Controls, Background, @@ -6,11 +6,12 @@ import ReactFlow, { applyNodeChanges, applyEdgeChanges, } from 'reactflow'; -import calculate from '../utils/calculate'; -import usePrevious from '../hooks/usePrevious'; -import nodeTypesConfig from './customNodes/nodeTypes'; +import calculate from '../../utils/calculate'; +import usePrevious from '../../hooks/usePrevious'; +import nodeTypesConfig from '../customNodes/nodeTypes'; +import getNodeColor from '../../utils/getNodeColor'; -const FlowchartViewer = ({ +const FlowchartCanvas = ({ nodes, edges, setNodes, @@ -23,6 +24,7 @@ const FlowchartViewer = ({ // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); + const [reactFlowInstance, setReactFlowInstance] = useState(null); // handle nodes and edges changes const onNodesChange = useCallback( @@ -120,10 +122,10 @@ const FlowchartViewer = ({ if (!draggedNodeType) return; const reactFlowBounds = e.currentTarget.getBoundingClientRect(); - const position = { + const position = reactFlowInstance.project({ x: e.clientX - reactFlowBounds.left, y: e.clientY - reactFlowBounds.top, - }; + }); // Adjust position based on current pan position // const transform = zoomPanHelper.getTransform(e.currentTarget); @@ -145,23 +147,6 @@ const FlowchartViewer = ({ : 'rgba(255, 255, 255, 1)', }; - const customNodeColor = (node) => { - switch (node.type) { - case 'inputNode': - return 'var(--input-color)'; - case 'binaryNode': - return 'var(--binary-color)'; - case 'unaryNode': - return 'var(--unary-color)'; - case 'comparisonNode': - return 'var(--comparison-color)'; - case 'outputNode': - return 'var(--output-color)'; - default: - return '#eee'; - } - }; - return ( - + { // Darkmode style toggling @@ -12,9 +12,9 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode }) => { return (
- - - + + +
); diff --git a/seankwarren/react-flow-calc/src/components/DraggableButton.jsx b/seankwarren/react-flow-calc/src/components/reusable/DraggableButton.jsx similarity index 64% rename from seankwarren/react-flow-calc/src/components/DraggableButton.jsx rename to seankwarren/react-flow-calc/src/components/reusable/DraggableButton.jsx index 912f9d2e..e9eb6d58 100644 --- a/seankwarren/react-flow-calc/src/components/DraggableButton.jsx +++ b/seankwarren/react-flow-calc/src/components/reusable/DraggableButton.jsx @@ -1,9 +1,9 @@ import React from 'react'; -const DraggableButton = ({ label, nodeType, onDragStart }) => { +const DraggableButton = ({ label, nodeType, onDragStart, className }) => { return ( { - // If the Links collection is empty, add some data. - if (await LinksCollection.find().countAsync() === 0) { - await insertLink({ - title: 'Do the Tutorial', - url: 'https://www.meteor.com/tutorials/react/creating-an-app', - }); - - await insertLink({ - title: 'Follow the Guide', - url: 'https://guide.meteor.com', - }); - - await insertLink({ - title: 'Read the Docs', - url: 'https://docs.meteor.com', - }); - - await insertLink({ - title: 'Discussions', - url: 'https://forums.meteor.com', + // We publish the entire LFlowsinks collection to all clients. + // In order to be fetched in real-time to the clients + Meteor.publish("flows", function () { + return FlowsCollection.find(); }); - } +}); - // We publish the entire Links collection to all clients. - // In order to be fetched in real-time to the clients - Meteor.publish("links", function () { - return LinksCollection.find(); - }); +Meteor.methods({ + saveFlow(data) { + FlowsCollection.insert(data); + } }); From 0377522e05326e10e3816d32c84430faa891900f Mon Sep 17 00:00:00 2001 From: seankwarren Date: Mon, 10 Apr 2023 16:27:24 -0400 Subject: [PATCH 50/80] fix: instruction typo corrections --- .../flowchart-calculator/imports/ui/utils/startingNode.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/utils/startingNode.js b/seankwarren/flowchart-calculator/imports/ui/utils/startingNode.js index 92a1effe..19e5fe05 100644 --- a/seankwarren/flowchart-calculator/imports/ui/utils/startingNode.js +++ b/seankwarren/flowchart-calculator/imports/ui/utils/startingNode.js @@ -4,9 +4,9 @@ const startingNode = { position: { x: 100, y: 150 }, selected: true, data: { label: - `1. Drag and drop a node onto the flowchart\n` + - `2. Connect nodes using the handles on each node. Ensure to connect an outputs (black) to input (white).\n` + - `3. Edit input values and select functions from the dropdown to see the updated results in the output nodes.\n` + + `1. Drag and drop nodes onto the flowchart\n` + + `2. Connect nodes using the handles on each node. Ensure to connect outputs (black) to inputs (white).\n` + + `3. Edit input values and select functions to see the updated outputs.\n` + `4. View the JSON representation of nodes and edges on the right.` }, } From 6589e7b07d1fe4125de783bcc10749a86dff70b3 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Mon, 10 Apr 2023 17:16:06 -0400 Subject: [PATCH 51/80] feat: support for loading saved flows added --- .../mainPage/FlowchartCalculator.jsx | 45 +++++++++++++++++-- .../ui/components/mainPage/JSONViewer.jsx | 11 ++++- .../flowchart-calculator/server/main.js | 7 ++- 3 files changed, 57 insertions(+), 6 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index 655a2d9a..e6503c2e 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import Switch from 'react-switch'; import 'reactflow/dist/style.css'; import SplitPane from 'split-pane-react'; @@ -10,10 +10,13 @@ import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; const FlowchartCalculator = () => { - // Set up state for nodes and edges + // state for nodes and edges const [nodes, setNodes] = useState([startingNode]); const [edges, setEdges] = useState([]); + // state for fetching saved flows from db + const [fetchedFlows, setFetchedFlows] = useState([]); + const saveFlow = () => { Meteor.call('saveFlow', {nodes, edges}, (error) => { if (error) { @@ -24,6 +27,23 @@ const FlowchartCalculator = () => { }); }; + const fetchFlows = () => { + Meteor.call('fetchFlows', (error, result) => { + if (error) { + console.error("Error fetching flows:", error); + } else { + setFetchedFlows(result); + } + }); + }; + + const loadFlow = (flow) => { + const newNodes = attachOnConnect(flow.nodes); + setNodes(newNodes); + setEdges(flow.edges); + }; + + // Drag and drop state const [draggedNodeType, setDraggedNodeType] = useState(null); @@ -61,13 +81,24 @@ const FlowchartCalculator = () => { setNodes((nodes) => [...nodes, newNode]); }; + const attachOnConnect = (nodes) => { + return nodes.map((node) => ({ + ...node, + data: { ...node.data, onChange: handleNodeChange }, + })); + }; + + useEffect(() => { + fetchFlows(); + }, []); + return (
- + { isDarkMode={isDarkMode} />
- + { +const JSONViewer = ({ children, nodes, edges, flows, loadFlow, isDarkMode }) => { // Darkmode style toggling const jsonViewerStyle = { backgroundColor: isDarkMode @@ -20,6 +20,15 @@ const JSONViewer = ({ children, nodes, edges, isDarkMode }) => { style={{ ...jsonViewerStyle, height: '100vh' }} > {children} +
                     nodes: [
diff --git a/seankwarren/flowchart-calculator/server/main.js b/seankwarren/flowchart-calculator/server/main.js
index 16919690..8a14d996 100644
--- a/seankwarren/flowchart-calculator/server/main.js
+++ b/seankwarren/flowchart-calculator/server/main.js
@@ -10,7 +10,12 @@ Meteor.startup(async () => {
 });
 
 Meteor.methods({
+
     saveFlow(data) {
       FlowsCollection.insert(data);
-    }
+    },
+
+    fetchFlows() {
+        return FlowsCollection.find().fetch();
+    },
 });

From 924103eee34d03712ce5c40abcd5823cc05f85e0 Mon Sep 17 00:00:00 2001
From: seankwarren 
Date: Mon, 10 Apr 2023 17:27:04 -0400
Subject: [PATCH 52/80] fix: input node loads default value from flow

---
 .../imports/ui/components/customNodes/InputNode.jsx             | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/InputNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/InputNode.jsx
index 7f69d3d2..58a4c6dd 100644
--- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/InputNode.jsx
+++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/InputNode.jsx
@@ -9,7 +9,7 @@ const InputNode = ({ id, data }) => {
 
     return (
         
- + Date: Mon, 10 Apr 2023 19:08:54 -0400 Subject: [PATCH 53/80] feat: added support for flow names --- .../ui/components/customNodes/BinaryNode.jsx | 2 +- .../components/customNodes/ComparisonNode.jsx | 2 +- .../ui/components/customNodes/UnaryNode.jsx | 2 +- .../mainPage/FlowchartCalculator.jsx | 11 ++++- .../ui/components/mainPage/JSONViewer.jsx | 48 +++++++++++++++---- .../imports/ui/styles/index.css | 2 +- 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx index 2aa94c96..da62c589 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx @@ -27,7 +27,7 @@ const BinaryNode = ({ id, data }) => { top: '70%', }} /> - {binaryOperations.map((op) => )} { top: '70%', }} /> - {comparisonOperations.map((op) => )} { position='left' id={`${id}-left`} /> - {unaryOperations.map((op) => )} { // state for fetching saved flows from db const [fetchedFlows, setFetchedFlows] = useState([]); + // state for user input flow name + const [flowName, setFlowName] = useState(''); + + const saveFlow = () => { - Meteor.call('saveFlow', {nodes, edges}, (error) => { + Meteor.call('saveFlow', {nodes, edges, name: flowName || undefined}, (error) => { if (error) { console.log(error.reason); } else { @@ -98,7 +102,6 @@ const FlowchartCalculator = () => { className='flowchart-container' style={{ height: '100vh', width: '100%' }} > - { isDarkMode={isDarkMode} flows={fetchedFlows} loadFlow={loadFlow} + saveFlow={saveFlow} + onSave={saveFlow} + flowName={flowName} + setFlowName={setFlowName} > { +const JSONViewer = ({ + children, + nodes, + edges, + flows, + loadFlow, + isDarkMode, + onSave, + flowName, + setFlowName, +}) => { // Darkmode style toggling const jsonViewerStyle = { backgroundColor: isDarkMode @@ -10,25 +20,43 @@ const JSONViewer = ({ children, nodes, edges, flows, loadFlow, isDarkMode }) => color: isDarkMode ? 'rgba(255, 255, 255, 1)' : 'rgba(0, 0, 0, 1)', }; + const handleFlowNameChange = (e) => { + setFlowName(e.target.value); + }; + useEffect(() => { hljs.highlightAll(); }, [nodes, edges]); + // TODO: move save/load controls to seperate component return (
{children} - +
+ + + +
                     nodes: [
diff --git a/seankwarren/flowchart-calculator/imports/ui/styles/index.css b/seankwarren/flowchart-calculator/imports/ui/styles/index.css
index 460d396c..a79f20ce 100644
--- a/seankwarren/flowchart-calculator/imports/ui/styles/index.css
+++ b/seankwarren/flowchart-calculator/imports/ui/styles/index.css
@@ -128,7 +128,7 @@ input {
     font-weight: var(--ft-wt-bold);
 }
 
-select {
+.node-dropdown {
     width: 40px;
     font-family: 'Courier New', Courier, monospace;
     font-weight: var(--ft-wt-bold);

From 297bda189b0f819dfb4b1629a65abee297ef989a Mon Sep 17 00:00:00 2001
From: seankwarren 
Date: Mon, 10 Apr 2023 19:24:09 -0400
Subject: [PATCH 54/80] feat: support for clearing flows from db

---
 .../components/mainPage/FlowchartCalculator.jsx | 17 ++++++++++++++++-
 seankwarren/flowchart-calculator/server/main.js |  4 ++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
index 6cbb47d3..6811bc16 100644
--- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
+++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
@@ -27,6 +27,8 @@ const FlowchartCalculator = () => {
                 console.log(error.reason);
             } else {
                 console.log('Data saved to MongoDB');
+                setFlowName('');
+                fetchFlows();
             }
         });
     };
@@ -41,6 +43,16 @@ const FlowchartCalculator = () => {
         });
     };
 
+    const clearFlows = () => {
+        Meteor.call('clearFlows', (error) => {
+          if (error) {
+            console.error("Error clearing flows:", error);
+          } else {
+            console.log("Flows collection cleared");
+          }
+        });
+      };
+
     const loadFlow = (flow) => {
         const newNodes = attachOnConnect(flow.nodes);
         setNodes(newNodes);
@@ -88,7 +100,9 @@ const FlowchartCalculator = () => {
     const attachOnConnect = (nodes) => {
         return nodes.map((node) => ({
             ...node,
-            data: { ...node.data, onChange: handleNodeChange },
+            data: { ...node.data, onChange: (newValue) => { 
+                handleNodeChange(node.id, newValue) 
+            } },
         }));
     };
 
@@ -102,6 +116,7 @@ const FlowchartCalculator = () => {
                 className='flowchart-container'
                 style={{ height: '100vh', width: '100%' }}
             >
+                {/*  */}
                 
Date: Mon, 10 Apr 2023 19:26:16 -0400
Subject: [PATCH 55/80] fix: flow names now enforced as unique

---
 .../mainPage/FlowchartCalculator.jsx          | 25 ++++++++++++-------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
index 6811bc16..f6a4a582 100644
--- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
+++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx
@@ -22,15 +22,22 @@ const FlowchartCalculator = () => {
 
 
     const saveFlow = () => {
-        Meteor.call('saveFlow', {nodes, edges, name: flowName || undefined}, (error) => {
-            if (error) {
-                console.log(error.reason);
-            } else {
-                console.log('Data saved to MongoDB');
-                setFlowName('');
-                fetchFlows();
-            }
-        });
+        // Check if a flow with the same name already exists
+        const flowWithNameExists = fetchedFlows.some(flow => flow.name === flowName);
+        
+        if (flowWithNameExists) {
+            alert('A flow with this name already exists. Please choose a different name.');
+        } else {
+            Meteor.call('saveFlow', {nodes, edges, name: flowName}, (error) => {
+                if (error) {
+                    console.log(error.reason);
+                } else {
+                    console.log('Data saved to MongoDB');
+                    setFlowName(''); // Clear the flow name input field after a successful save
+                    fetchFlows(); // Fetch the flows again to update the dropdown
+                }
+            });
+        }
     };
 
     const fetchFlows = () => {

From 734da97474067470a361ff99bee17afb58bb227f Mon Sep 17 00:00:00 2001
From: seankwarren 
Date: Mon, 10 Apr 2023 21:59:30 -0400
Subject: [PATCH 56/80] feat(style): styling added to new UI elements

---
 .../flowchart-calculator/client/main.html     |   2 +-
 .../mainPage/FlowchartCalculator.jsx          |   2 +-
 .../components/mainPage/FlowchartCanvas.jsx   |   1 +
 .../ui/components/mainPage/JSONViewer.jsx     |   5 +-
 .../ui/components/mainPage/NodeButtons.jsx    |   3 +-
 .../imports/ui/styles/index.css               |  81 ++++++++++++++++--
 .../flowchart-calculator/public/favicon.ico   | Bin 0 -> 318 bytes
 7 files changed, 82 insertions(+), 12 deletions(-)
 create mode 100644 seankwarren/flowchart-calculator/public/favicon.ico

diff --git a/seankwarren/flowchart-calculator/client/main.html b/seankwarren/flowchart-calculator/client/main.html
index 4a0d9887..c69847c7 100644
--- a/seankwarren/flowchart-calculator/client/main.html
+++ b/seankwarren/flowchart-calculator/client/main.html
@@ -1,7 +1,7 @@
 
     
     
-    Flowchart Calcualtor
+    Flowchart Calculator
 
 
     
diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index f6a4a582..4c660073 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -123,11 +123,11 @@ const FlowchartCalculator = () => { className='flowchart-container' style={{ height: '100vh', width: '100%' }} > - {/* */} - + { +const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlows }) => { // Darkmode style toggling const buttonsPanelStyle = { backgroundColor: isDarkMode @@ -16,6 +16,7 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode }) => { +
); }; diff --git a/seankwarren/flowchart-calculator/imports/ui/styles/index.css b/seankwarren/flowchart-calculator/imports/ui/styles/index.css index a79f20ce..8bfde1b3 100644 --- a/seankwarren/flowchart-calculator/imports/ui/styles/index.css +++ b/seankwarren/flowchart-calculator/imports/ui/styles/index.css @@ -16,6 +16,8 @@ --output-color: #b5f7c6; --gray: rgba(51, 51, 51, 0.5); --light-gray: #ccc; + --blue: #007bff; + --xsmall-padding: 5px; --small-padding: 10px; --med-padding: 15px; --large-padding: 35px; @@ -38,11 +40,21 @@ body { top: 0; z-index: 10; justify-content: left; - padding-left: var(--small-padding); + /* padding-left: var(--small-padding); */ align-items: center; background-color: var(--gray); display: flex; - height: fit-content; + /* height: fit-content; */ +} + +.clear { + margin-right: var(--small-padding); + margin-left: auto; + background: none; + border: 2px solid var(--light-gray); + color: var(--light-gray); + padding: var(--xsmall-padding) var(--small-padding); + font-weight: var(--ft-wt-bold); } .react-split { @@ -136,7 +148,7 @@ input { background-color: transparent; border: 1px solid #000; border-radius: var(--small-radius); - appearance: none; + appearance: none; text-align: center; } @@ -156,11 +168,66 @@ input { white-space: pre-wrap; text-align: left; font-weight: var(--ft-wt-bold); - font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; + font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', + sans-serif; +} + +.react-flow__edge.selected > path { + stroke: var(--blue) !important; + stroke-width: 2px; } .selected > .node { - border-width: 4px; - border-style: double; - transform: translate(-2px, -2px); + border-width: 2px; + border-color: var(--blue); + transform: translate(-1px, -1px); +} + +.save-control-panel { + display: flex; + flex-direction: row; + justify-content: flex-start; + align-items: center; + flex-wrap: wrap; +} + +.save-control-panel select { + margin-right: var(--med-padding); + padding: var(--xsmall-padding); + border-radius: var(--small-radius); + font-family: 'Courier New', Courier, monospace; + font-weight: var(--ft-wt-bold); + font-size: small; + background-color: transparent; + border: 1px solid #7a7a7a; + /* appearance: none; */ + color: #7a7a7a; +} + +.save-control-panel select option { + color: #000; +} + +.save-control-panel button { + margin-right: var(--med-padding); + padding: var(--xsmall-padding); + border-radius: var(--small-radius); + font-family: 'Courier New', Courier, monospace; + font-weight: var(--ft-wt-bold); + font-size: small; + background-color: var(--blue); + border: none; + color: #fff; +} + +.save-control-panel input { + margin-right: var(--med-padding); + padding: var(--xsmall-padding); + border-radius: var(--small-radius); + font-family: 'Courier New', Courier, monospace; + font-weight: var(--ft-wt-bold); + font-size: small; + /* background-color: var(--input-color); */ + border: 1px solid #000; + color: #000; } diff --git a/seankwarren/flowchart-calculator/public/favicon.ico b/seankwarren/flowchart-calculator/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e9e55bad58c95217209cde6cccda7e7b2c4c80e6 GIT binary patch literal 318 zcma)$F%H5o3`M^s4q&SiGi2(Dy0S#-O*jV<13ga19*7-@kp*PFn-s(Zj^6*#w-Xr< z9#y5T& Date: Mon, 10 Apr 2023 22:16:09 -0400 Subject: [PATCH 57/80] chore(docs): user stories updated --- seankwarren/Flowchart-Designer.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index 56052984..4647818d 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -40,13 +40,13 @@ Run the development server using `meteor`. - [x] As an end user, node types should be quickly and easily distinguished by shape and color. - [x] As an end user, I should see some nodes on screen when I launch the application that explain how to use the app. - [x] As an end user, I should be able to easily read the JSON representation with syntax highlighting. +- [x] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. +- [x] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. ### Potential Improvement User Stories: - [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ -- [ ] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. -- [ ] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. - [ ] ~~As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed.~~ - [ ] As an end user, the input nodes should be exapandable to include multiple values each with their own handle. - [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. -- [ ] As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place. +- [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ From db338ded414a0fc52922c6fb07179c2508dd03ed Mon Sep 17 00:00:00 2001 From: seankwarren Date: Mon, 10 Apr 2023 22:42:26 -0400 Subject: [PATCH 58/80] fix: op node values now displayed correctly on load --- seankwarren/Flowchart-Designer.md | 2 ++ .../imports/ui/components/customNodes/BinaryNode.jsx | 2 +- .../imports/ui/components/customNodes/ComparisonNode.jsx | 2 +- .../imports/ui/components/customNodes/UnaryNode.jsx | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index 4647818d..5351d405 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -50,3 +50,5 @@ Run the development server using `meteor`. - [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. - [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ +TODO: when op nodes are loaded back in the state is correct, but the displayed values are not. + diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx index da62c589..98371dfc 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx @@ -27,7 +27,7 @@ const BinaryNode = ({ id, data }) => { top: '70%', }} /> - {binaryOperations.map((op) => )} { top: '70%', }} /> - "} onChange={handleSelectChange}> {comparisonOperations.map((op) => )} { position='left' id={`${id}-left`} /> - {unaryOperations.map((op) => )} Date: Tue, 11 Apr 2023 13:13:13 -0400 Subject: [PATCH 59/80] refactor: function definitions now in one location --- .../ui/components/customNodes/BinaryNode.jsx | 2 +- .../components/customNodes/ComparisonNode.jsx | 2 +- .../ui/components/customNodes/UnaryNode.jsx | 2 +- .../imports/ui/utils/operationDef.js | 83 +++++++++++++++++++ .../imports/ui/utils/operationLabels.js | 68 --------------- .../imports/ui/utils/performOperation.js | 45 ++-------- 6 files changed, 91 insertions(+), 111 deletions(-) create mode 100644 seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js delete mode 100644 seankwarren/flowchart-calculator/imports/ui/utils/operationLabels.js diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx index 98371dfc..721f4a81 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Handle } from 'reactflow'; -import { binaryOperations } from '../../utils/operationLabels' +import { binaryOperations } from '../../utils/operationDef' const BinaryNode = ({ id, data }) => { const handleSelectChange = (e) => { diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx index 3b330caa..93193a2d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Handle } from 'reactflow'; -import { comparisonOperations } from '../../utils/operationLabels' +import { comparisonOperations } from '../../utils/operationDef' export const ComparisonNode = ({ id, data }) => { const handleSelectChange = (e) => { diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/UnaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/UnaryNode.jsx index 71ef44e9..04c78c13 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/UnaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/UnaryNode.jsx @@ -1,6 +1,6 @@ import React from 'react'; import { Handle } from 'reactflow'; -import { unaryOperations } from '../../utils/operationLabels' +import { unaryOperations } from '../../utils/operationDef' const UnaryNode = ({ id, data }) => { const handleSelectChange = (e) => { diff --git a/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js b/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js new file mode 100644 index 00000000..68a59539 --- /dev/null +++ b/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js @@ -0,0 +1,83 @@ +export const comparisonOperations = [ + { + value: 'greater', + content: '>', + expression: (val1, val2) => val1 > val2, + }, + { + value: 'less', + content: '<', + expression: (val1, val2) => val1 < val2, + }, + { + value: 'greaterEqual', + content: '>=', + expression: (val1, val2) => val1 >= val2 + }, + { + value: 'lessEqual', + content: '<=', + expression: (val1, val2) => val1 <= val2 + }, + { + value: 'equal', + content: '==', + expression: (val1, val2) => val1 === val2 + }, + { + value: 'notEqual', + content: '!=', + expression: (val1, val2) => val1 !== val2 + } +] + +export const binaryOperations = [ + { + value: 'add', + content: '+', + expression: (val1, val2) => val1 + val2 + }, + { + value: 'subtract', + content: '-', + expression: (val1, val2) => val1 - val2 + }, + { + value: 'multiply', + content: '*', + expression: (val1, val2) => val1 * val2 + }, + { + value: 'divide', + content: '/', + expression: (val1, val2) => val1 / val2 + }, + { + value: 'exponent', + content: '^', + expression: (val1, val2) => val1 ** val2 + }, +] + +export const unaryOperations = [ + { + value: 'sin', + content: 'sin', + expression: (val1, val2) => Math.sin(val1) + }, + { + value: 'cos', + content: 'cos', + expression: (val1, val2) => Math.cos(val1) + }, + { + value: 'tan', + content: 'tan', + expression: (val1, val2) => Math.tan(val1) + }, + { + value: 'exp', + content: 'e^x', + expression: (val1, val2) => Math.exp(val1) + } +] diff --git a/seankwarren/flowchart-calculator/imports/ui/utils/operationLabels.js b/seankwarren/flowchart-calculator/imports/ui/utils/operationLabels.js deleted file mode 100644 index 7e15f3be..00000000 --- a/seankwarren/flowchart-calculator/imports/ui/utils/operationLabels.js +++ /dev/null @@ -1,68 +0,0 @@ -export const comparisonOperations = [ - { - value: 'greater', - content: '>' - }, - { - value: 'less', - content: '<' - }, - { - value: 'greaterEqual', - content: '>=' - }, - { - value: 'lessEqual', - content: '<=' - }, - { - value: 'equal', - content: '==' - }, - { - value: 'notEqual', - content: '!=' - } -] - -export const binaryOperations = [ - { - value: 'add', - content: '+' - }, - { - value: 'subtract', - content: '-' - }, - { - value: 'multiply', - content: '*' - }, - { - value: 'divide', - content: '/' - }, - { - value: 'exponent', - content: '^' - }, -] - -export const unaryOperations = [ - { - value: 'sin', - content: 'sin' - }, - { - value: 'cos', - content: 'cos' - }, - { - value: 'tan', - content: 'tan' - }, - { - value: 'exp', - content: 'e^x' - } -] diff --git a/seankwarren/flowchart-calculator/imports/ui/utils/performOperation.js b/seankwarren/flowchart-calculator/imports/ui/utils/performOperation.js index 62a0a91f..43b84909 100644 --- a/seankwarren/flowchart-calculator/imports/ui/utils/performOperation.js +++ b/seankwarren/flowchart-calculator/imports/ui/utils/performOperation.js @@ -1,44 +1,9 @@ +import { comparisonOperations, binaryOperations, unaryOperations } from "./operationDef"; // Helper function to perform an operation const performOperation = (op, val1, val2) => { - if (!val2) { - switch (op) { - case 'sin': - return Math.sin(val1); - case 'cos': - return Math.cos(val1); - case 'tan': - return Math.tan(val1); - case 'exp': - return Math.exp(val1); - } - } - - switch (op) { - case 'add': - return val1 + val2; - case 'subtract': - return val1 - val2; - case 'multiply': - return val1 * val2; - case 'divide': - return val1 / val2; - case 'exponent': - return val1 ** val2; - case 'greater': - return val1 > val2; - case 'less': - return val1 < val2; - case 'greaterEqual': - return val1 >= val2; - case 'lessEqual': - return val1 <= val2; - case 'equal': - return val1 === val2; - case 'notEqual': - return val1 !== val2; - default: - return 0; - } -}; + const operations = comparisonOperations.concat(binaryOperations).concat(unaryOperations); + const operation = operations.filter((operation) => operation.value === op)[0]; + return operation.expression(val1, val2) +} export default performOperation; \ No newline at end of file From 563baffa8bac849b9401bc58d450f3d87287df65 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Tue, 11 Apr 2023 13:13:32 -0400 Subject: [PATCH 60/80] feat: clear button implemented --- seankwarren/Flowchart-Designer.md | 9 ++++--- .../mainPage/FlowchartCalculator.jsx | 24 ++++++++++++++----- .../components/mainPage/FlowchartCanvas.jsx | 4 +++- .../ui/components/mainPage/NodeButtons.jsx | 4 ++-- .../imports/ui/styles/index.css | 4 ++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/Flowchart-Designer.md index 5351d405..c2726e72 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/Flowchart-Designer.md @@ -9,6 +9,7 @@ Flowchart Calculator is a Meteor/React application that allows users to create f - Support for arithmetic operations (+, -, *, /, ^), functions (sin, cos, tan, exp), and logical comparisons (>, <, >=, <=, ==, !=) - View real-time syntax-highlighted JSON representation of nodes and edges - Interactive flowchart editor powered by React Flow +- Support for saving and loading flowcharts - Dark mode 🎉 ### Usage @@ -17,6 +18,7 @@ Flowchart Calculator is a Meteor/React application that allows users to create f - Connect nodes using the handles on each node. Ensure to connect the output handle of one node to the input handle of another. - Edit input nodes or operation/comparison nodes to see the updated output values in the output nodes. - View the JSON representation of nodes and edges in the right pane. +- Name and save flowcharts and reload them ### Setup @@ -46,9 +48,6 @@ Run the development server using `meteor`. ### Potential Improvement User Stories: - [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ - [ ] ~~As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed.~~ -- [ ] As an end user, the input nodes should be exapandable to include multiple values each with their own handle. +- [ ] ~~As an end user, the input nodes should be exapandable to include multiple values each with their own handle.~~ - [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. -- [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ - -TODO: when op nodes are loaded back in the state is correct, but the displayed values are not. - +- [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index 4c660073..ff4144dd 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -13,6 +13,7 @@ const FlowchartCalculator = () => { // state for nodes and edges const [nodes, setNodes] = useState([startingNode]); const [edges, setEdges] = useState([]); + const [reactFlowInstance, setReactFlowInstance] = useState(null); // state for fetching saved flows from db const [fetchedFlows, setFetchedFlows] = useState([]); @@ -52,13 +53,21 @@ const FlowchartCalculator = () => { const clearFlows = () => { Meteor.call('clearFlows', (error) => { - if (error) { - console.error("Error clearing flows:", error); - } else { - console.log("Flows collection cleared"); - } + if (error) { + console.error("Error clearing flows:", error); + } else { + console.log("Flows collection cleared"); + } }); - }; + }; + + + const clearFlowchart = () => { + console.log("clearing flowchart"); + setReactFlowInstance(null); + setNodes([]); + setEdges([]); + } const loadFlow = (flow) => { const newNodes = attachOnConnect(flow.nodes); @@ -128,6 +137,7 @@ const FlowchartCalculator = () => { handleDragStart={handleDragStart} isDarkMode={isDarkMode} clearFlows={clearFlows} + clearFlowchart={clearFlowchart} /> { setNodes={setNodes} setEdges={setEdges} addNode={addNode} + reactFlowInstance={reactFlowInstance} + setReactFlowInstance={setReactFlowInstance} draggedNodeType={draggedNodeType} setDraggedNodeType={setDraggedNodeType} isDarkMode={isDarkMode} diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx index 026cabd7..c05ce36d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx @@ -17,6 +17,8 @@ const FlowchartCanvas = ({ setNodes, setEdges, addNode, + reactFlowInstance, + setReactFlowInstance, draggedNodeType, setDraggedNodeType, isDarkMode, @@ -24,7 +26,7 @@ const FlowchartCanvas = ({ // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); - const [reactFlowInstance, setReactFlowInstance] = useState(null); + const updateOutputNodes = useUpdateOutputNodes(nodes, edges, setNodes); // Darkmode style toggling diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx index c21e7c8b..4c1fcbc0 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx @@ -1,7 +1,7 @@ import React from 'react'; import DraggableButton from '../reusable/DraggableButton'; -const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlows }) => { +const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlowchart }) => { // Darkmode style toggling const buttonsPanelStyle = { backgroundColor: isDarkMode @@ -16,7 +16,7 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlows }) => { - +
); }; diff --git a/seankwarren/flowchart-calculator/imports/ui/styles/index.css b/seankwarren/flowchart-calculator/imports/ui/styles/index.css index 8bfde1b3..c415e42a 100644 --- a/seankwarren/flowchart-calculator/imports/ui/styles/index.css +++ b/seankwarren/flowchart-calculator/imports/ui/styles/index.css @@ -51,8 +51,8 @@ body { margin-right: var(--small-padding); margin-left: auto; background: none; - border: 2px solid var(--light-gray); - color: var(--light-gray); + border: 2px solid #7a7a7a; + color: #7a7a7a; padding: var(--xsmall-padding) var(--small-padding); font-weight: var(--ft-wt-bold); } From a4eb2479b2f3283dc10ef80122fbadf1382b142f Mon Sep 17 00:00:00 2001 From: seankwarren Date: Tue, 11 Apr 2023 13:27:21 -0400 Subject: [PATCH 61/80] refactor: revert location of reactFlowInstance --- .../imports/ui/components/mainPage/FlowchartCalculator.jsx | 6 ------ .../imports/ui/components/mainPage/FlowchartCanvas.jsx | 4 ++-- .../imports/ui/components/mainPage/NodeButtons.jsx | 3 ++- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index ff4144dd..88caf5c0 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -13,7 +13,6 @@ const FlowchartCalculator = () => { // state for nodes and edges const [nodes, setNodes] = useState([startingNode]); const [edges, setEdges] = useState([]); - const [reactFlowInstance, setReactFlowInstance] = useState(null); // state for fetching saved flows from db const [fetchedFlows, setFetchedFlows] = useState([]); @@ -33,7 +32,6 @@ const FlowchartCalculator = () => { if (error) { console.log(error.reason); } else { - console.log('Data saved to MongoDB'); setFlowName(''); // Clear the flow name input field after a successful save fetchFlows(); // Fetch the flows again to update the dropdown } @@ -63,8 +61,6 @@ const FlowchartCalculator = () => { const clearFlowchart = () => { - console.log("clearing flowchart"); - setReactFlowInstance(null); setNodes([]); setEdges([]); } @@ -145,8 +141,6 @@ const FlowchartCalculator = () => { setNodes={setNodes} setEdges={setEdges} addNode={addNode} - reactFlowInstance={reactFlowInstance} - setReactFlowInstance={setReactFlowInstance} draggedNodeType={draggedNodeType} setDraggedNodeType={setDraggedNodeType} isDarkMode={isDarkMode} diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx index c05ce36d..58ebfef5 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx @@ -17,12 +17,12 @@ const FlowchartCanvas = ({ setNodes, setEdges, addNode, - reactFlowInstance, - setReactFlowInstance, draggedNodeType, setDraggedNodeType, isDarkMode, }) => { + const [reactFlowInstance, setReactFlowInstance] = useState(null); + // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx index 4c1fcbc0..d673aa44 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx @@ -1,7 +1,7 @@ import React from 'react'; import DraggableButton from '../reusable/DraggableButton'; -const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlowchart }) => { +const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlowchart, clearFlows }) => { // Darkmode style toggling const buttonsPanelStyle = { backgroundColor: isDarkMode @@ -17,6 +17,7 @@ const NodeButtons = ({ addNode, handleDragStart, isDarkMode, clearFlowchart }) = + {/* */}
); }; From 8563f0e17ed51e2ad91ccf1322caa9b112bf66b5 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Tue, 11 Apr 2023 13:29:54 -0400 Subject: [PATCH 62/80] chore(docs): doc renamed to README.md --- seankwarren/{Flowchart-Designer.md => README.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename seankwarren/{Flowchart-Designer.md => README.md} (98%) diff --git a/seankwarren/Flowchart-Designer.md b/seankwarren/README.md similarity index 98% rename from seankwarren/Flowchart-Designer.md rename to seankwarren/README.md index c2726e72..c33d8c09 100644 --- a/seankwarren/Flowchart-Designer.md +++ b/seankwarren/README.md @@ -44,10 +44,10 @@ Run the development server using `meteor`. - [x] As an end user, I should be able to easily read the JSON representation with syntax highlighting. - [x] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. - [x] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. +- [x] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. ### Potential Improvement User Stories: - [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ - [ ] ~~As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed.~~ - [ ] ~~As an end user, the input nodes should be exapandable to include multiple values each with their own handle.~~ -- [ ] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. - [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ \ No newline at end of file From 0d3a648c716bf3563645903584e8f5f0e9dbcb9b Mon Sep 17 00:00:00 2001 From: seankwarren Date: Thu, 13 Apr 2023 12:53:47 -0400 Subject: [PATCH 63/80] refactor: most functionality moved to custom hooks --- .../mainPage/FlowchartCalculator.jsx | 180 +++++------------- .../components/mainPage/FlowchartCanvas.jsx | 84 +------- .../ui/components/mainPage/JSONViewer.jsx | 12 +- .../ui/components/mainPage/NodeButtons.jsx | 2 +- .../ui/components/reusable/DarkModeSwitch.jsx | 24 +++ .../imports/ui/hooks/useDraggable.jsx | 36 ++++ .../imports/ui/hooks/useInputField.jsx | 13 ++ .../imports/ui/hooks/useLocalFlowData.jsx | 112 +++++++++++ .../imports/ui/hooks/useRemoteFlowData.jsx | 56 ++++++ .../imports/ui/hooks/useResizeable.jsx | 13 ++ .../imports/ui/hooks/useToggleable.jsx | 13 ++ 11 files changed, 329 insertions(+), 216 deletions(-) create mode 100644 seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useDraggable.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useInputField.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useResizeable.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useToggleable.jsx diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index 88caf5c0..01dbbdd0 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -1,122 +1,54 @@ import React, { useState, useEffect } from 'react'; -import Switch from 'react-switch'; import 'reactflow/dist/style.css'; import SplitPane from 'split-pane-react'; import 'split-pane-react/esm/themes/default.css'; -import createNode from '../../utils/createNode'; import startingNode from '../../utils/startingNode'; import FlowchartCanvas from './FlowchartCanvas'; import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; +import useLocalFlowData from '../../hooks/useLocalFlowData'; +import useResizeable from '../../hooks/useResizeable'; +import useRemoteFlowData from '../../hooks/useRemoteFlowData'; +import useDraggable from '../../hooks/useDraggable'; +import useToggleable from '../../hooks/useToggleable'; +import DarkModeSwitch from '../reusable/DarkModeSwitch'; const FlowchartCalculator = () => { // state for nodes and edges - const [nodes, setNodes] = useState([startingNode]); - const [edges, setEdges] = useState([]); - - // state for fetching saved flows from db - const [fetchedFlows, setFetchedFlows] = useState([]); - - // state for user input flow name - const [flowName, setFlowName] = useState(''); - - - const saveFlow = () => { - // Check if a flow with the same name already exists - const flowWithNameExists = fetchedFlows.some(flow => flow.name === flowName); - - if (flowWithNameExists) { - alert('A flow with this name already exists. Please choose a different name.'); - } else { - Meteor.call('saveFlow', {nodes, edges, name: flowName}, (error) => { - if (error) { - console.log(error.reason); - } else { - setFlowName(''); // Clear the flow name input field after a successful save - fetchFlows(); // Fetch the flows again to update the dropdown - } - }); - } - }; - - const fetchFlows = () => { - Meteor.call('fetchFlows', (error, result) => { - if (error) { - console.error("Error fetching flows:", error); - } else { - setFetchedFlows(result); - } - }); - }; - - const clearFlows = () => { - Meteor.call('clearFlows', (error) => { - if (error) { - console.error("Error clearing flows:", error); - } else { - console.log("Flows collection cleared"); - } - }); - }; - - - const clearFlowchart = () => { - setNodes([]); - setEdges([]); - } - - const loadFlow = (flow) => { - const newNodes = attachOnConnect(flow.nodes); - setNodes(newNodes); - setEdges(flow.edges); - }; - - - // Drag and drop state - const [draggedNodeType, setDraggedNodeType] = useState(null); + const { + reactFlowInstance, + updateReactFlowInstance, + clearFlowchart, + loadFlowchart, + nodes, + updateNodes, + onNodesChange, + addNode, + edges, + updateEdges, + onEdgesChange, + handleConnect, + updateOutputNodes, + } = useLocalFlowData({nodes: [startingNode]}); // Style states - const [sizes, setSizes] = useState(['60%', '50%']); - const [isDarkMode, setIsDarkMode] = useState(true); - - const toggleDarkMode = () => { - setIsDarkMode(!isDarkMode); - }; - - const handleSizeChange = (sizes) => { - setSizes(sizes); - }; - - const handleDragStart = (e, nodeType) => { - setDraggedNodeType(nodeType); - e.dataTransfer.setData('text/plain', nodeType); - }; - - const handleNodeChange = (id, value) => { - setNodes((ns) => { - const newNodes = ns.map((n) => - n.id === id - ? { ...n, data: { ...n.data, value } } - : n - ); - return newNodes; - }); - }; - - // Function to add a new node - const addNode = (type, position) => { - const newNode = createNode(type, position, undefined, handleNodeChange); - setNodes((nodes) => [...nodes, newNode]); - }; + const {sizes, handleSizeChange}= useResizeable(); + + // state for flows on db + const { + fetchedFlows, + saveFlow, + fetchFlows, + clearFlows, + flowName, + updateFlowName, + } = useRemoteFlowData(nodes, edges); + + // Drag and drop handling + const {handleDragStart, handleDragOver, handleDrop} = useDraggable(reactFlowInstance, addNode); - const attachOnConnect = (nodes) => { - return nodes.map((node) => ({ - ...node, - data: { ...node.data, onChange: (newValue) => { - handleNodeChange(node.id, newValue) - } }, - })); - }; + // Dark mode toggling + const {isDarkMode, toggleDarkMode} = useToggleable(true); useEffect(() => { fetchFlows(); @@ -129,50 +61,36 @@ const FlowchartCalculator = () => { style={{ height: '100vh', width: '100%' }} >
- +
); diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx index 58ebfef5..672d9a78 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx @@ -12,22 +12,22 @@ import getNodeColor from '../../utils/getNodeColor'; import nodeTypesConfig from '../customNodes/nodeTypes'; const FlowchartCanvas = ({ + setReactFlowInstance, nodes, edges, - setNodes, - setEdges, - addNode, - draggedNodeType, - setDraggedNodeType, + onNodesChange, + onEdgesChange, + handleConnect, + handleDragOver, + handleDrop, + updateOutputNodes, isDarkMode, }) => { - const [reactFlowInstance, setReactFlowInstance] = useState(null); - // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); - const updateOutputNodes = useUpdateOutputNodes(nodes, edges, setNodes); + // const updateOutputNodes = useUpdateOutputNodes(nodes, edges, setNodes); // Darkmode style toggling const reactFlowStyle = { @@ -36,53 +36,6 @@ const FlowchartCanvas = ({ : 'rgba(255, 255, 255, 1)', }; - // handle nodes and edges changes - const onNodesChange = useCallback( - (changes) => setNodes((els) => applyNodeChanges(changes, els)), - [] - ); - - const onEdgesChange = useCallback( - (changes) => setEdges((els) => applyEdgeChanges(changes, els)), - [] - ); - - // Function to handle connecting nodes - const handleConnect = (params) => { - const { source, sourceHandle, target, targetHandle } = params; - - // Check if an edge with the same source and target already exists - const existingEdge = edges.find( - (edge) => - edge.source === sourceHandle && edge.target === targetHandle - ); - if (existingEdge) return; - - // Check if there is already an edge connected to the target handle - const existingEdgeWithSameTargetHandle = edges.find( - (edge) => edge.targetHandle === targetHandle - ); - if (existingEdgeWithSameTargetHandle) return; - - // Create a new edge with an ID, source node ID, target node ID, and arrowhead type - const newEdge = { - id: `${source}-${target}`, - source: source, - sourceHandle: sourceHandle, - target: target, - targetHandle: targetHandle, - arrowHeadType: 'arrowclosed', - animated: true, - interactionWidth: 40, - }; - - const newEdges = [...edges, newEdge]; - setEdges(newEdges); - - // If the target node is an output node, calculate its value and update its state - updateOutputNodes(); - }; - // Define custom node types const nodeTypes = useMemo(() => { return nodeTypesConfig @@ -98,27 +51,6 @@ const FlowchartCanvas = ({ } }, [nodes, edges, prevNodes, prevEdges, updateOutputNodes]); - const handleDrop = (e) => { - e.preventDefault(); - e.stopPropagation(); - - if (!draggedNodeType) return; - - const reactFlowBounds = e.currentTarget.getBoundingClientRect(); - const position = reactFlowInstance.project({ - x: e.clientX - reactFlowBounds.left, - y: e.clientY - reactFlowBounds.top, - }); - - addNode(draggedNodeType, position); - setDraggedNodeType(null); - }; - - const handleDragOver = (e) => { - e.preventDefault(); - e.stopPropagation(); - }; - return ( { // Darkmode style toggling const jsonViewerStyle = { @@ -20,10 +20,6 @@ const JSONViewer = ({ color: isDarkMode ? 'rgba(255, 255, 255, 1)' : 'rgba(0, 0, 0, 1)', }; - const handleFlowNameChange = (e) => { - setFlowName(e.target.value); - }; - useEffect(() => { hljs.highlightAll(); }, [nodes, edges]); @@ -38,7 +34,7 @@ const JSONViewer = ({
- {binaryOperations.map((op) => )} + { const handleSelectChange = (e) => { - data.onChange(e.target.value,); + data.onChange(e.target.value); }; return ( @@ -27,8 +27,16 @@ export const ComparisonNode = ({ id, data }) => { top: '70%', }} /> - '} + onChange={handleSelectChange} + > + {comparisonOperations.map((op) => ( + + ))} { return (
- + { const handleSelectChange = (e) => { @@ -15,8 +15,16 @@ const UnaryNode = ({ id, data }) => { position='left' id={`${id}-left`} /> - + {unaryOperations.map((op) => ( + + ))} , @@ -13,4 +15,4 @@ const nodeTypesConfig = { outputNode: (props) => , }; -export default nodeTypesConfig; \ No newline at end of file +export default nodeTypesConfig; diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx index 01dbbdd0..2af1f62e 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCalculator.jsx @@ -1,17 +1,18 @@ -import React, { useState, useEffect } from 'react'; +import React, { useEffect } from 'react'; + import 'reactflow/dist/style.css'; -import SplitPane from 'split-pane-react'; import 'split-pane-react/esm/themes/default.css'; -import startingNode from '../../utils/startingNode'; + import FlowchartCanvas from './FlowchartCanvas'; import JSONViewer from './JSONViewer'; import NodeButtons from './NodeButtons'; import useLocalFlowData from '../../hooks/useLocalFlowData'; -import useResizeable from '../../hooks/useResizeable'; import useRemoteFlowData from '../../hooks/useRemoteFlowData'; import useDraggable from '../../hooks/useDraggable'; import useToggleable from '../../hooks/useToggleable'; import DarkModeSwitch from '../reusable/DarkModeSwitch'; +import ResizablePane from '../reusable/ResizablePane'; +import startingNode from '../../utils/startingNode'; const FlowchartCalculator = () => { // state for nodes and edges @@ -20,42 +21,40 @@ const FlowchartCalculator = () => { updateReactFlowInstance, clearFlowchart, loadFlowchart, - nodes, - updateNodes, + nodes, onNodesChange, addNode, - edges, - updateEdges, + edges, onEdgesChange, handleConnect, updateOutputNodes, - } = useLocalFlowData({nodes: [startingNode]}); - - // Style states - const {sizes, handleSizeChange}= useResizeable(); + } = useLocalFlowData({ nodes: [startingNode] }); // state for flows on db const { - fetchedFlows, - saveFlow, - fetchFlows, - clearFlows, + fetchedFlows, + saveFlow, + fetchFlows, + clearFlows, flowName, updateFlowName, } = useRemoteFlowData(nodes, edges); - + // Drag and drop handling - const {handleDragStart, handleDragOver, handleDrop} = useDraggable(reactFlowInstance, addNode); + const { handleDragStart, handleDragOver, handleDrop } = useDraggable( + reactFlowInstance, + addNode + ); // Dark mode toggling - const {isDarkMode, toggleDarkMode} = useToggleable(true); + const { isDarkMode, toggleDarkMode } = useToggleable(true); useEffect(() => { fetchFlows(); }, []); return ( - +
{ isDarkMode={isDarkMode} />
- { updateFlowName={updateFlowName} isDarkMode={isDarkMode} > - + -
+ ); }; diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx index 672d9a78..41500488 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx @@ -1,15 +1,9 @@ -import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import ReactFlow, { - Background, - Controls, - MiniMap, - applyEdgeChanges, - applyNodeChanges, -} from 'reactflow'; +import React, { useEffect, useMemo } from 'react'; +import ReactFlow, { Background, Controls, MiniMap } from 'reactflow'; + +import nodeTypesConfig from '../customNodes/nodeTypes'; import usePrevious from '../../hooks/usePrevious'; -import useUpdateOutputNodes from '../../hooks/useUpdateOutputNodes'; import getNodeColor from '../../utils/getNodeColor'; -import nodeTypesConfig from '../customNodes/nodeTypes'; const FlowchartCanvas = ({ setReactFlowInstance, @@ -26,8 +20,6 @@ const FlowchartCanvas = ({ // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); - - // const updateOutputNodes = useUpdateOutputNodes(nodes, edges, setNodes); // Darkmode style toggling const reactFlowStyle = { @@ -38,7 +30,7 @@ const FlowchartCanvas = ({ // Define custom node types const nodeTypes = useMemo(() => { - return nodeTypesConfig + return nodeTypesConfig; }, []); useEffect(() => { diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx index 4675f2b1..f2a48006 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx @@ -1,14 +1,14 @@ import React, { useEffect } from 'react'; import hljs from 'highlight.js'; -const JSONViewer = ({ - children, - nodes, - edges, - flows, - loadFlowchart, - isDarkMode, - onSave, +const JSONViewer = ({ + children, + nodes, + edges, + flows, + loadFlowchart, + isDarkMode, + onSave, flowName, updateFlowName, }) => { @@ -31,25 +31,27 @@ const JSONViewer = ({ style={{ ...jsonViewerStyle, height: '100vh' }} > {children} -
+
- + @@ -69,7 +71,8 @@ const JSONViewer = ({ ); })} ] -

+
+
edges: [ {edges.map((edge) => { return ( diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx index aabbd734..091d365c 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx @@ -1,7 +1,12 @@ import React from 'react'; import DraggableButton from '../reusable/DraggableButton'; -const NodeButtons = ({ handleDragStart, isDarkMode, clearFlowchart, clearFlows }) => { +const NodeButtons = ({ + handleDragStart, + isDarkMode, + clearFlowchart, + clearFlows, +}) => { // Darkmode style toggling const buttonsPanelStyle = { backgroundColor: isDarkMode @@ -10,13 +15,41 @@ const NodeButtons = ({ handleDragStart, isDarkMode, clearFlowchart, clearFlows } }; return ( -
- - - - - - +
+ + + + + + {/* */}
); diff --git a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx index 91b72b92..1ad27094 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx @@ -1,24 +1,24 @@ -import React from 'react' +import React from 'react'; import Switch from 'react-switch'; -const DarkModeSwitch = ({isDarkMode, toggleDarkMode}) => { - return ( - - ) -} +const DarkModeSwitch = ({ isDarkMode, toggleDarkMode }) => { + return ( + + ); +}; -export default DarkModeSwitch \ No newline at end of file +export default DarkModeSwitch; diff --git a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DraggableButton.jsx b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DraggableButton.jsx index e9eb6d58..532fd6a9 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DraggableButton.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DraggableButton.jsx @@ -12,4 +12,4 @@ const DraggableButton = ({ label, nodeType, onDragStart, className }) => { ); }; -export default DraggableButton; \ No newline at end of file +export default DraggableButton; diff --git a/seankwarren/flowchart-calculator/imports/ui/components/reusable/ResizablePane.jsx b/seankwarren/flowchart-calculator/imports/ui/components/reusable/ResizablePane.jsx new file mode 100644 index 00000000..28ff806a --- /dev/null +++ b/seankwarren/flowchart-calculator/imports/ui/components/reusable/ResizablePane.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import SplitPane from 'split-pane-react'; +import useResizeable from '../../hooks/useResizeable'; + +const ResizablePane = ({ children }) => { + // Style states + const { sizes, handleSizeChange } = useResizeable(); + + return ( + + {children} + + ); +}; + +export default ResizablePane; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useDraggable.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useDraggable.jsx index afb80a48..6abbce70 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useDraggable.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useDraggable.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useState } from 'react'; const useDraggable = (reactFlowInstance, addNode) => { // Drag and drop state @@ -30,7 +30,7 @@ const useDraggable = (reactFlowInstance, addNode) => { setDraggedNodeType(null); }; - return {handleDragStart, handleDragOver, handleDrop} -} + return { handleDragStart, handleDragOver, handleDrop }; +}; -export default useDraggable \ No newline at end of file +export default useDraggable; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useInputField.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useInputField.jsx index 6303a219..eace673d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useInputField.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useInputField.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useState } from 'react'; const useInputField = () => { const [flowName, setFlowName] = useState(''); @@ -7,7 +7,7 @@ const useInputField = () => { setFlowName(e.target.value); }; - return {flowName, updateFlowName} -} + return { flowName, updateFlowName }; +}; -export default useInputField \ No newline at end of file +export default useInputField; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx index 442efffb..d3868ff5 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback } from 'react' +import React, { useState, useCallback } from 'react'; import { applyEdgeChanges, applyNodeChanges } from 'reactflow'; import createNode from '../utils/createNode'; import useUpdateOutputNodes from './useUpdateOutputNodes'; @@ -10,16 +10,8 @@ const useLocalFlowData = (initial = {}) => { const updateOutputNodes = useUpdateOutputNodes(nodes, edges, setNodes); - const updateNodes = (nodes) => { - setNodes(nodes); - }; - - const updateEdges = (edges) => { - setEdges(edges); - }; - - // handle nodes and edges changes - const onNodesChange = useCallback( + // handle nodes and edges changes + const onNodesChange = useCallback( (changes) => setNodes((els) => applyNodeChanges(changes, els)), [] ); @@ -29,33 +21,31 @@ const useLocalFlowData = (initial = {}) => { [] ); - // Function to add a new node - const addNode = (type, position) => { + // Function to add a new node + const addNode = (type, position) => { const newNode = createNode(type, position, undefined, handleNodeChange); - updateNodes((nodes) => [...nodes, newNode]); + setNodes((nodes) => [...nodes, newNode]); }; const updateReactFlowInstance = (instance) => { setReactFlowInstance(instance); - } + }; const clearFlowchart = () => { - updateNodes([]); - updateEdges([]); - } + setNodes([]); + setEdges([]); + }; const loadFlowchart = (flow) => { const newNodes = attachOnConnect(flow.nodes); - updateNodes(newNodes); - updateEdges(flow.edges); + setNodes(newNodes); + setEdges(flow.edges); }; const handleNodeChange = (id, value) => { - updateNodes((ns) => { - const newNodes = ns.map((n) => - n.id === id - ? { ...n, data: { ...n.data, value } } - : n + setNodes((ns) => { + const newNodes = ns.map((n) => + n.id === id ? { ...n, data: { ...n.data, value } } : n ); return newNodes; }); @@ -64,9 +54,12 @@ const useLocalFlowData = (initial = {}) => { const attachOnConnect = (nodes) => { return nodes.map((node) => ({ ...node, - data: { ...node.data, onChange: (newValue) => { - handleNodeChange(node.id, newValue) - } }, + data: { + ...node.data, + onChange: (newValue) => { + handleNodeChange(node.id, newValue); + }, + }, })); }; @@ -105,8 +98,20 @@ const useLocalFlowData = (initial = {}) => { // If the target node is an output node, calculate its value and update its state updateOutputNodes(); }; - - return {reactFlowInstance, updateReactFlowInstance, clearFlowchart, loadFlowchart, nodes, updateNodes, onNodesChange, addNode, edges, updateEdges, onEdgesChange, handleConnect, updateOutputNodes}; -} -export default useLocalFlowData; \ No newline at end of file + return { + reactFlowInstance, + updateReactFlowInstance, + clearFlowchart, + loadFlowchart, + nodes, + onNodesChange, + addNode, + edges, + onEdgesChange, + handleConnect, + updateOutputNodes, + }; +}; + +export default useLocalFlowData; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx index 164198f1..7cd1d537 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx @@ -1,38 +1,46 @@ -import React, { useCallback, useState } from 'react' +import React, { useCallback, useState } from 'react'; import useInputField from './useInputField'; -const useRemoteFlowData = ({nodes, edges}) => { +const useRemoteFlowData = ({ nodes, edges }) => { // state for fetching saved flows from db const [fetchedFlows, setFetchedFlows] = useState([]); - const {flowName, updateFlowName} = useInputField(); + const { flowName, updateFlowName } = useInputField(); function updateFetchedFlows(flows) { - setFetchedFlows(flows) + setFetchedFlows(flows); } const saveFlow = useCallback(() => { // Check if a flow with the same name already exists - const flowWithNameExists = fetchedFlows.some(flow => flow.name === flowName); - + const flowWithNameExists = fetchedFlows.some( + (flow) => flow.name === flowName + ); + if (flowWithNameExists) { - alert('A flow with this name already exists. Please choose a different name.'); + alert( + 'A flow with this name already exists. Please choose a different name.' + ); } else { - console.log(nodes, edges) - Meteor.call('saveFlow', {nodes, edges, name: flowName}, (error) => { - if (error) { - console.log(error.reason); - } else { - // updateFlowName(''); // Clear the flow name input field after a successful save - fetchFlows(); // Fetch the flows again to update the dropdown + console.log(nodes, edges); + Meteor.call( + 'saveFlow', + { nodes, edges, name: flowName }, + (error) => { + if (error) { + console.log(error.reason); + } else { + // updateFlowName(''); // Clear the flow name input field after a successful save + fetchFlows(); // Fetch the flows again to update the dropdown + } } - }); + ); } }, [nodes, edges]); const fetchFlows = () => { Meteor.call('fetchFlows', (error, result) => { if (error) { - console.error("Error fetching flows:", error); + console.error('Error fetching flows:', error); } else { updateFetchedFlows(result); } @@ -42,15 +50,21 @@ const useRemoteFlowData = ({nodes, edges}) => { const clearFlows = () => { Meteor.call('clearFlows', (error) => { if (error) { - console.error("Error clearing flows:", error); + console.error('Error clearing flows:', error); } else { - console.log("Flows collection cleared"); + console.log('Flows collection cleared'); } }); }; - - return {fetchedFlows, saveFlow, fetchFlows, clearFlows, flowName, updateFlowName} -} + return { + fetchedFlows, + saveFlow, + fetchFlows, + clearFlows, + flowName, + updateFlowName, + }; +}; -export default useRemoteFlowData \ No newline at end of file +export default useRemoteFlowData; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useResizeable.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useResizeable.jsx index be4923da..1242d313 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useResizeable.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useResizeable.jsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useState } from 'react'; const useResizeable = () => { const [sizes, setSizes] = useState(['60%', '50%']); @@ -7,7 +7,7 @@ const useResizeable = () => { setSizes(sizes); }; - return {sizes, handleSizeChange} -} + return { sizes, handleSizeChange }; +}; -export default useResizeable \ No newline at end of file +export default useResizeable; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useToggleable.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useToggleable.jsx index e62f00d9..22e3e1f6 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useToggleable.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useToggleable.jsx @@ -1,13 +1,13 @@ -import React, { useState } from 'react' +import React, { useState } from 'react'; const useToggleable = (val) => { - const [isDarkMode, setIsDarkMode] = useState(!(!val)) + const [isDarkMode, setIsDarkMode] = useState(!!val); function toggleDarkMode() { setIsDarkMode(!isDarkMode); - }; + } - return {isDarkMode, toggleDarkMode} -} + return { isDarkMode, toggleDarkMode }; +}; -export default useToggleable \ No newline at end of file +export default useToggleable; diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useUpdateOutputNodes.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useUpdateOutputNodes.jsx index 89952b98..8977c999 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useUpdateOutputNodes.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useUpdateOutputNodes.jsx @@ -27,4 +27,4 @@ const useUpdateOutputNodes = (nodes, edges, setNodes) => { return updateOutputNodes; }; -export default useUpdateOutputNodes; \ No newline at end of file +export default useUpdateOutputNodes; diff --git a/seankwarren/flowchart-calculator/imports/ui/styles/index.css b/seankwarren/flowchart-calculator/imports/ui/styles/index.css index c415e42a..802ec8aa 100644 --- a/seankwarren/flowchart-calculator/imports/ui/styles/index.css +++ b/seankwarren/flowchart-calculator/imports/ui/styles/index.css @@ -192,7 +192,7 @@ input { } .save-control-panel select { - margin-right: var(--med-padding); + margin-right: var(--med-padding); padding: var(--xsmall-padding); border-radius: var(--small-radius); font-family: 'Courier New', Courier, monospace; diff --git a/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js b/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js index 68a59539..8728185d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js +++ b/seankwarren/flowchart-calculator/imports/ui/utils/operationDef.js @@ -57,6 +57,11 @@ export const binaryOperations = [ content: '^', expression: (val1, val2) => val1 ** val2 }, + { + value: 'custom', + content: '(a+b)^2', + expression: (val1, val2) => (val1 + val2) ** 2 + }, ] export const unaryOperations = [ @@ -79,5 +84,15 @@ export const unaryOperations = [ value: 'exp', content: 'e^x', expression: (val1, val2) => Math.exp(val1) - } + }, + { + value: 'custom', + content: '2*e^x', + expression: (val1, val2) => 2 * Math.exp(val1) + }, + { + value: 'tanh', + content: 'tanh', + expression: (val1, val2) => (Math.exp(2 * val1) - 1) / (Math.exp(2 * val1) + 1) + }, ] From 437ce41ad67be252a8535f96702a07ef98cc8c4b Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 17:03:40 -0400 Subject: [PATCH 65/80] fix: duplicate keys for edges prevented --- .../flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx index d3868ff5..f754f2cd 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx @@ -82,7 +82,7 @@ const useLocalFlowData = (initial = {}) => { // Create a new edge with an ID, source node ID, target node ID, and arrowhead type const newEdge = { - id: `${source}-${target}`, + id: `${sourceHandle}-${targetHandle}`, source: source, sourceHandle: sourceHandle, target: target, From b4af9487c49fbec1962b0c79ea1d97ff984cc8ab Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 17:12:26 -0400 Subject: [PATCH 66/80] fix: nodes/edges state passed to hook properly --- .../imports/ui/hooks/useRemoteFlowData.jsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx index 7cd1d537..a085b243 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx @@ -1,12 +1,13 @@ import React, { useCallback, useState } from 'react'; import useInputField from './useInputField'; -const useRemoteFlowData = ({ nodes, edges }) => { +const useRemoteFlowData = ( nodes, edges ) => { // state for fetching saved flows from db const [fetchedFlows, setFetchedFlows] = useState([]); const { flowName, updateFlowName } = useInputField(); function updateFetchedFlows(flows) { + // console.log("updating flow list"); setFetchedFlows(flows); } @@ -15,13 +16,12 @@ const useRemoteFlowData = ({ nodes, edges }) => { const flowWithNameExists = fetchedFlows.some( (flow) => flow.name === flowName ); - if (flowWithNameExists) { + // TODO: permit overwriting saved flow alert( 'A flow with this name already exists. Please choose a different name.' ); } else { - console.log(nodes, edges); Meteor.call( 'saveFlow', { nodes, edges, name: flowName }, @@ -29,13 +29,13 @@ const useRemoteFlowData = ({ nodes, edges }) => { if (error) { console.log(error.reason); } else { - // updateFlowName(''); // Clear the flow name input field after a successful save + updateFlowName({ target: { value: '' } }); // Clear the flow name input field after a successful save fetchFlows(); // Fetch the flows again to update the dropdown } } ); } - }, [nodes, edges]); + }, [nodes, edges, flowName, fetchedFlows]); const fetchFlows = () => { Meteor.call('fetchFlows', (error, result) => { From 2484dc4778dcb1d1afb3ea83ce737131a8e40be6 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 18:11:12 -0400 Subject: [PATCH 67/80] feat: allow overwriting flow of same name --- seankwarren/flowchart-calculator/server/main.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/seankwarren/flowchart-calculator/server/main.js b/seankwarren/flowchart-calculator/server/main.js index 6df0e37d..9d57a284 100644 --- a/seankwarren/flowchart-calculator/server/main.js +++ b/seankwarren/flowchart-calculator/server/main.js @@ -12,7 +12,21 @@ Meteor.startup(async () => { Meteor.methods({ saveFlow(data) { - FlowsCollection.insert(data); + // Check if a flow with the same name already exists + const existingFlow = FlowsCollection.findOne({ name: data.name }); + + if (existingFlow) { + // Update the existing flow with the new data (nodes and edges) + FlowsCollection.update(existingFlow._id, { + $set: { + nodes: data.nodes, + edges: data.edges, + }, + }); + } else { + // If the flow with the same name doesn't exist, insert the new flow + FlowsCollection.insert(data); + } }, fetchFlows() { From 8da316ac03bb3b5372a6750365e73e57ab8a7355 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 18:12:07 -0400 Subject: [PATCH 68/80] feat: jest testing framework added --- seankwarren/flowchart-calculator/.babelrc | 7 + .../__mocks__/meteor/meteor.js | 10 + .../imports/setupTests.js | 0 .../components/mainPage/JSONViewer.test.jsx | 12 + .../components/mainPage/NodeButtons.test.jsx | 12 + .../flowchart-calculator/jest.config.js | 12 + .../flowchart-calculator/package-lock.json | 9147 ++++++++++++++--- 7 files changed, 8039 insertions(+), 1161 deletions(-) create mode 100644 seankwarren/flowchart-calculator/.babelrc create mode 100644 seankwarren/flowchart-calculator/__mocks__/meteor/meteor.js create mode 100644 seankwarren/flowchart-calculator/imports/setupTests.js create mode 100644 seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.test.jsx create mode 100644 seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.test.jsx create mode 100644 seankwarren/flowchart-calculator/jest.config.js diff --git a/seankwarren/flowchart-calculator/.babelrc b/seankwarren/flowchart-calculator/.babelrc new file mode 100644 index 00000000..5a7be46b --- /dev/null +++ b/seankwarren/flowchart-calculator/.babelrc @@ -0,0 +1,7 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-react" + ] +} + \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/__mocks__/meteor/meteor.js b/seankwarren/flowchart-calculator/__mocks__/meteor/meteor.js new file mode 100644 index 00000000..13946704 --- /dev/null +++ b/seankwarren/flowchart-calculator/__mocks__/meteor/meteor.js @@ -0,0 +1,10 @@ +const Meteor = { + isClient: true, + isServer: false, + methods: () => {}, + call: jest.fn(), + startup: jest.fn(), + subscribe: jest.fn(), +}; + +export default Meteor \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/setupTests.js b/seankwarren/flowchart-calculator/imports/setupTests.js new file mode 100644 index 00000000..e69de29b diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.test.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.test.jsx new file mode 100644 index 00000000..13c54d6a --- /dev/null +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.test.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import JSONViewer from './JSONViewer'; + +describe('JSONViewer', () => { + test('renders without crashing', () => { + render(); + + // Add more specific assertions based on your component's functionality + // For example, you can check if certain elements are rendered, or if certain texts are displayed + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.test.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.test.jsx new file mode 100644 index 00000000..78a4d633 --- /dev/null +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.test.jsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import NodeButtons from './NodeButtons'; + +describe('NodeButtons', () => { + test('renders without crashing', () => { + render( {}} isDarkMode={true} clearFlowchart={() => {}} clearFlows={() => {}} />); + + // Add more specific assertions based on your component's functionality + // For example, you can check if certain elements are rendered, or if certain texts are displayed + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/jest.config.js b/seankwarren/flowchart-calculator/jest.config.js new file mode 100644 index 00000000..c61d6028 --- /dev/null +++ b/seankwarren/flowchart-calculator/jest.config.js @@ -0,0 +1,12 @@ +module.exports = { + testEnvironment: 'jsdom', + setupFilesAfterEnv: ['/imports/setupTests.js'], + testPathIgnorePatterns: ["/node_modules/", "/tests/"], + moduleNameMapper: { + '^meteor/(.*)': '/__mocks__/meteor/$1.js', + // "\\.(css|less|scss|sass)$": '/__mocks__/styleMock.js', + }, + transform: { + "^.+\\.jsx?$": "babel-jest", + } +}; \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/package-lock.json b/seankwarren/flowchart-calculator/package-lock.json index b4ec2ed5..6e774374 100644 --- a/seankwarren/flowchart-calculator/package-lock.json +++ b/seankwarren/flowchart-calculator/package-lock.json @@ -8,6 +8,7 @@ "dependencies": { "@babel/runtime": "^7.20.7", "highlight.js": "^11.7.0", + "jest-environment-jsdom": "^29.5.0", "meteor-node-stubs": "^1.2.5", "nanoid": "^4.0.2", "react": "^18.2.0", @@ -15,471 +16,6007 @@ "react-switch": "^7.0.0", "reactflow": "^11.7.0", "split-pane-react": "^0.1.3" + }, + "devDependencies": { + "@babel/core": "^7.21.4", + "@babel/preset-env": "^7.21.4", + "@babel/preset-react": "^7.18.6", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "babel-jest": "^29.5.0", + "jest": "^29.5.0" } }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "dependencies": { + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@reactflow/background": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", - "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", + "node_modules/@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "dev": true, "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@reactflow/controls": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", - "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/@babel/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "dev": true, "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3" + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@reactflow/core": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", - "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, "dependencies": { - "@types/d3": "^7.4.0", - "@types/d3-drag": "^3.0.1", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" + "@babel/types": "^7.18.6" }, - "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@reactflow/minimap": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", - "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, "dependencies": { - "@reactflow/core": "11.7.0", - "@types/d3-selection": "^3.0.3", - "@types/d3-zoom": "^3.0.1", - "classcat": "^5.0.3", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0", - "zustand": "^4.3.1" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "@babel/core": "^7.0.0" } }, - "node_modules/@reactflow/node-resizer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", - "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "dev": true, "dependencies": { - "@reactflow/core": "^11.6.0", - "classcat": "^5.0.4", - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0", - "zustand": "^4.3.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "@babel/core": "^7.0.0" } }, - "node_modules/@reactflow/node-toolbar": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", - "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", + "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", + "dev": true, "dependencies": { - "@reactflow/core": "11.7.0", - "classcat": "^5.0.3", - "zustand": "^4.3.1" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "@babel/core": "^7.0.0" } }, - "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" } }, - "node_modules/@types/d3-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", - "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-axis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, "dependencies": { - "@types/d3-selection": "*" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-brush": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, "dependencies": { - "@types/d3-selection": "*" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-chord": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "dev": true, "dependencies": { - "@types/d3-selection": "*" + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.4" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-fetch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, "dependencies": { - "@types/d3-dsv": "*" + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-force": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-format": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } }, - "node_modules/@types/d3-geo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, "dependencies": { - "@types/geojson": "*" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, "dependencies": { - "@types/d3-color": "*" + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-polygon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, "dependencies": { - "@types/d3-time": "*" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, "dependencies": { - "@types/d3-path": "*" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@types/d3-transition": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "@types/d3-selection": "*" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@types/d3-zoom": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", - "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" + "color-name": "1.1.3" } }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/classcat": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", - "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" } }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, "dependencies": { - "d3-color": "1 - 3" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" }, "peerDependencies": { - "d3-selection": "2 - 3" + "@babel/core": "^7.0.0-0" } }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/highlight.js": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", - "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, "engines": { - "node": ">=12.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/meteor-node-stubs": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.5.tgz", - "integrity": "sha512-FLlOFZx3KnZ5s3yPCK+x58DyX9ewN+oQ12LcpwBXMLtzJ/YyprMQVivd6KIrahZbKJrNenPNUGuDS37WUFg+Mw==", - "bundleDependencies": [ + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", + "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.0.tgz", + "integrity": "sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", + "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", + "@babel/plugin-proposal-async-generator-functions": "^7.20.7", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.21.0", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.20.7", + "@babel/plugin-transform-async-to-generator": "^7.20.7", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-classes": "^7.21.0", + "@babel/plugin-transform-computed-properties": "^7.20.7", + "@babel/plugin-transform-destructuring": "^7.21.3", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.21.0", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.20.11", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.20.5", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.20.7", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.21.4", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "dependencies": { + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "dev": true, + "dependencies": { + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "dependencies": { + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "dependencies": { + "@sinclair/typebox": "^0.25.16" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@reactflow/background": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.2.0.tgz", + "integrity": "sha512-Fd8Few2JsLuE/2GaIM6fkxEBaAJvfzi2Lc106HKi/ddX+dZs8NUsSwMsJy1Ajs8b4GbiX8v8axfKpbK6qFMV8w==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/controls": { + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.1.11.tgz", + "integrity": "sha512-g6WrsszhNkQjzkJ9HbVUBkGGoUy2z8dQVgH6CYQEjuoonD15cWAPGvjyg8vx8oGG7CuktUhWu5JPivL6qjECow==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/core": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.7.0.tgz", + "integrity": "sha512-UJcpbNRSupSSoMWh5UmRp6UUr0ug7xVKmMvadnkKKiNi9584q57nz4HMfkqwN3/ESbre7LD043yh2n678d/5FQ==", + "dependencies": { + "@types/d3": "^7.4.0", + "@types/d3-drag": "^3.0.1", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/minimap": { + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.5.0.tgz", + "integrity": "sha512-n/3tlaknLpi3zaqCC+tDDPvUTOjd6jglto9V3RB1F2wlaUEbCwmuoR2GYTkiRyZMvuskKyAoQW8+0DX0+cWwsA==", + "dependencies": { + "@reactflow/core": "11.7.0", + "@types/d3-selection": "^3.0.3", + "@types/d3-zoom": "^3.0.1", + "classcat": "^5.0.3", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-resizer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.1.0.tgz", + "integrity": "sha512-DVL8nnWsltP8/iANadAcTaDB4wsEkx2mOLlBEPNE3yc5loSm3u9l5m4enXRcBym61MiMuTtDPzZMyYYQUjuYIg==", + "dependencies": { + "@reactflow/core": "^11.6.0", + "classcat": "^5.0.4", + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@reactflow/node-toolbar": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.1.11.tgz", + "integrity": "sha512-+hKtx+cvXwfCa9paGxE+G34rWRIIVEh68ZOqAtivClVmfqGzH/sEoGWtIOUyg9OEDNE1nEmZ1NrnpBGSmHHXFg==", + "dependencies": { + "@reactflow/core": "11.7.0", + "classcat": "^5.0.3", + "zustand": "^4.3.1" + }, + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" + }, + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@testing-library/dom": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.2.0.tgz", + "integrity": "sha512-xTEnpUKiV/bMyEsE5bT4oYA0x0Z/colMtxzUY8bKyPXBNLn/e0V4ZjBZkEhms0xE4pv9QsPfSRu9AWS4y5wGvA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "^5.0.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/react": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.0.0.tgz", + "integrity": "sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==" + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", + "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/jest/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/node": { + "version": "18.15.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", + "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.0.35", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.35.tgz", + "integrity": "sha512-6Laome31HpetaIUGFWl1VQ3mdSImwxtFZ39rh059a1MNnKGqBpC88J6NJ8n/Is3Qx7CefDGLgf/KhN/sYCf7ag==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", + "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", + "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", + "dev": true, + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001478", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", + "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/classcat": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", + "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.30.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.1.tgz", + "integrity": "sha512-d690npR7MC6P0gq4npTl5n2VQeNAmUrJ90n+MHiKS7W2+xno4o3F5GDEuylSdi6EJ3VssibSGXOa1r3YXD3Mhw==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "node_modules/deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.364", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.364.tgz", + "integrity": "sha512-v6GxKdF57qfweXSfnne9nw1vS/86G4+UtscEe+3HQF+zhhrjAY4+9A4gstIQO56gyZvVrt9MZwt9aevCz/tohQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/highlight.js": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", + "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-environment-jsdom": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", + "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/jsdom": "^20.0.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-snapshot/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/meteor-node-stubs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/meteor-node-stubs/-/meteor-node-stubs-1.2.5.tgz", + "integrity": "sha512-FLlOFZx3KnZ5s3yPCK+x58DyX9ewN+oQ12LcpwBXMLtzJ/YyprMQVivd6KIrahZbKJrNenPNUGuDS37WUFg+Mw==", + "bundleDependencies": [ "assert", "browserify-zlib", "buffer", @@ -505,63 +6042,777 @@ "vm-browserify" ], "dependencies": { - "assert": "^2.0.0", - "browserify-zlib": "^0.2.0", - "buffer": "^5.7.1", - "console-browserify": "^1.2.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.12.0", - "domain-browser": "^4.22.0", - "elliptic": "^6.5.4", - "events": "^3.3.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "^1.0.0", - "process": "^0.11.10", - "punycode": "^1.4.1", - "querystring-es3": "^0.2.1", + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "buffer": "^5.7.1", + "console-browserify": "^1.2.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.12.0", + "domain-browser": "^4.22.0", + "elliptic": "^6.5.4", + "events": "^3.3.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "punycode": "^1.4.1", + "querystring-es3": "^0.2.1", + "readable-stream": "^3.6.0", + "stream-browserify": "^3.0.0", + "stream-http": "^3.2.0", + "string_decoder": "^1.3.0", + "timers-browserify": "^2.0.12", + "tty-browserify": "0.0.1", + "url": "^0.11.0", + "util": "^0.12.4", + "vm-browserify": "^1.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js": { + "version": "5.4.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/assert": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/bn.js": { + "version": "5.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/brorand": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/browserify-aes": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-des": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-sign": { + "version": "4.2.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/meteor-node-stubs/node_modules/buffer-xor": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/call-bind": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/cipher-base": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/console-browserify": { + "version": "1.2.0", + "inBundle": true + }, + "node_modules/meteor-node-stubs/node_modules/constants-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/create-hash": { + "version": "1.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/create-hmac": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { + "version": "3.12.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/meteor-node-stubs/node_modules/define-properties": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/des.js": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { + "version": "5.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/domain-browser": { + "version": "4.22.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic": { + "version": "6.5.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/es-abstract": { + "version": "1.18.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { + "version": "1.2.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/events": { + "version": "3.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/foreach": { + "version": "2.0.5", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/function-bind": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-bigints": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/has-symbols": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash-base": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", "readable-stream": "^3.6.0", - "stream-browserify": "^3.0.0", - "stream-http": "^3.2.0", - "string_decoder": "^1.3.0", - "timers-browserify": "^2.0.12", - "tty-browserify": "0.0.1", - "url": "^0.11.0", - "util": "^0.12.4", - "vm-browserify": "^1.1.2" + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/meteor-node-stubs/node_modules/hash.js": { + "version": "1.1.7", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/https-browserify": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" + }, + "node_modules/meteor-node-stubs/node_modules/inherits": { + "version": "2.0.4", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/is-arguments": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-bigint": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-callable": { + "version": "1.2.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-date-object": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-generator-function": { + "version": "1.0.9", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-nan": { + "version": "1.3.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-number-object": { + "version": "1.0.5", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-regex": { + "version": "1.1.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-string": { + "version": "1.0.6", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/is-typed-array": { + "version": "1.1.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/asn1.js": { - "version": "5.4.1", + "node_modules/meteor-node-stubs/node_modules/md5.js": { + "version": "1.3.5", "inBundle": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", + "hash-base": "^3.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "safe-buffer": "^5.1.2" } }, - "node_modules/meteor-node-stubs/node_modules/asn1.js/node_modules/bn.js": { + "node_modules/meteor-node-stubs/node_modules/miller-rabin": { + "version": "4.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/assert": { - "version": "2.0.0", + "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/object-inspect": { + "version": "1.10.3", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/meteor-node-stubs/node_modules/object-is": { + "version": "1.1.5", "inBundle": true, "license": "MIT", "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/available-typed-arrays": { - "version": "1.0.4", + "node_modules/meteor-node-stubs/node_modules/object-keys": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/meteor-node-stubs/node_modules/object.assign": { + "version": "4.1.2", "inBundle": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, "engines": { "node": ">= 0.4" }, @@ -569,8 +6820,134 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/base64-js": { - "version": "1.5.1", + "node_modules/meteor-node-stubs/node_modules/os-browserify": { + "version": "0.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pako": { + "version": "1.0.11", + "inBundle": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/meteor-node-stubs/node_modules/parse-asn1": { + "version": "5.1.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/path-browserify": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/pbkdf2": { + "version": "3.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/meteor-node-stubs/node_modules/process": { + "version": "0.11.10", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt": { + "version": "4.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/punycode": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/querystring": { + "version": "0.2.0", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/querystring-es3": { + "version": "0.2.1", + "inBundle": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/meteor-node-stubs/node_modules/randombytes": { + "version": "2.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/randomfill": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/meteor-node-stubs/node_modules/readable-stream": { + "version": "3.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/meteor-node-stubs/node_modules/ripemd160": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/meteor-node-stubs/node_modules/safe-buffer": { + "version": "5.2.1", "funding": [ { "type": "github", @@ -588,458 +6965,776 @@ "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/bn.js": { - "version": "5.2.0", + "node_modules/meteor-node-stubs/node_modules/safer-buffer": { + "version": "2.1.2", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/brorand": { - "version": "1.1.0", + "node_modules/meteor-node-stubs/node_modules/setimmediate": { + "version": "1.0.5", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/browserify-aes": { - "version": "1.2.0", + "node_modules/meteor-node-stubs/node_modules/sha.js": { + "version": "2.4.11", "inBundle": true, - "license": "MIT", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "node_modules/meteor-node-stubs/node_modules/browserify-cipher": { - "version": "1.0.1", + "node_modules/meteor-node-stubs/node_modules/stream-browserify": { + "version": "3.0.0", "inBundle": true, "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "node_modules/meteor-node-stubs/node_modules/browserify-des": { - "version": "1.0.2", + "node_modules/meteor-node-stubs/node_modules/stream-http": { + "version": "3.2.0", "inBundle": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" } }, - "node_modules/meteor-node-stubs/node_modules/browserify-rsa": { - "version": "4.1.0", + "node_modules/meteor-node-stubs/node_modules/string_decoder": { + "version": "1.3.0", "inBundle": true, "license": "MIT", "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "safe-buffer": "~5.2.0" } }, - "node_modules/meteor-node-stubs/node_modules/browserify-sign": { - "version": "4.2.1", + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { + "version": "1.0.4", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/browserify-zlib": { - "version": "0.2.0", + "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { + "version": "1.0.4", "inBundle": true, "license": "MIT", "dependencies": { - "pako": "~1.0.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/meteor-node-stubs/node_modules/timers-browserify": { + "version": "2.0.12", "inBundle": true, "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" } }, - "node_modules/meteor-node-stubs/node_modules/buffer-xor": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/builtin-status-codes": { - "version": "3.0.0", + "node_modules/meteor-node-stubs/node_modules/tty-browserify": { + "version": "0.0.1", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/call-bind": { - "version": "1.0.2", + "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { + "version": "1.0.1", "inBundle": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/cipher-base": { - "version": "1.0.4", + "node_modules/meteor-node-stubs/node_modules/url": { + "version": "0.11.0", "inBundle": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "node_modules/meteor-node-stubs/node_modules/console-browserify": { - "version": "1.2.0", - "inBundle": true - }, - "node_modules/meteor-node-stubs/node_modules/constants-browserify": { - "version": "1.0.0", + "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { + "version": "1.3.2", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh": { - "version": "4.0.4", + "node_modules/meteor-node-stubs/node_modules/util": { + "version": "0.12.4", "inBundle": true, "license": "MIT", "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" } }, - "node_modules/meteor-node-stubs/node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", + "node_modules/meteor-node-stubs/node_modules/util-deprecate": { + "version": "1.0.2", "inBundle": true, "license": "MIT" }, - "node_modules/meteor-node-stubs/node_modules/create-hash": { - "version": "1.2.0", + "node_modules/meteor-node-stubs/node_modules/vm-browserify": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "version": "1.0.2", "inBundle": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/create-hmac": { - "version": "1.1.7", + "node_modules/meteor-node-stubs/node_modules/which-typed-array": { + "version": "1.1.4", "inBundle": true, "license": "MIT", "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/crypto-browserify": { - "version": "3.12.0", + "node_modules/meteor-node-stubs/node_modules/xtend": { + "version": "4.0.2", "inBundle": true, "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nwsapi": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", + "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" } }, - "node_modules/meteor-node-stubs/node_modules/define-properties": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, "dependencies": { - "object-keys": "^1.0.12" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/des.js": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "wrappy": "1" } }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman": { - "version": "5.0.3", - "inBundle": true, - "license": "MIT", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meteor-node-stubs/node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/meteor-node-stubs/node_modules/domain-browser": { - "version": "4.22.0", - "inBundle": true, - "license": "MIT", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://bevry.me/fund" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meteor-node-stubs/node_modules/elliptic": { - "version": "6.5.4", - "inBundle": true, - "license": "MIT", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/es-abstract": { - "version": "1.18.3", - "inBundle": true, - "license": "MIT", + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" + "p-try": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meteor-node-stubs/node_modules/es-to-primitive": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meteor-node-stubs/node_modules/es6-object-assign": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, - "node_modules/meteor-node-stubs/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/evp_bytestokey": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/meteor-node-stubs/node_modules/foreach": { - "version": "2.0.5", - "inBundle": true, - "license": "MIT" + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/meteor-node-stubs/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true }, - "node_modules/meteor-node-stubs/node_modules/get-intrinsic": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/meteor-node-stubs/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "find-up": "^4.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/has-bigints": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/meteor-node-stubs/node_modules/has-symbols": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, "engines": { - "node": ">= 0.4" + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-switch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", + "integrity": "sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/reactflow": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.7.0.tgz", + "integrity": "sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg==", + "dependencies": { + "@reactflow/background": "11.2.0", + "@reactflow/controls": "11.1.11", + "@reactflow/core": "11.7.0", + "@reactflow/minimap": "11.5.0", + "@reactflow/node-resizer": "2.1.0", + "@reactflow/node-toolbar": "1.1.11" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "react": ">=17", + "react-dom": ">=17" } }, - "node_modules/meteor-node-stubs/node_modules/hash-base": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/hash.js": { - "version": "1.1.7", - "inBundle": true, - "license": "MIT", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/hmac-drbg": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@babel/runtime": "^7.8.4" } }, - "node_modules/meteor-node-stubs/node_modules/https-browserify": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/meteor-node-stubs/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/is-arguments": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -1048,531 +7743,645 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/is-bigint": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/meteor-node-stubs/node_modules/is-boolean-object": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/is-callable": { - "version": "1.2.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/meteor-node-stubs/node_modules/is-date-object": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/meteor-node-stubs/node_modules/is-generator-function": { - "version": "1.0.9", - "inBundle": true, - "license": "MIT", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.12.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/is-nan": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/is-negative-zero": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/is-number-object": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT", + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/meteor-node-stubs/node_modules/is-regex": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">= 0.4" + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/is-string": { - "version": "1.0.6", - "inBundle": true, - "license": "MIT", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/is-symbol": { + "node_modules/side-channel": { "version": "1.0.4", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/is-typed-array": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.0-next.2", - "foreach": "^2.0.5", - "has-symbols": "^1.0.1" - }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/md5.js": { - "version": "1.3.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin": { - "version": "4.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/meteor-node-stubs/node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-assert": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/meteor-node-stubs/node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/object-inspect": { - "version": "1.10.3", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/split-pane-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/split-pane-react/-/split-pane-react-0.1.3.tgz", + "integrity": "sha512-+50VW9+1yglO+2AgL7MhvJ3UazYTqJ4LBJTs44od/D/CTvsqQ9xoDlaHdIpJ5SbXxUqBxvdJD5zoIVnoG+mNTg==", + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/meteor-node-stubs/node_modules/object-is": { - "version": "1.1.5", - "inBundle": true, - "license": "MIT", + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/meteor-node-stubs/node_modules/object-keys": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/meteor-node-stubs/node_modules/object.assign": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/meteor-node-stubs/node_modules/os-browserify": { - "version": "0.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/meteor-node-stubs/node_modules/pako": { - "version": "1.0.11", - "inBundle": true, - "license": "(MIT AND Zlib)" + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/meteor-node-stubs/node_modules/parse-asn1": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/path-browserify": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/meteor-node-stubs/node_modules/pbkdf2": { - "version": "3.1.2", - "inBundle": true, - "license": "MIT", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt": { - "version": "4.0.3", - "inBundle": true, - "license": "MIT", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "inBundle": true, - "license": "MIT" + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/meteor-node-stubs/node_modules/punycode": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT" + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, - "node_modules/meteor-node-stubs/node_modules/querystring": { - "version": "0.2.0", - "inBundle": true, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=0.4.x" + "node": ">=8" } }, - "node_modules/meteor-node-stubs/node_modules/querystring-es3": { - "version": "0.2.1", - "inBundle": true, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/randombytes": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { - "safe-buffer": "^5.1.0" + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "node_modules/meteor-node-stubs/node_modules/randomfill": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", + "node_modules/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/meteor-node-stubs/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "punycode": "^2.1.1" }, "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/meteor-node-stubs/node_modules/ripemd160": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/meteor-node-stubs/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } }, - "node_modules/meteor-node-stubs/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/meteor-node-stubs/node_modules/setimmediate": { - "version": "1.0.5", - "inBundle": true, - "license": "MIT" + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/meteor-node-stubs/node_modules/sha.js": { - "version": "2.4.11", - "inBundle": true, - "license": "(MIT AND BSD-3-Clause)", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/stream-browserify": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/stream-http": { - "version": "3.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" } }, - "node_modules/meteor-node-stubs/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimend": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/meteor-node-stubs/node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/meteor-node-stubs/node_modules/timers-browserify": { - "version": "2.0.12", - "inBundle": true, - "license": "MIT", + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, "dependencies": { - "setimmediate": "^1.0.4" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=10.12.0" } }, - "node_modules/meteor-node-stubs/node_modules/tty-browserify": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, - "node_modules/meteor-node-stubs/node_modules/unbox-primitive": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" + "xml-name-validator": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=14" } }, - "node_modules/meteor-node-stubs/node_modules/url": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "makeerror": "1.0.12" } }, - "node_modules/meteor-node-stubs/node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "inBundle": true, - "license": "MIT" + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } }, - "node_modules/meteor-node-stubs/node_modules/util": { - "version": "0.12.4", - "inBundle": true, - "license": "MIT", + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/meteor-node-stubs/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } }, - "node_modules/meteor-node-stubs/node_modules/vm-browserify": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT" + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/meteor-node-stubs/node_modules/which-boxed-primitive": { + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { "version": "1.0.2", - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -1584,154 +8393,170 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/which-typed-array": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT", + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.2", - "call-bind": "^1.0.0", - "es-abstract": "^1.18.0-next.1", - "foreach": "^2.0.5", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.1", - "is-typed-array": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/meteor-node-stubs/node_modules/xtend": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "dependencies": { - "loose-envify": "^1.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "node": ">=10" }, - "peerDependencies": { - "react": "^18.2.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, - "node_modules/react-switch": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/react-switch/-/react-switch-7.0.0.tgz", - "integrity": "sha512-KkDeW+cozZXI6knDPyUt3KBN1rmhoVYgAdCJqAh7st7tk8YE6N0iR89zjCWO8T8dUTeJGTR0KU+5CHCRMRffiA==", + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, "dependencies": { - "prop-types": "^15.7.2" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/reactflow": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.7.0.tgz", - "integrity": "sha512-bjfJV1iQZ+VwIlvsnd4TbXNs6kuJ5ONscud6fNkF8RY/oU2VUZpdjA3q1zwmgnjmJcIhxuBiBI5VLGajYx/Ozg==", - "dependencies": { - "@reactflow/background": "11.2.0", - "@reactflow/controls": "11.1.11", - "@reactflow/core": "11.7.0", - "@reactflow/minimap": "11.5.0", - "@reactflow/node-resizer": "2.1.0", - "@reactflow/node-toolbar": "1.1.11" + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" }, "peerDependencies": { - "react": ">=17", - "react-dom": ">=17" + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, "dependencies": { - "loose-envify": "^1.1.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/split-pane-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/split-pane-react/-/split-pane-react-0.1.3.tgz", - "integrity": "sha512-+50VW9+1yglO+2AgL7MhvJ3UazYTqJ4LBJTs44od/D/CTvsqQ9xoDlaHdIpJ5SbXxUqBxvdJD5zoIVnoG+mNTg==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", - "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zustand": { From 7bc781b448321249005fafd5f34f898fa7bb56a7 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 20:38:54 -0400 Subject: [PATCH 69/80] fix: auto-fit view on load --- .../imports/ui/hooks/useLocalFlowData.jsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx index f754f2cd..6ba7f234 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useLocalFlowData.jsx @@ -36,11 +36,12 @@ const useLocalFlowData = (initial = {}) => { setEdges([]); }; - const loadFlowchart = (flow) => { + const loadFlowchart = useCallback((flow) => { const newNodes = attachOnConnect(flow.nodes); setNodes(newNodes); setEdges(flow.edges); - }; + reactFlowInstance.fitView(); + },[reactFlowInstance]); const handleNodeChange = (id, value) => { setNodes((ns) => { From 78f1fd8de8c2d4c5fa744441909f71fe9d350068 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 20:42:31 -0400 Subject: [PATCH 70/80] feat: overwrite flow now supported in client --- .../imports/ui/hooks/useRemoteFlowData.jsx | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx index a085b243..334f2cd2 100644 --- a/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.jsx @@ -13,28 +13,30 @@ const useRemoteFlowData = ( nodes, edges ) => { const saveFlow = useCallback(() => { // Check if a flow with the same name already exists - const flowWithNameExists = fetchedFlows.some( - (flow) => flow.name === flowName - ); - if (flowWithNameExists) { - // TODO: permit overwriting saved flow - alert( - 'A flow with this name already exists. Please choose a different name.' - ); - } else { - Meteor.call( - 'saveFlow', - { nodes, edges, name: flowName }, - (error) => { - if (error) { - console.log(error.reason); - } else { - updateFlowName({ target: { value: '' } }); // Clear the flow name input field after a successful save - fetchFlows(); // Fetch the flows again to update the dropdown - } - } + const existingFlow = fetchedFlows.find((flow) => flow.name === flowName); + if (existingFlow) { + // Ask the user if they want to overwrite the existing flow + const overwrite = window.confirm( + 'A flow with this name already exists. Do you want to overwrite it?' ); + + if (!overwrite) { + return; // If the user chooses not to overwrite, return immediately + } } + + Meteor.call( + 'saveFlow', + { nodes, edges, name: flowName }, + (error) => { + if (error) { + console.log(error.reason); + } else { + updateFlowName({ target: { value: '' } }); // Clear the flow name input field after a successful save + fetchFlows(); // Fetch the flows again to update the dropdown + } + } + ); }, [nodes, edges, flowName, fetchedFlows]); const fetchFlows = () => { From f677e091679b2a48cd5ace32ef494d99e86156b8 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 20:53:14 -0400 Subject: [PATCH 71/80] fix: bundle optimization of highlight.js --- .../flowchart-calculator/.meteor/versions | 1 + .../ui/components/mainPage/JSONViewer.jsx | 8 ++- .../ui/hooks/useRemoteFlowData.test.jsx | 62 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 seankwarren/flowchart-calculator/imports/ui/hooks/useRemoteFlowData.test.jsx diff --git a/seankwarren/flowchart-calculator/.meteor/versions b/seankwarren/flowchart-calculator/.meteor/versions index 061cf6a9..ac22dbcd 100644 --- a/seankwarren/flowchart-calculator/.meteor/versions +++ b/seankwarren/flowchart-calculator/.meteor/versions @@ -6,6 +6,7 @@ base64@1.0.12 binary-heap@1.0.11 blaze-tools@1.1.3 boilerplate-generator@1.7.1 +bundle-visualizer@1.2.3 caching-compiler@1.2.2 caching-html-compiler@1.2.1 callback-hook@1.5.0 diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx index f2a48006..ad353a74 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx @@ -1,5 +1,6 @@ import React, { useEffect } from 'react'; -import hljs from 'highlight.js'; +import hljs from 'highlight.js/lib/core'; +import json from 'highlight.js/lib/languages/json'; const JSONViewer = ({ children, @@ -24,6 +25,11 @@ const JSONViewer = ({ hljs.highlightAll(); }, [nodes, edges]); + useEffect(() => { + hljs.registerLanguage('json', json); + }, []) + + // TODO: move save/load controls to seperate component return (
({ + Meteor: { + call: jest.fn((method, ...args) => { + const callback = args.pop(); + if (method === 'fetchFlows') { + callback(null, []); + } else if (method === 'saveFlow') { + callback(null); + } else if (method === 'clearFlows') { + callback(null); + } + }), + }, +})); + +// Mock the window.confirm method +global.window.confirm = jest.fn(() => true); + +describe('useRemoteFlowData', () => { + const nodes = []; + const edges = []; + + test('should update flowName', () => { + const { result } = renderHook(() => useRemoteFlowData(nodes, edges)); + act(() => { + result.current.updateFlowName({ target: { value: 'test' } }); + }); + expect(result.current.flowName).toBe('test'); + }); + + test('should fetch flows', async () => { + const { result } = renderHook(() => useRemoteFlowData(nodes, edges)); + await act(async () => { + result.current.fetchFlows(); + }); + expect(result.current.fetchedFlows).toEqual([]); + }); + + test('should save flow', async () => { + const { result } = renderHook(() => useRemoteFlowData(nodes, edges)); + act(() => { + result.current.updateFlowName({ target: { value: 'test' } }); + }); + await act(async () => { + result.current.saveFlow(); + }); + expect(result.current.flowName).toBe(''); + }); + + test('should clear flows', async () => { + const { result } = renderHook(() => useRemoteFlowData(nodes, edges)); + await act(async () => { + result.current.clearFlows(); + }); + // Since clearFlows doesn't change state, we'll just ensure it doesn't throw an error + expect(true).toBe(true); + }); +}); From dca0fd6fb619ca1305fe3dca26463cab8555b0c1 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Fri, 14 Apr 2023 20:58:05 -0400 Subject: [PATCH 72/80] fix: code language defined explicity --- seankwarren/flowchart-calculator/.meteor/versions | 1 - .../imports/ui/components/mainPage/JSONViewer.jsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/seankwarren/flowchart-calculator/.meteor/versions b/seankwarren/flowchart-calculator/.meteor/versions index ac22dbcd..061cf6a9 100644 --- a/seankwarren/flowchart-calculator/.meteor/versions +++ b/seankwarren/flowchart-calculator/.meteor/versions @@ -6,7 +6,6 @@ base64@1.0.12 binary-heap@1.0.11 blaze-tools@1.1.3 boilerplate-generator@1.7.1 -bundle-visualizer@1.2.3 caching-compiler@1.2.2 caching-html-compiler@1.2.1 callback-hook@1.5.0 diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx index ad353a74..499591e4 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx @@ -67,7 +67,7 @@ const JSONViewer = ({ nodes: [ {nodes.map((node) => { return ( - + {JSON.stringify( node, ['id', 'data', 'value', 'type'], From 8a137c80c5fa90d4f739826989f92b276c967f07 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 15 Apr 2023 12:20:49 -0400 Subject: [PATCH 73/80] feat: cypress e2e testing framework added --- .../flowchart-calculator/cypress.config.js | 10 + .../cypress/e2e/app/app_spec.cy.js | 20 + .../cypress/support/commands.js | 25 + .../cypress/support/e2e.js | 20 + .../flowchart-calculator/package-lock.json | 1393 ++++++++++++++++- 5 files changed, 1454 insertions(+), 14 deletions(-) create mode 100644 seankwarren/flowchart-calculator/cypress.config.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/support/commands.js create mode 100644 seankwarren/flowchart-calculator/cypress/support/e2e.js diff --git a/seankwarren/flowchart-calculator/cypress.config.js b/seankwarren/flowchart-calculator/cypress.config.js new file mode 100644 index 00000000..57d5b0e5 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress.config.js @@ -0,0 +1,10 @@ +const { defineConfig } = require("cypress"); + +module.exports = defineConfig({ + e2e: { + setupNodeEvents(on, config) { + // implement node event listeners here + }, + baseUrl: 'http://localhost:3000', + }, +}); diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js new file mode 100644 index 00000000..d26c7b75 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js @@ -0,0 +1,20 @@ +/// + +describe('App', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('user interaction elements renderer', () => { + cy.get('button').contains('Clear'); + cy.get('button').contains('Save Flow'); + cy.get('button').contains('in'); + cy.get('button').contains('+'); + cy.get('button').contains('sin'); + cy.get('button').contains('>'); + cy.get('button').contains('out'); + cy.get('select').contains('Select a flow'); + cy.get('input'); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/support/commands.js b/seankwarren/flowchart-calculator/cypress/support/commands.js new file mode 100644 index 00000000..66ea16ef --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/support/commands.js @@ -0,0 +1,25 @@ +// *********************************************** +// This example commands.js shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/support/e2e.js b/seankwarren/flowchart-calculator/cypress/support/e2e.js new file mode 100644 index 00000000..0e7290a1 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/support/e2e.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/package-lock.json b/seankwarren/flowchart-calculator/package-lock.json index 6e774374..85a1a72e 100644 --- a/seankwarren/flowchart-calculator/package-lock.json +++ b/seankwarren/flowchart-calculator/package-lock.json @@ -24,6 +24,7 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.0.0", "babel-jest": "^29.5.0", + "cypress": "^12.9.0", "jest": "^29.5.0" } }, @@ -1837,6 +1838,91 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2899,6 +2985,18 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", "dev": true }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -2931,6 +3029,16 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -2975,6 +3083,28 @@ "node": ">= 6.0.0" } }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3026,6 +3156,26 @@ "node": ">= 8" } }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -3044,11 +3194,53 @@ "deep-equal": "^2.0.5" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -3061,6 +3253,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "node_modules/babel-jest": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", @@ -3213,6 +3420,47 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3271,12 +3519,54 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -3328,6 +3618,12 @@ } ] }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -3350,6 +3646,15 @@ "node": ">=10" } }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -3375,6 +3680,58 @@ "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3421,6 +3778,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -3432,6 +3795,24 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3457,6 +3838,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3487,21 +3874,207 @@ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dependencies": { - "cssom": "~0.3.6" + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/cypress": { + "version": "12.9.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.9.0.tgz", + "integrity": "sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz", + "integrity": "sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg==", + "dev": true + }, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/semver": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", + "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "node_modules/cypress/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "node_modules/d3-color": { @@ -3600,6 +4173,18 @@ "node": ">=12" } }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -3613,6 +4198,12 @@ "node": ">=12" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3741,6 +4332,16 @@ "node": ">=12" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.364", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.364.tgz", @@ -3765,6 +4366,27 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3871,6 +4493,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -3894,6 +4522,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -3919,6 +4559,56 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3939,6 +4629,39 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3972,6 +4695,15 @@ "is-callable": "^1.1.3" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3985,6 +4717,30 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4073,6 +4829,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4093,6 +4867,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -4225,6 +5014,20 @@ "node": ">= 6" } }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -4257,6 +5060,26 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -4310,6 +5133,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -4400,6 +5232,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, "node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -4445,6 +5289,22 @@ "node": ">=6" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", @@ -4477,6 +5337,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4580,6 +5449,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -4614,6 +5501,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -5819,6 +6712,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "node_modules/jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", @@ -5881,16 +6780,64 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "bin": { - "json5": "lib/cli.js" - }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { - "node": ">=6" + "node": ">= 10.0.0" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" } }, "node_modules/kleur": { @@ -5902,6 +6849,15 @@ "node": ">=6" } }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5929,6 +6885,33 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -5953,6 +6936,93 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7210,6 +8280,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -7376,6 +8455,12 @@ "node": ">= 0.8.0" } }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -7418,6 +8503,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -7489,6 +8589,18 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -7506,6 +8618,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -7535,6 +8656,18 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -7590,11 +8723,27 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -7619,6 +8768,21 @@ } ] }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -7781,6 +8945,15 @@ "jsesc": "bin/jsesc" } }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7842,6 +9015,69 @@ "node": ">=10" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7930,6 +9166,20 @@ "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7964,6 +9214,31 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -8110,6 +9385,30 @@ "node": ">=8" } }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -8161,6 +9460,30 @@ "node": ">=12" } }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -8240,6 +9563,15 @@ "node": ">= 4.0.0" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -8283,6 +9615,15 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-to-istanbul": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", @@ -8303,6 +9644,20 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -8547,6 +9902,16 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", From 20e9db828a765064510284a9773dc97009136a3d Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sat, 15 Apr 2023 23:09:41 -0400 Subject: [PATCH 74/80] test: cypress e2e tests implemented --- .../flowchart-calculator/client/main.jsx | 4 + .../cypress/e2e/app/app_spec.cy.js | 20 ----- .../e2e/app/clear_flowchart_spec.cy.js | 20 +++++ .../e2e/app/dark_mode_switch_spec.cy.js | 31 +++++++ .../e2e/app/drag_and_drop_node_spec.cy.js | 79 ++++++++++++++++++ .../cypress/e2e/app/draw_edge_spec.cy.js | 28 +++++++ .../e2e/app/live_output_update_spec.cy.js | 30 +++++++ .../e2e/app/operation_validation_spec.cy.js | 41 ++++++++++ .../app/save_and_load_basic_flow_spec.cy.js | 35 ++++++++ .../cypress/support/commands.js | 64 +++++++++++---- .../ui/components/customNodes/BinaryNode.jsx | 6 +- .../ui/components/customNodes/UnaryNode.jsx | 2 +- .../mainPage/FlowchartCalculator.jsx | 81 +++++++++---------- .../components/mainPage/FlowchartCanvas.jsx | 25 +++--- .../ui/components/mainPage/JSONViewer.jsx | 21 ++--- .../ui/components/mainPage/NodeButtons.jsx | 13 +-- .../components/reusable/DarkModeContext.jsx | 23 ++++++ .../ui/components/reusable/DarkModeSwitch.jsx | 5 +- .../imports/ui/hooks/useLocalFlowData.jsx | 15 ++-- .../imports/ui/styles/index.css | 18 ++++- .../flowchart-calculator/package-lock.json | 8 ++ 21 files changed, 443 insertions(+), 126 deletions(-) delete mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js create mode 100644 seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeContext.jsx diff --git a/seankwarren/flowchart-calculator/client/main.jsx b/seankwarren/flowchart-calculator/client/main.jsx index 9c1a8b23..341ccfd1 100644 --- a/seankwarren/flowchart-calculator/client/main.jsx +++ b/seankwarren/flowchart-calculator/client/main.jsx @@ -7,4 +7,8 @@ Meteor.startup(() => { const container = document.getElementById('app'); const root = createRoot(container); root.render(); + + // Dispatch the 'meteor-app-loaded' event + const event = new Event('meteor-app-loaded'); + window.dispatchEvent(event); }); diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js deleted file mode 100644 index d26c7b75..00000000 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/app_spec.cy.js +++ /dev/null @@ -1,20 +0,0 @@ -/// - -describe('App', () => { - beforeEach(() => { - // Visit the app's home page before each test - cy.visit('/'); - }); - - it('user interaction elements renderer', () => { - cy.get('button').contains('Clear'); - cy.get('button').contains('Save Flow'); - cy.get('button').contains('in'); - cy.get('button').contains('+'); - cy.get('button').contains('sin'); - cy.get('button').contains('>'); - cy.get('button').contains('out'); - cy.get('select').contains('Select a flow'); - cy.get('input'); - }); -}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js new file mode 100644 index 00000000..bf4a3674 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js @@ -0,0 +1,20 @@ +describe('Clear Nodes and Edges', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('clears all nodes and edges after clicking the "Clear" button', () => { + // Click the "Clear" button + cy.contains('button', 'Clear').click(); + + // Verify no nodes exist in the ReactFlow pane + cy.get('.react-flow__nodes') + .find('.node') + .should('not.exist'); + + // Verify no edges exist in the ReactFlow pane + cy.get('.react-flow__edges') + .find('.react-flow__edge') + .should('not.exist'); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js new file mode 100644 index 00000000..aebb9d35 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js @@ -0,0 +1,31 @@ +/// + +describe('Dark Mode Switch', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('toggles dark mode on and off', () => { + // Check if the 'dark-mode' class is not applied initially + cy.get('.react-flow').should('have.class', 'dark-mode'); + cy.get('.buttons-panel').should('have.class', 'dark-mode'); + cy.get('.json-viewer').should('have.class', 'dark-mode'); + + // Toggle the dark mode switch + cy.get('.darkmode-switch').click(); + + // Check if the 'dark-mode' class is applied to the body + cy.get('.react-flow').should('not.have.class', 'dark-mode'); + cy.get('.buttons-panel').should('not.have.class', 'dark-mode'); + cy.get('.json-viewer').should('not.have.class', 'dark-mode'); + + // Toggle the dark mode switch back to off + cy.get('.darkmode-switch').click(); + + // Check if the 'dark-mode' class is removed from the body + cy.get('.react-flow').should('have.class', 'dark-mode'); + cy.get('.buttons-panel').should('have.class', 'dark-mode'); + cy.get('.json-viewer').should('have.class', 'dark-mode'); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js new file mode 100644 index 00000000..1ba674d9 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js @@ -0,0 +1,79 @@ +describe('Drag and Drop Input Node', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drags an input node onto the reactflow pane and checks if it exists', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', 'in').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=input-node]') + .should('exist'); + }); +}); + +describe('Drag and Drop Output Node', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drags an output node onto the reactflow pane and checks if it exists', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=output-node]') + .should('exist'); + }); +}); + +describe('Drag and Drop Binary Node', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drags a binary node onto the reactflow pane and checks if it exists', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', '+').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=binary-node]') + .should('exist'); + }); +}); + +describe('Drag and Drop Unary Node', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drags a unary node onto the reactflow pane and checks if it exists', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', 'sin').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=unary-node]') + .should('exist'); + }); +}); + +describe('Drag and Drop Comparison Node', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drags a comparison node onto the reactflow pane and checks if it exists', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', '>').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=comparison-node]') + .should('exist'); + }); +}); diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js new file mode 100644 index 00000000..4a194a83 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js @@ -0,0 +1,28 @@ +/// + +describe('Draw Edge', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('draws the simplest flowchart with 1 edge', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.output', + '.react-flow__nodes [data-testid=output-node] .handle.input' + ); + + // Check if the edge exists + cy.get('.react-flow__edges') + .find('.react-flow__edge') + .should('have.length', 1); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js new file mode 100644 index 00000000..90d51842 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js @@ -0,0 +1,30 @@ +/// + +describe('Draw Edge', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('draws the simplest flowchart with 1 edge', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.output', + '.react-flow__nodes [data-testid=output-node] .handle.input' + ); + + cy.get('[data-testid=input-node] input') + .clear({ force: true }) // Clear the current value of the input element + .type('42', { force: true }); // Set the new value to '42' + + cy.get('[data-testid=output-node]') + .should('contain.text', '42') + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js new file mode 100644 index 00000000..ac1a6712 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js @@ -0,0 +1,41 @@ +/// + +describe('Draw Edge', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('draws the simplest flowchart with 1 edge', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', '+').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.source', + '.react-flow__nodes [data-testid=binary-node] .handle.target.top' + ); + + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.source', + '.react-flow__nodes [data-testid=binary-node] .handle.target.bottom' + ); + + cy.connectHandles( + '.react-flow__nodes [data-testid=binary-node] .handle.source', + '.react-flow__nodes [data-testid=output-node] .handle.target' + ); + + cy.get('[data-testid=input-node] input') + .clear({ force: true }) // Clear the current value of the input element + .type('42', { force: true }); // Set the new value to '42' + + cy.get('[data-testid=output-node]') + .should('contain.text', '84') + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js new file mode 100644 index 00000000..8ed0e741 --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js @@ -0,0 +1,35 @@ +/// + +describe('Save Flow', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('saves a flow to MongoDB and then reloads it', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + + // Type a flow name into the input field + cy.get('.flowname').type("automated save test") + + // Click the save button + cy.get('.saveflow').click(); + + // Click the clear button + cy.get('.clear').click(); + + // Deselect a flow from the dropdown selection + cy.get('.flow-dropdown').select('Select a flow') + + // Select the new flow from the dropdown selection + cy.get('.flow-dropdown').select('automated save test') + + cy.get('.react-flow__nodes') + .find('[data-testid=input-node]') + .should('exist'); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/support/commands.js b/seankwarren/flowchart-calculator/cypress/support/commands.js index 66ea16ef..91941eab 100644 --- a/seankwarren/flowchart-calculator/cypress/support/commands.js +++ b/seankwarren/flowchart-calculator/cypress/support/commands.js @@ -7,19 +7,51 @@ // commands please read more here: // https://on.cypress.io/custom-commands // *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) \ No newline at end of file + +import 'cypress-drag-drop'; + +Cypress.Commands.add('dragAndDrop', { prevSubject: 'element' }, (subject, targetSelector) => { + const dataTransfer = new DataTransfer(); + cy.wrap(subject) + .trigger('dragstart', { dataTransfer }) + .get(targetSelector) + .trigger('drop', { dataTransfer }) + .trigger('dragend'); +}); + +Cypress.Commands.add('connectHandles', (sourceSelector, targetSelector) => { + cy.get(sourceSelector) + .then(($source) => { + // console.log('Source element:', $source[0]); + // console.log('Source attributes:', $source[0].attributes); + + return cy.get(targetSelector) + .then(($target) => { + // console.log('Target element:', $target[0]); + // console.log('Target attributes:', $target[0].attributes); + + return { + sourceId: $source.attr('data-nodeid'), + targetId: $target.attr('data-nodeid'), + sourceHandleId: $source.attr('data-handleid'), + targetHandleId: $target.attr('data-handleid'), + }; + }); + }) + .then(({ sourceId, targetId, sourceHandleId, targetHandleId }) => { + console.log('Source ID:', sourceId); + console.log('Target ID:', targetId); + console.log('Source Handle ID:', sourceHandleId); + console.log('Target Handle ID:', targetHandleId); + + cy.window().then((win) => { + // Make sure the functions and states are available + if (win.handleConnect && win.edges) { + console.log("window edges:", win.edges) + win.handleConnect({ source: sourceId, target: targetId, sourceHandle: sourceHandleId, targetHandle: targetHandleId }, win.edges); + } else { + throw new Error('Window properties not available'); + } + }); + }); + }); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx index 80be23ec..e8680568 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx @@ -8,9 +8,9 @@ const BinaryNode = ({ id, data }) => { }; return ( -
+
{ }} /> { }; return ( -
+
{ // state for nodes and edges @@ -46,55 +46,48 @@ const FlowchartCalculator = () => { addNode ); - // Dark mode toggling - const { isDarkMode, toggleDarkMode } = useToggleable(true); - useEffect(() => { fetchFlows(); }, []); return ( - -
- - + +
+ + +
+ -
- - - -
+ flows={fetchedFlows} + loadFlowchart={loadFlowchart} + onSave={saveFlow} + flowName={flowName} + updateFlowName={updateFlowName} + > + + + + ); }; diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx index 41500488..514a591d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/FlowchartCanvas.jsx @@ -4,6 +4,7 @@ import ReactFlow, { Background, Controls, MiniMap } from 'reactflow'; import nodeTypesConfig from '../customNodes/nodeTypes'; import usePrevious from '../../hooks/usePrevious'; import getNodeColor from '../../utils/getNodeColor'; +import { useDarkMode } from '../reusable/DarkModeContext'; const FlowchartCanvas = ({ setReactFlowInstance, @@ -15,24 +16,27 @@ const FlowchartCanvas = ({ handleDragOver, handleDrop, updateOutputNodes, - isDarkMode, + // isDarkMode, }) => { + const { isDarkMode } = useDarkMode(); // store previous nodes and edges as state const prevNodes = usePrevious(nodes); const prevEdges = usePrevious(edges); - // Darkmode style toggling - const reactFlowStyle = { - backgroundColor: isDarkMode - ? 'rgba(40, 40, 40, 1)' - : 'rgba(255, 255, 255, 1)', - }; - // Define custom node types const nodeTypes = useMemo(() => { return nodeTypesConfig; }, []); + useEffect(() => { + window.handleConnect = handleConnect; + window.edges = edges; + return () => { + window.handleConnect = null; + window.edges = null; + }; + }, [handleConnect, edges]); + useEffect(() => { // TODO: use lodash to evaluate equality? if ( @@ -55,19 +59,18 @@ const FlowchartCanvas = ({ snapToGrid onDrop={handleDrop} onDragOver={handleDragOver} - style={reactFlowStyle} proOptions={{ hideAttribution: true }} + className={isDarkMode ? "dark-mode" : ""} > - ); diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx index 499591e4..af3de44c 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/JSONViewer.jsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react'; import hljs from 'highlight.js/lib/core'; import json from 'highlight.js/lib/languages/json'; +import { useDarkMode } from '../reusable/DarkModeContext'; const JSONViewer = ({ children, @@ -8,33 +9,27 @@ const JSONViewer = ({ edges, flows, loadFlowchart, - isDarkMode, onSave, flowName, updateFlowName, }) => { - // Darkmode style toggling - const jsonViewerStyle = { - backgroundColor: isDarkMode - ? 'rgba(30, 30, 30, 1)' - : 'rgba(255, 255, 255, 1)', - color: isDarkMode ? 'rgba(255, 255, 255, 1)' : 'rgba(0, 0, 0, 1)', - }; - useEffect(() => { - hljs.highlightAll(); - }, [nodes, edges]); + const { isDarkMode } = useDarkMode(); useEffect(() => { hljs.registerLanguage('json', json); }, []) + useEffect(() => { + hljs.highlightAll(); + }, [nodes, edges]); + // TODO: move save/load controls to seperate component return (
{children}
diff --git a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx index 091d365c..8a71538a 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/mainPage/NodeButtons.jsx @@ -1,23 +1,18 @@ import React from 'react'; import DraggableButton from '../reusable/DraggableButton'; +import { useDarkMode } from '../reusable/DarkModeContext'; const NodeButtons = ({ handleDragStart, - isDarkMode, clearFlowchart, clearFlows, }) => { - // Darkmode style toggling - const buttonsPanelStyle = { - backgroundColor: isDarkMode - ? 'rgba(0, 0, 0, 0.5)' - : 'rgba(51, 51, 51, 0.3)', - }; + const { isDarkMode } = useDarkMode(); return (
{ + return useContext(DarkModeContext); +}; + +export const DarkModeProvider = ({ children }) => { + const [isDarkMode, setIsDarkMode] = useState(true); + + const toggleDarkMode = () => { + setIsDarkMode((prevState) => !prevState); + }; + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx index 1ad27094..98a6218f 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/reusable/DarkModeSwitch.jsx @@ -1,7 +1,10 @@ import React from 'react'; import Switch from 'react-switch'; +import { useDarkMode } from './DarkModeContext'; -const DarkModeSwitch = ({ isDarkMode, toggleDarkMode }) => { +const DarkModeSwitch = () => { + const { isDarkMode, toggleDarkMode } = useDarkMode(); + return ( { }; // Function to handle connecting nodes - const handleConnect = (params) => { + const handleConnect = useCallback((params, customEdges) => { + console.log(params) const { source, sourceHandle, target, targetHandle } = params; + const currentEdges = customEdges || edges; // Check if an edge with the same source and target already exists - const existingEdge = edges.find( + const existingEdge = currentEdges.find( (edge) => edge.source === sourceHandle && edge.target === targetHandle ); if (existingEdge) return; // Check if there is already an edge connected to the target handle - const existingEdgeWithSameTargetHandle = edges.find( + const existingEdgeWithSameTargetHandle = currentEdges.find( (edge) => edge.targetHandle === targetHandle ); if (existingEdgeWithSameTargetHandle) return; @@ -93,12 +95,15 @@ const useLocalFlowData = (initial = {}) => { interactionWidth: 40, }; - const newEdges = [...edges, newEdge]; + const newEdges = [...currentEdges, newEdge]; + setEdges(newEdges); + console.log(newEdges) + // If the target node is an output node, calculate its value and update its state updateOutputNodes(); - }; + }, [edges, setEdges]); return { reactFlowInstance, diff --git a/seankwarren/flowchart-calculator/imports/ui/styles/index.css b/seankwarren/flowchart-calculator/imports/ui/styles/index.css index 802ec8aa..f5f2121d 100644 --- a/seankwarren/flowchart-calculator/imports/ui/styles/index.css +++ b/seankwarren/flowchart-calculator/imports/ui/styles/index.css @@ -40,11 +40,13 @@ body { top: 0; z-index: 10; justify-content: left; - /* padding-left: var(--small-padding); */ align-items: center; - background-color: var(--gray); + background-color: rgba(51, 51, 51, 0.3); display: flex; - /* height: fit-content; */ +} + +.buttons-panel.dark-mode { + background-color: rgba(0, 0, 0, 0.5); } .clear { @@ -68,6 +70,7 @@ body { display: flex; justify-content: center; align-items: center; + color: black; } .node.button { @@ -231,3 +234,12 @@ input { border: 1px solid #000; color: #000; } + +.dark-mode { + background-color: rgba(30, 30, 30, 1); + color: rgba(255, 255, 255, 1); +} + +.react-flow.dark-mode { + background-color: rgba(40, 40, 40, 1); +} diff --git a/seankwarren/flowchart-calculator/package-lock.json b/seankwarren/flowchart-calculator/package-lock.json index 85a1a72e..8e312230 100644 --- a/seankwarren/flowchart-calculator/package-lock.json +++ b/seankwarren/flowchart-calculator/package-lock.json @@ -25,6 +25,7 @@ "@testing-library/react": "^14.0.0", "babel-jest": "^29.5.0", "cypress": "^12.9.0", + "cypress-drag-drop": "^1.1.1", "jest": "^29.5.0" } }, @@ -3948,6 +3949,13 @@ "node": "^14.0.0 || ^16.0.0 || >=18.0.0" } }, + "node_modules/cypress-drag-drop": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cypress-drag-drop/-/cypress-drag-drop-1.1.1.tgz", + "integrity": "sha512-sp1dILmN8HXCUIeeztqlCslyghFT5w1gHM7RFA/AUSLKmDI/ovxNhZQI6U2/cbH2ehbCuvPppyh99uEt9dhF3w==", + "deprecated": "This package has been moved to https://www.npmjs.com/package/@4tw/cypress-drag-drop.", + "dev": true + }, "node_modules/cypress/node_modules/@types/node": { "version": "14.18.42", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.42.tgz", From 01dfd251f1fa8a7a41da6e0349a141393c802a1b Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 16 Apr 2023 01:08:42 -0400 Subject: [PATCH 75/80] feat(test): all basic test cases added --- .../app/basic_user_interactions_spec.cy.js | 135 +++++++++++++++ .../e2e/app/clear_flowchart_spec.cy.js | 20 --- .../e2e/app/dark_mode_switch_spec.cy.js | 31 ---- .../e2e/app/drag_and_drop_node_spec.cy.js | 79 --------- .../cypress/e2e/app/draw_edge_spec.cy.js | 28 ---- .../e2e/app/operation_validation_spec.cy.js | 155 +++++++++++++++++- ...te_spec.cy.js => output_update_spec.cy.js} | 0 ...ow_spec.cy.js => save_and_load_spec.cy.js} | 0 .../cypress/support/commands.js | 20 +-- .../components/customNodes/ComparisonNode.jsx | 4 +- .../components/mainPage/FlowchartCanvas.jsx | 21 +-- .../imports/ui/hooks/useLocalFlowData.jsx | 10 +- 12 files changed, 309 insertions(+), 194 deletions(-) create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/basic_user_interactions_spec.cy.js delete mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js delete mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js delete mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js delete mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js rename seankwarren/flowchart-calculator/cypress/e2e/app/{live_output_update_spec.cy.js => output_update_spec.cy.js} (100%) rename seankwarren/flowchart-calculator/cypress/e2e/app/{save_and_load_basic_flow_spec.cy.js => save_and_load_spec.cy.js} (100%) diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/basic_user_interactions_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/basic_user_interactions_spec.cy.js new file mode 100644 index 00000000..b4c3673f --- /dev/null +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/basic_user_interactions_spec.cy.js @@ -0,0 +1,135 @@ +/// + +describe('Basic user interaction', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('clears all nodes and edges after clicking the "Clear" button', () => { + // Click the "Clear" button + cy.contains('button', 'Clear').click(); + + // Verify no nodes exist in the ReactFlow pane + cy.get('.react-flow__nodes') + .find('.node') + .should('not.exist'); + + // Verify no edges exist in the ReactFlow pane + cy.get('.react-flow__edges') + .find('.react-flow__edge') + .should('not.exist'); + }); +}); + +describe('Dark Mode Switch', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('toggles dark mode on and off', () => { + // Check if the 'dark-mode' class is not applied initially + cy.get('.react-flow').should('have.class', 'dark-mode'); + cy.get('.buttons-panel').should('have.class', 'dark-mode'); + cy.get('.json-viewer').should('have.class', 'dark-mode'); + + // Toggle the dark mode switch + cy.get('.darkmode-switch').click(); + + // Check if the 'dark-mode' class is applied to the body + cy.get('.react-flow').should('not.have.class', 'dark-mode'); + cy.get('.buttons-panel').should('not.have.class', 'dark-mode'); + cy.get('.json-viewer').should('not.have.class', 'dark-mode'); + + // Toggle the dark mode switch back to off + cy.get('.darkmode-switch').click(); + + // Check if the 'dark-mode' class is removed from the body + cy.get('.react-flow').should('have.class', 'dark-mode'); + cy.get('.buttons-panel').should('have.class', 'dark-mode'); + cy.get('.json-viewer').should('have.class', 'dark-mode'); + }); +}); + +describe('Drag and Drop Nodes', () => { + beforeEach(() => { + cy.visit('/'); + }); + + it('drag and drop an input node onto the flowchart', () => { + // Find the button containing "in" and drag it onto the ReactFlow pane + cy.contains('button', 'in').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=input-node]') + .should('exist'); + }); + + it('drag and drop an output node onto the flowchart', () => { + // Find the button containing "out" and drag it onto the ReactFlow pane + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=output-node]') + .should('exist'); + }); + + it('drag and drop a binary node onto the flowchart', () => { + // Find the button containing "+" and drag it onto the ReactFlow pane + cy.contains('button', '+').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=binary-node]') + .should('exist'); + }); + + it('drag and drop a unary node onto the flowchart', () => { + // Find the button containing "sin" and drag it onto the ReactFlow pane + cy.contains('button', 'sin').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=unary-node]') + .should('exist'); + }); + + it('drag and drop a comparison node onto the flowchart', () => { + // Find the button containing ">" and drag it onto the ReactFlow pane + cy.contains('button', '>').dragAndDrop('.react-flow'); + + // Verify the input node exists in the reactflow pane + cy.get('.react-flow__nodes') + .find('[data-testid=comparison-node]') + .should('exist'); + }); +}); + +describe('Draw Edge', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('draws the simplest flowchart with 1 edge', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.output', + '.react-flow__nodes [data-testid=output-node] .handle.input' + ); + + // Check if the edge exists + cy.get('.react-flow__edges') + .find('.react-flow__edge') + .should('have.length', 1); + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js deleted file mode 100644 index bf4a3674..00000000 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/clear_flowchart_spec.cy.js +++ /dev/null @@ -1,20 +0,0 @@ -describe('Clear Nodes and Edges', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('clears all nodes and edges after clicking the "Clear" button', () => { - // Click the "Clear" button - cy.contains('button', 'Clear').click(); - - // Verify no nodes exist in the ReactFlow pane - cy.get('.react-flow__nodes') - .find('.node') - .should('not.exist'); - - // Verify no edges exist in the ReactFlow pane - cy.get('.react-flow__edges') - .find('.react-flow__edge') - .should('not.exist'); - }); -}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js deleted file mode 100644 index aebb9d35..00000000 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/dark_mode_switch_spec.cy.js +++ /dev/null @@ -1,31 +0,0 @@ -/// - -describe('Dark Mode Switch', () => { - beforeEach(() => { - // Visit the app's home page before each test - cy.visit('/'); - }); - - it('toggles dark mode on and off', () => { - // Check if the 'dark-mode' class is not applied initially - cy.get('.react-flow').should('have.class', 'dark-mode'); - cy.get('.buttons-panel').should('have.class', 'dark-mode'); - cy.get('.json-viewer').should('have.class', 'dark-mode'); - - // Toggle the dark mode switch - cy.get('.darkmode-switch').click(); - - // Check if the 'dark-mode' class is applied to the body - cy.get('.react-flow').should('not.have.class', 'dark-mode'); - cy.get('.buttons-panel').should('not.have.class', 'dark-mode'); - cy.get('.json-viewer').should('not.have.class', 'dark-mode'); - - // Toggle the dark mode switch back to off - cy.get('.darkmode-switch').click(); - - // Check if the 'dark-mode' class is removed from the body - cy.get('.react-flow').should('have.class', 'dark-mode'); - cy.get('.buttons-panel').should('have.class', 'dark-mode'); - cy.get('.json-viewer').should('have.class', 'dark-mode'); - }); -}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js deleted file mode 100644 index 1ba674d9..00000000 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/drag_and_drop_node_spec.cy.js +++ /dev/null @@ -1,79 +0,0 @@ -describe('Drag and Drop Input Node', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('drags an input node onto the reactflow pane and checks if it exists', () => { - // Find the button containing "in" and drag it onto the ReactFlow pane - cy.contains('button', 'in').dragAndDrop('.react-flow'); - - // Verify the input node exists in the reactflow pane - cy.get('.react-flow__nodes') - .find('[data-testid=input-node]') - .should('exist'); - }); -}); - -describe('Drag and Drop Output Node', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('drags an output node onto the reactflow pane and checks if it exists', () => { - // Find the button containing "in" and drag it onto the ReactFlow pane - cy.contains('button', 'out').dragAndDrop('.react-flow'); - - // Verify the input node exists in the reactflow pane - cy.get('.react-flow__nodes') - .find('[data-testid=output-node]') - .should('exist'); - }); -}); - -describe('Drag and Drop Binary Node', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('drags a binary node onto the reactflow pane and checks if it exists', () => { - // Find the button containing "in" and drag it onto the ReactFlow pane - cy.contains('button', '+').dragAndDrop('.react-flow'); - - // Verify the input node exists in the reactflow pane - cy.get('.react-flow__nodes') - .find('[data-testid=binary-node]') - .should('exist'); - }); -}); - -describe('Drag and Drop Unary Node', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('drags a unary node onto the reactflow pane and checks if it exists', () => { - // Find the button containing "in" and drag it onto the ReactFlow pane - cy.contains('button', 'sin').dragAndDrop('.react-flow'); - - // Verify the input node exists in the reactflow pane - cy.get('.react-flow__nodes') - .find('[data-testid=unary-node]') - .should('exist'); - }); -}); - -describe('Drag and Drop Comparison Node', () => { - beforeEach(() => { - cy.visit('/'); - }); - - it('drags a comparison node onto the reactflow pane and checks if it exists', () => { - // Find the button containing "in" and drag it onto the ReactFlow pane - cy.contains('button', '>').dragAndDrop('.react-flow'); - - // Verify the input node exists in the reactflow pane - cy.get('.react-flow__nodes') - .find('[data-testid=comparison-node]') - .should('exist'); - }); -}); diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js deleted file mode 100644 index 4a194a83..00000000 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/draw_edge_spec.cy.js +++ /dev/null @@ -1,28 +0,0 @@ -/// - -describe('Draw Edge', () => { - beforeEach(() => { - // Visit the app's home page before each test - cy.visit('/'); - }); - - it('draws the simplest flowchart with 1 edge', () => { - // Click the clear button - cy.get('.clear').click(); - - // Place a new node on the flowchart - cy.contains('button', 'in').dragAndDrop('.react-flow'); - cy.contains('button', 'out').dragAndDrop('.react-flow'); - - // Connect the nodes - cy.connectHandles( - '.react-flow__nodes [data-testid=input-node] .handle.output', - '.react-flow__nodes [data-testid=output-node] .handle.input' - ); - - // Check if the edge exists - cy.get('.react-flow__edges') - .find('.react-flow__edge') - .should('have.length', 1); - }); -}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js index ac1a6712..f50467a1 100644 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/operation_validation_spec.cy.js @@ -1,12 +1,12 @@ /// -describe('Draw Edge', () => { +describe('Binary Operators', () => { beforeEach(() => { // Visit the app's home page before each test cy.visit('/'); }); - it('draws the simplest flowchart with 1 edge', () => { + it('tests the binary operators', () => { // Click the clear button cy.get('.clear').click(); @@ -33,9 +33,156 @@ describe('Draw Edge', () => { cy.get('[data-testid=input-node] input') .clear({ force: true }) // Clear the current value of the input element - .type('42', { force: true }); // Set the new value to '42' + .type('3', { force: true }); // Set the new value to '42' cy.get('[data-testid=output-node]') - .should('contain.text', '84') + .should('contain.text', '6'); + + cy.get('[data-testid=binary-node] select') + .select('-', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '0'); + + cy.get('[data-testid=binary-node] select') + .select('*', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '9'); + + cy.get('[data-testid=binary-node] select') + .select('/', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '1'); + + cy.get('[data-testid=binary-node] select') + .select('^', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '27'); + }); +}); + +describe('Unary Operators', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('tests the unary operators', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', 'sin').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.source', + '.react-flow__nodes [data-testid=unary-node] .handle.target' + ); + + cy.connectHandles( + '.react-flow__nodes [data-testid=unary-node] .handle.source', + '.react-flow__nodes [data-testid=output-node] .handle.target' + ); + + cy.get('[data-testid=input-node] input') + .clear({ force: true }) // Clear the current value of the input element + .type('3.14159', { force: true }); // Set the new value to '42' + + cy.get('[data-testid=output-node]') + .should('contain.text', '0.00000265358979335273'); + + cy.get('[data-testid=unary-node] select') + .select('cos', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '-0.9999999999964793') + + cy.get('[data-testid=unary-node] select') + .select('tan', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '-0.000002653589793362073'); + + cy.get('[data-testid=unary-node] select') + .select('e^x', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', '23.14063122695496') + }); +}); + +describe('Comparison Operators', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('tests the comparison operators', () => { + // Click the clear button + cy.get('.clear').click(); + + // Place a new node on the flowchart + cy.contains('button', 'in').dragAndDrop('.react-flow'); + cy.contains('button', '>').dragAndDrop('.react-flow'); + cy.contains('button', 'out').dragAndDrop('.react-flow'); + + // Connect the nodes + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.source', + '.react-flow__nodes [data-testid=comparison-node] .handle.target.top' + ); + + cy.connectHandles( + '.react-flow__nodes [data-testid=input-node] .handle.source', + '.react-flow__nodes [data-testid=comparison-node] .handle.target.bottom' + ); + + cy.connectHandles( + '.react-flow__nodes [data-testid=comparison-node] .handle.source', + '.react-flow__nodes [data-testid=output-node] .handle.target' + ); + + cy.get('[data-testid=input-node] input') + .clear({ force: true }) // Clear the current value of the input element + .type('3.14159', { force: true }); // Set the new value to '42' + + cy.get('[data-testid=output-node]') + .should('contain.text', 'false'); + + cy.get('[data-testid=comparison-node] select') + .select('<', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', 'false'); + + cy.get('[data-testid=comparison-node] select') + .select('>=', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', 'true'); + + cy.get('[data-testid=comparison-node] select') + .select('<=', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', 'true'); + + cy.get('[data-testid=comparison-node] select') + .select('!=', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', 'false'); + + cy.get('[data-testid=comparison-node] select') + .select('==', { force: true }); + + cy.get('[data-testid=output-node]') + .should('contain.text', 'true') }); }); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/output_update_spec.cy.js similarity index 100% rename from seankwarren/flowchart-calculator/cypress/e2e/app/live_output_update_spec.cy.js rename to seankwarren/flowchart-calculator/cypress/e2e/app/output_update_spec.cy.js diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_spec.cy.js similarity index 100% rename from seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_basic_flow_spec.cy.js rename to seankwarren/flowchart-calculator/cypress/e2e/app/save_and_load_spec.cy.js diff --git a/seankwarren/flowchart-calculator/cypress/support/commands.js b/seankwarren/flowchart-calculator/cypress/support/commands.js index 91941eab..7c217401 100644 --- a/seankwarren/flowchart-calculator/cypress/support/commands.js +++ b/seankwarren/flowchart-calculator/cypress/support/commands.js @@ -22,14 +22,8 @@ Cypress.Commands.add('dragAndDrop', { prevSubject: 'element' }, (subject, target Cypress.Commands.add('connectHandles', (sourceSelector, targetSelector) => { cy.get(sourceSelector) .then(($source) => { - // console.log('Source element:', $source[0]); - // console.log('Source attributes:', $source[0].attributes); - return cy.get(targetSelector) .then(($target) => { - // console.log('Target element:', $target[0]); - // console.log('Target attributes:', $target[0].attributes); - return { sourceId: $source.attr('data-nodeid'), targetId: $target.attr('data-nodeid'), @@ -44,14 +38,14 @@ Cypress.Commands.add('connectHandles', (sourceSelector, targetSelector) => { console.log('Source Handle ID:', sourceHandleId); console.log('Target Handle ID:', targetHandleId); + cy.window().then((win) => { - // Make sure the functions and states are available - if (win.handleConnect && win.edges) { - console.log("window edges:", win.edges) - win.handleConnect({ source: sourceId, target: targetId, sourceHandle: sourceHandleId, targetHandle: targetHandleId }, win.edges); - } else { - throw new Error('Window properties not available'); - } + win.handleConnect({ + source: sourceId, + target: targetId, + sourceHandle: sourceHandleId, + targetHandle: targetHandleId + }); }); }); }); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx index 14dd12e2..46473e71 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/ComparisonNode.jsx @@ -10,7 +10,7 @@ export const ComparisonNode = ({ id, data }) => { return (
{ }} /> { - window.handleConnect = handleConnect; - window.edges = edges; - return () => { - window.handleConnect = null; - window.edges = null; - }; - }, [handleConnect, edges]); - useEffect(() => { // TODO: use lodash to evaluate equality? if ( @@ -47,6 +38,16 @@ const FlowchartCanvas = ({ } }, [nodes, edges, prevNodes, prevEdges, updateOutputNodes]); + useEffect(() => { + window.handleConnect = handleConnect; + window.edges = edges; + + return () => { + window.handleConnect = null; + window.edges = null; + }; + }, [handleConnect, edges]); + return ( { interactionWidth: 40, }; - const newEdges = [...currentEdges, newEdge]; - - setEdges(newEdges); - - console.log(newEdges) - + setEdges((currEdges) => [...currEdges, newEdge]); + // If the target node is an output node, calculate its value and update its state updateOutputNodes(); - }, [edges, setEdges]); + }, [setEdges]); return { reactFlowInstance, From a072ba80bbe5d9b1c20f23be264dd07caecad004 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 16 Apr 2023 01:19:29 -0400 Subject: [PATCH 76/80] chore(docs): user stories updated --- seankwarren/README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/seankwarren/README.md b/seankwarren/README.md index 408228cc..81d84788 100644 --- a/seankwarren/README.md +++ b/seankwarren/README.md @@ -95,9 +95,11 @@ Run the development server using `meteor`. - [x] As an end user, I should be able to click a 'Save Flow' button to save the JSON datastructure to a MongoDB instance. - [x] As an end user, I should be able to select a saved flow from a dropdown list and load it in the flowchart and JSON viewers. - [x] As an end user, I should be able to click on a button called 'clear' to clear the flowchart. - -### Potential Improvement User Stories: -- [ ] ~~As an end user, I should be able to edit the JSON and have the flowchart update accordingly.~~ -- [ ] ~~As an end user, I should be able to use the comparison nodes as a gate to decide whether another node should be executed.~~ -- [ ] ~~As an end user, the input nodes should be exapandable to include multiple values each with their own handle.~~ -- [ ] ~~As an end user, I should be able to click on a button called 'restore' to put the previously clear flowchart back in place.~~ \ No newline at end of file +- [x] As a development user, I should be able to automatically test all of the binary, unary, and comparison operations using cypress. +- [x] As a development user, I should be able to automatically test all basic user interactions, including toggling darkmode, __resizing the pane__, clearing the flowchart, dragging and dropping nodes, and drawing edges using cypress. +- [x] As a development user, I should be able to automatically test the save and load procedure using cypress. + +### TODO User Stories: +- [ ] As a development user, I should be able to automatically test a complex flowchart like the tanh() function using cypress. +- [ ] As a development user, I should be able to automatically test that the rendered JSON is updated on change, and accurate using cypress. +- [ ] As a development user, I should be able to unit test each react component and hook using jest. \ No newline at end of file From 0ce0de40b7d8f8dd450b45cb038f15185791353b Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 16 Apr 2023 01:25:44 -0400 Subject: [PATCH 77/80] chore(docs): README updated --- seankwarren/README.md | 4 ++++ .../cypress/e2e/app/complex_tanh_test.cy.js | 0 2 files changed, 4 insertions(+) create mode 100644 seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js diff --git a/seankwarren/README.md b/seankwarren/README.md index 81d84788..ee7606b3 100644 --- a/seankwarren/README.md +++ b/seankwarren/README.md @@ -27,6 +27,9 @@ Install dependencies using `npm install`. Run the development server using `meteor`. > will launch on localhost:3000/ +Run tests with `npm run cypress:open` + + ## Front-end Environment Structure: imports │ @@ -49,6 +52,7 @@ Run the development server using `meteor`. │ │ ├── JSONViewer.jsx // Contains the JSON panel │ │ └── NodeButtons.jsx // Contains the drag and drop node buttons │ └── reusable // Generic components that can be reused anywhere + │ ├── DarkModeContext.jsx │ ├── DarkModeSwitch.jsx │ ├── DraggableButton.jsx │ └── ResizablePane.jsx diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js new file mode 100644 index 00000000..e69de29b From 5bad818898950d079b2d26537f3e26d6ea134702 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 16 Apr 2023 01:29:42 -0400 Subject: [PATCH 78/80] fix: including package.json for scripts --- seankwarren/flowchart-calculator/package.json | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 seankwarren/flowchart-calculator/package.json diff --git a/seankwarren/flowchart-calculator/package.json b/seankwarren/flowchart-calculator/package.json new file mode 100644 index 00000000..d681310f --- /dev/null +++ b/seankwarren/flowchart-calculator/package.json @@ -0,0 +1,42 @@ +{ + "name": "flowchart-calculator", + "private": true, + "scripts": { + "start": "meteor run", + "test": "jest", + "cypress:open": "cypress open", + "test2": "meteor test --once --driver-package meteortesting:mocha", + "test-app": "TEST_WATCH=1 meteor test --full-app --driver-package meteortesting:mocha", + "visualize": "meteor --production --extra-packages bundle-visualizer" + }, + "dependencies": { + "@babel/runtime": "^7.20.7", + "highlight.js": "^11.7.0", + "jest-environment-jsdom": "^29.5.0", + "meteor-node-stubs": "^1.2.5", + "nanoid": "^4.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-switch": "^7.0.0", + "reactflow": "^11.7.0", + "split-pane-react": "^0.1.3" + }, + "meteor": { + "mainModule": { + "client": "client/index.js", + "server": "server/main.js" + }, + "testModule": "tests/main.js" + }, + "devDependencies": { + "@babel/core": "^7.21.4", + "@babel/preset-env": "^7.21.4", + "@babel/preset-react": "^7.18.6", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^14.0.0", + "babel-jest": "^29.5.0", + "cypress": "^12.9.0", + "cypress-drag-drop": "^1.1.1", + "jest": "^29.5.0" + } +} From 0cb134190acd29903c859ffeb775db516f559eb2 Mon Sep 17 00:00:00 2001 From: seankwarren Date: Sun, 16 Apr 2023 16:46:07 -0400 Subject: [PATCH 79/80] feat(test): complex flowchart (tanh) test added --- .../cypress/e2e/app/complex_tanh_test.cy.js | 138 ++++++++++++++++++ .../ui/components/customNodes/BinaryNode.jsx | 2 +- .../components/customNodes/ComparisonNode.jsx | 2 +- .../ui/components/customNodes/InputNode.jsx | 2 +- .../ui/components/customNodes/OutputNode.jsx | 2 +- .../ui/components/customNodes/UnaryNode.jsx | 2 +- seankwarren/flowchart-calculator/package.json | 1 - 7 files changed, 143 insertions(+), 6 deletions(-) diff --git a/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js b/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js index e69de29b..ca4b5ed5 100644 --- a/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js +++ b/seankwarren/flowchart-calculator/cypress/e2e/app/complex_tanh_test.cy.js @@ -0,0 +1,138 @@ +/// + +describe('Complex Flow test (tanh)', () => { + beforeEach(() => { + // Visit the app's home page before each test + cy.visit('/'); + }); + + it('tests a complex flowchart', () => { + + function addNode(nodeTypeLabel, nodeIdArray) { + return cy.contains('button', nodeTypeLabel).dragAndDrop('.react-flow').then(() => { + const nodeTypes = { + 'in': 'input', + 'out': 'output', + '>': 'comparison', + '+': 'binary', + 'sin': 'unary', + } + console.log(`${nodeTypes[nodeTypeLabel]}-node`); + return cy.get(`[data-testid=${nodeTypes[nodeTypeLabel]}-node]`).then(($nodes) => { + $nodes.each((_, el) => { + const currentNodeId = el.getAttribute('data-nodeid'); + if (!nodeIdArray.includes(currentNodeId)) { + nodeIdArray.push(currentNodeId); + console.log(currentNodeId, nodeIdArray) + return false; + } + }); + }); + }); + } + + const inputNodeIds = []; + const unaryNodeIds = []; + const binaryNodeIds = []; + const outputNodeIds = []; + + // Click the clear button + cy.get('.clear').click(); + + // Place new nodes on the flowchart and update nodeId arrays + addNode('in', inputNodeIds) + .then(() => addNode('in', inputNodeIds)) + .then(() => addNode('in', inputNodeIds)) + .then(() => addNode('sin', unaryNodeIds)) + .then(() => addNode('+', binaryNodeIds)) + .then(() => addNode('+', binaryNodeIds)) + .then(() => addNode('+', binaryNodeIds)) + .then(() => addNode('+', binaryNodeIds)) + .then(() => addNode('out', outputNodeIds)) + .then(() => { + cy.get(`[data-nodeid=${unaryNodeIds[0]}] select`) + .select('e^x', { force: true }); + + cy.get(`[data-nodeid=${binaryNodeIds[0]}] select`) + .select('^', { force: true }); + + cy.get(`[data-nodeid=${binaryNodeIds[1]}] select`) + .select('-', { force: true }); + + cy.get(`[data-nodeid=${binaryNodeIds[2]}] select`) + .select('+', { force: true }); + + cy.get(`[data-nodeid=${binaryNodeIds[3]}] select`) + .select('/', { force: true }); + + // Connect the nodes + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${inputNodeIds[0]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${unaryNodeIds[0]}] .handle.target` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${unaryNodeIds[0]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[0]}] .handle.target.top` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${inputNodeIds[1]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[0]}] .handle.target.bottom` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${inputNodeIds[2]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[1]}] .handle.target.bottom` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${inputNodeIds[2]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[2]}] .handle.target.bottom` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${binaryNodeIds[0]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[1]}] .handle.target.top` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${binaryNodeIds[0]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[2]}] .handle.target.top` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${binaryNodeIds[1]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[3]}] .handle.target.top` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${binaryNodeIds[2]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${binaryNodeIds[3]}] .handle.target.bottom` + ); + + cy.connectHandles( + `.react-flow__nodes [data-nodeid=${binaryNodeIds[3]}] .handle.source`, + `.react-flow__nodes [data-nodeid=${outputNodeIds[0]}] .handle.target` + ); + + + // Set input values and check the output value + cy.get(`[data-nodeid=${inputNodeIds[0]}] input`) + .clear({ force: true }) + .type('3', { force: true }); + + cy.get(`[data-nodeid=${inputNodeIds[1]}] input`) + .clear({ force: true }) + .type('2', { force: true }); + + cy.get(`[data-nodeid=${inputNodeIds[2]}] input`) + .clear({ force: true }) + .type('1', { force: true }); + + cy.get(`[data-nodeid=${outputNodeIds[0]}]`) + .should('contain.text', '0.99505475368'); + }); + + }); +}); \ No newline at end of file diff --git a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx index e8680568..78696654 100644 --- a/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx +++ b/seankwarren/flowchart-calculator/imports/ui/components/customNodes/BinaryNode.jsx @@ -8,7 +8,7 @@ const BinaryNode = ({ id, data }) => { }; return ( -
+
{ }; return ( -
+
{ }; return ( -
+
{ return ( -
+
{ }; return ( -
+
Date: Sun, 16 Apr 2023 16:47:38 -0400 Subject: [PATCH 80/80] chore(docs): README updated --- seankwarren/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seankwarren/README.md b/seankwarren/README.md index ee7606b3..760a893a 100644 --- a/seankwarren/README.md +++ b/seankwarren/README.md @@ -102,8 +102,8 @@ Run tests with `npm run cypress:open` - [x] As a development user, I should be able to automatically test all of the binary, unary, and comparison operations using cypress. - [x] As a development user, I should be able to automatically test all basic user interactions, including toggling darkmode, __resizing the pane__, clearing the flowchart, dragging and dropping nodes, and drawing edges using cypress. - [x] As a development user, I should be able to automatically test the save and load procedure using cypress. +- [x] As a development user, I should be able to automatically test a complex flowchart like the tanh() function using cypress. ### TODO User Stories: -- [ ] As a development user, I should be able to automatically test a complex flowchart like the tanh() function using cypress. - [ ] As a development user, I should be able to automatically test that the rendered JSON is updated on change, and accurate using cypress. - [ ] As a development user, I should be able to unit test each react component and hook using jest. \ No newline at end of file